Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
22 ноя 2024, 15:24

Ошибка в запросе

Автор Кобзик, 22 сен 2023, 09:45

0 Пользователей и 1 гость просматривают эту тему.

Кобзик

Максим75, не совсем понял как это реализовать, к сожалению...

Кобзик

Максим75, Переделал я код на такой вариант:

Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
СуммаДокумента = 0;

Для каждого СтрокаТЧ ИЗ Товар Цикл

СуммаДокумента = СуммаДокумента + СтрокаТЧ.Сумма;

КонецЦикла;

КонецПроцедуры




Процедура ОбработкаПроведения(Отказ, Режим)
//{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
// Данный фрагмент построен конструктором.
// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!

// регистр Продажи
Движения.Продажи.Записывать = Истина;
Для Каждого ТекСтрокаТовар Из Товар Цикл
Движение = Движения.Продажи.Добавить();
Движение.Период = Дата;
Движение.Клиент = Клиент;
Движение.Номенклатура = ТекСтрокаТовар.Товар;
Движение.Количество = ТекСтрокаТовар.Количество;
Движение.Сумма = ТекСтрокаТовар.Сумма;
КонецЦикла;

Движения.ТоварыНаСкладах.Записать();




//{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
// Данный фрагмент построен конструктором.
// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| РеализацияТоваровТовар.Количество,
| РеализацияТоваровТовар.Товар
|ПОМЕСТИТЬ ВТ_ДокТЧ
|ИЗ
| Документ.РеализацияТоваров.Товар КАК РеализацияТоваровТовар
|ГДЕ
| РеализацияТоваровТовар.Ссылка = &Ссылка
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВТ_ДокТЧ.Количество КАК Количество,
| ВТ_ДокТЧ.Товар КАК Товар,
| ТоварыНаСкладахОстатки.Партия,
| ЕСТЬNULL(ТоварыНаСкладахОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток,
| ЕСТЬNULL(ТоварыНаСкладахОстатки.СтоимостьОстаток, 0) КАК СтоимотьОстаток
|ИЗ
| ВТ_ДокТЧ КАК ВТ_ДокТЧ
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(
| &МоментВремени,
| Склад = &Склад
| И Номенклатура В
| (ВЫБРАТЬ
| ВТ_ДокТЧ.Товар
| ИЗ
| ВТ_ДокТЧ КАК ВТ_ДокТЧ)) КАК ТоварыНаСкладахОстатки
| ПО ВТ_ДокТЧ.Товар = ТоварыНаСкладахОстатки.Номенклатура
|
|УПОРЯДОЧИТЬ ПО
| ТоварыНаСкладахОстатки.Партия.Дата
|ИТОГИ
| МАКСИМУМ(Количество)
|ПО
| Товар";

Запрос.УстановитьПараметр("МоментВремени", МоментВремени());
Запрос.УстановитьПараметр("Склад", Склад);
Запрос.УстановитьПараметр("Ссылка", Ссылка);

РезультатЗапроса = Запрос.Выполнить();

ВыборкаТовар = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);

Пока ВыборкаТовар.Следующий() Цикл
// Вставить обработку выборки ВыборкаТовар
    ОсталосьСписать = ВыборкаТовар.Количество;
ВыборкаДетальныеЗаписи = ВыборкаТовар.Выбрать();

Пока ВыборкаДетальныеЗаписи.Следующий()И ОсталосьСписать > 0 Цикл
Движение = Движения.ТоварыНаСкладах.Добавить();
Движение.ВидДвижения=ВидДвиженияНакопления.Расход;
Движение.Период = Дата;
Движение.Склад = Склад;
Движение.Номенклатура = ТекСтрокаТовар.Товар;
Движение.Количество = МИН(ВыборкаДетальныеЗаписи.КоличествоОстаток,ОсталосьСписать);

Если Движение.Количество =  ВыборкаДетальныеЗаписи.КоличествоОстаток Тогда
Движение.Стоимость =  ВыборкаДетальныеЗаписи.СтоимостьОстаток;
Иначе
   Движение.Стоимость  = Движение.Количество / ВыборкаДетальныеЗаписи.КоличествоОстаток * ВыборкаДетальныеЗаписи.СтоимостьОстаток;
КонецЕсли;
Движение.Партия = ВыборкаДетальныеЗаписи.Партия;
ОсталосьСписать = ОсталосьСписать - Движение.Количество
КонецЦикла;
КонецЦикла;

//}}КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА





// регистр ТоварыНаСкладах Расход

Для Каждого ТекСтрокаТовар Из Товар Цикл
КонецЦикла;

Движения.Записать();

Если Режим = РежимПроведенияДокумента.Оперативный Тогда
  //{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
// Данный фрагмент построен конструктором.
// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ТоварыНаСкладахОстатки.Склад,
| ТоварыНаСкладахОстатки.Номенклатура,
| ТоварыНаСкладахОстатки.КоличествоОстаток
|ИЗ
| РегистрНакопления.ТоварыНаСкладах.Остатки(
| ,
| Склад = &Склад
| И Номенклатура В
| (ВЫБРАТЬ
| РеализацияТоваровТовар.Товар
| ИЗ
| Документ.РеализацияТоваров.Товар КАК РеализацияТоваровТовар
| ГДЕ
| РеализацияТоваровТовар.Ссылка = &Ссылка)) КАК ТоварыНаСкладахОстатки
|ГДЕ
| ТоварыНаСкладахОстатки.КоличествоОстаток < 0";

Запрос.УстановитьПараметр("Склад", Склад);
Запрос.УстановитьПараметр("Ссылка", Ссылка);

РезультатЗапроса = Запрос.Выполнить();



Если НЕ РезультатЗапроса.Пустой() Тогда

Отказ = Истина;

ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();

Пока ВыборкаДетальныеЗаписи.Следующий() Цикл

Сообщить ("Недостаточное количество товара " + ВыборкаДетальныеЗаписи.Номенклатура + " в количестве " + ВыборкаДетальныеЗаписи.КоличествоОстаток)

КонецЦикла;

КонецЕсли;

//}}КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА

КонецЕсли;

//}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
КонецПроцедуры

Теперь пишет, что операция сравнения на больше-меньше допустимы только для значений совпадающих примитивных типов (Булево, Число, Строка, Дата)

Путем добавления значений в табло выявил, что после вхождения во второй цикл Пока ВыборкаДетальныеЗаписи.Следующий()

значения из "Пока ВыборкаДетальныеЗаписи" как будто удаляются.

И еще тут же вопрос. Получается, этот запрос работает так, что "ВыборкаТовар" берет сгруппированный товар, который у нас в накладной. А вот строка "ВыборкаДетальныеЗаписи = ВыборкаТовар.Выбрать()" Не совсем понятно как работает. Объясни, пожалуйста

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск