Untitled
unknown
plain_text
2 years ago
9.3 kB
3
Indexable
Движения.ОстаткиНоменклатуры.Записывать = Истина; Движения.Продажи.Записывать = Истина; Движения.Взаиморасчеты.Записывать = Истина; Движения.ОстаткиНоменклатуры.Записать(); // Установка блокировки данных в регистре Остатки номенклатуры по списку номенклатур табличной части Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ОстаткиНоменклатуры"); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры; ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура"); Блокировка.Заблокировать(); // Получение данных для формирования движений Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура КАК Номенклатура, | СУММА(РасходнаяНакладнаяСписокНоменклатуры.Количество) КАК Количество, | СУММА(РасходнаяНакладнаяСписокНоменклатуры.Сумма) КАК Сумма |ПОМЕСТИТЬ ВТ_ТабЧасть |ИЗ | Документ.РасходнаяНакладная.СписокНоменклатуры КАК РасходнаяНакладнаяСписокНоменклатуры |ГДЕ | РасходнаяНакладнаяСписокНоменклатуры.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура | |ИНДЕКСИРОВАТЬ ПО | Номенклатура |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ВТ_ТабЧасть.Номенклатура КАК Номенклатура, | ВТ_ТабЧасть.Номенклатура.Представление КАК НоменклатураПредставление, | ВТ_ТабЧасть.Количество КАК КоличествоВДокументе, | ВТ_ТабЧасть.Сумма КАК СуммаВДокументе, | ОстаткиНоменклатурыОстатки.Партия КАК Партия, | ОстаткиНоменклатурыОстатки.Партия.Комитент КАК Комитент, | ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток, | ЕСТЬNULL(ПроцентыКомиссииСрезПоследних.Процент, 0) КАК Процент |ИЗ | ВТ_ТабЧасть КАК ВТ_ТабЧасть | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки( | &МоментВремени, | Номенклатура В | (ВЫБРАТЬ | ВТ_ТабЧасть.Номенклатура | ИЗ | ВТ_ТабЧасть КАК ВТ_ТабЧасть)) КАК ОстаткиНоменклатурыОстатки | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПроцентыКомиссии.СрезПоследних(&МоментВремени, ) КАК ПроцентыКомиссииСрезПоследних | ПО ОстаткиНоменклатурыОстатки.Партия.Комитент = ПроцентыКомиссииСрезПоследних.Комитент | ПО ВТ_ТабЧасть.Номенклатура = ОстаткиНоменклатурыОстатки.Номенклатура | |УПОРЯДОЧИТЬ ПО | ОстаткиНоменклатурыОстатки.Партия.МоментВремени |ИТОГИ | МАКСИМУМ(КоличествоВДокументе), | МАКСИМУМ(СуммаВДокументе), | СУММА(КоличествоОстаток) |ПО | Номенклатура"; Запрос.УстановитьПараметр("Ссылка", Ссылка); Запрос.УстановитьПараметр("МоментВремени", МоментВремени()); // Обход результатов запроса, формирование движений в регистры ВыборкаНоменклатура = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаНоменклатура.Следующий() Цикл // Контроль наличия номенклатуры Превышение = ВыборкаНоменклатура.КоличествоВДокументе - ВыборкаНоменклатура.КоличествоОстаток; Если Превышение > 0 Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = СтрШаблон("Превышение остатка по номенклатуре %1 в количестве %2", ВыборкаНоменклатура.НоменклатураПредставление, Превышение); Сообщение.Сообщить(); Отказ = Истина; КонецЕсли; Если Отказ Тогда Продолжить; КонецЕсли; ОсталосьСписатьКоличество = ВыборкаНоменклатура.КоличествоВДокументе; ОсталосьСписатьПродажи = ВыборкаНоменклатура.СуммаВДокументе; //Для контроля распределения всей суммы продаж по комитентам ВыборкаДетальные = ВыборкаНоменклатура.Выбрать(); Пока ВыборкаДетальные.Следующий() И ОсталосьСписатьКоличество <> 0 Цикл // Формирование движений по регистру Остатки номенклатуры Списываем = Мин (ВыборкаДетальные.КоличествоОстаток, ОсталосьСписатьКоличество); Движение = Движения.ОстаткиНоменклатуры.ДобавитьРасход(); Движение.Период = Дата; Движение.Номенклатура = ВыборкаДетальные.Номенклатура; Движение.Партия = ВыборкаДетальные.Партия; Движение.Количество = Списываем; // Формирование движений по регистру Продажи Движение = Движения.Продажи.Добавить(); Движение.Период = Дата; Движение.Комитент = ВыборкаДетальные.Комитент; Если Списываем = ОсталосьСписатьКоличество Тогда ПродажаПоКомитенту = ОсталосьСписатьПродажи; // Если списываем последнее количество, значит списываем и остаток суммы продажи Иначе ПродажаПоКомитенту = Окр (Списываем / ВыборкаДетальные.КоличествоВДокументе * ВыборкаДетальные.СуммаВДокументе, 2); КонецЕсли; Движение.Сумма = ПродажаПоКомитенту; ОсталосьСписатьПродажи = ОсталосьСписатьПродажи - ПродажаПоКомитенту; ОсталосьСписатьКоличество = ОсталосьСписатьКоличество - Списываем; // Формирование движений по регистру Взаиморасчеты Движение = Движения.Взаиморасчеты.ДобавитьПриход(); Движение.Период = Дата; Движение.Комитент = ВыборкаДетальные.Комитент; Движение.Сумма = ПродажаПоКомитенту * ВыборкаДетальные.Процент / 100; КонецЦикла; КонецЦикла; КонецПроцедуры
Editor is loading...