Untitled
unknown
plain_text
2 years ago
14 kB
6
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...