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