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