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