Задача: для конфигурации Бухгалтерия для Украины 2.0 написать обработку заполнения табличных частей "Материалы" и "Возвратные отходы" по спецификации номенклатуры в ТЧ "Продукция"
Конфигурация: Бухгалтерия для Украины, редакция 2.0 (2.0.8.2)
В документе "Отчет производства за смену" в табличной части "Материалы" есть кнопка с командой "Заполнить", которая имеет нужный нам функционал, но не учитывает наличие в спецификации номенклатуры возвратных отходов.
Мы возьмем программный код этой команды в качестве базы и подкорректируем его поведение. В нашем случае, если в спецификации номенклатуры присутствует номенклатура со статьей затрат "100000103 Зворотні відходи", нужно поместить ее в табличную часть документа "Возвратные отходы", а не "Материалы".
Создание внешней обработки
Внесение изменений в базу не желательно, поэтому нужный нам функционал будем реализовывать в виде внешней обработки, которую мы добавим в справочник "Дополнительные отчеты и обработки". Наша конфигурация использует Библиотеку стандартных подсистем (БСП) вер. 2.2.3.29. Для начала создаем новую обработку и в модуле объекта прописываем экспортную процедуру СведенияОВнешнейОбработке(), в которой описывается вся информация про обработку для БСП:
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("1.2.1.4");
МассивНазначений = Новый Массив;
МассивНазначений.Добавить("Документ.ОтчетПроизводстваЗаСмену"); //Указываем документ к которому делаем внешнюю печ. форму
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиЗаполнениеОбъекта();
ПараметрыРегистрации.Назначение = МассивНазначений;
ПараметрыРегистрации.Наименование = "Заполнить табличные части (Отчет производства за смену)";
ПараметрыРегистрации.БезопасныйРежим = Ложь;
ПараметрыРегистрации.Версия = "1.0";
ПараметрыРегистрации.Информация = "Заполняет табличные части документа исходя из ТЧ Продукция";
НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
НоваяКоманда.Представление = "Заполнить таб. части по спецификации";
НоваяКоманда.Идентификатор = "ЗаполнитьТЧ";
НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыЗаполнениеФормы();
НоваяКоманда.ПоказыватьОповещение = Ложь;
Возврат ПараметрыРегистрации;
КонецФункции
В соответствии с документацией для назначаемых обработок типа Заполнение объекта необходимо реализовать экспортную процедуру ВыполнитьКоманду. В ней мы вызываем процедуру ЗаполнитьТЧ или, если ИдентификаторКоманды не известен, вызываем исключение.
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначения, ПараметрыВыполнения) Экспорт
Если ИдентификаторКоманды = "ЗаполнитьТЧ" Тогда
ЗаполнитьМатериалыПоСпецификацииНаСервере(ПараметрыВыполнения.ЭтаФорма);
Иначе
ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Команда ""%1"" не поддерживается обработкой ""%2""'"),
ИдентификаторКоманды,
Метаданные().Представление());
КонецЕсли;
КонецПроцедуры
Процедура ЗаполнитьМатериалыПоСпецификацииНаСервере() заимствована из модуля формы документа "Отчет производства за смену" и слегка отредактирована
Процедура ЗаполнитьМатериалыПоСпецификацииНаСервере(Форма)
Объект = Форма.Объект;
Объект.Материалы.Очистить();
ЗаполнитьМатериалыПоПродукцииУслугам(Объект);
ПлательщикНДС = УчетнаяПолитика.ПлательщикНДС(Объект.Организация, Объект.Дата);
ПараметрыОбъекта = Новый Структура("Дата, Организация, Склад, СчетЗатрат, ПлательщикНДС", Объект.Дата, Объект.Организация, Объект.Склад, Объект.СчетЗатрат, ПлательщикНДС);
Для Каждого СтрокаТаблицы Из Объект.Материалы Цикл
ЗаполнитьДобавленныеКолонкиСтрокиМатериалы(СтрокаТаблицы, ПараметрыОбъекта);
КонецЦикла;
КонецПроцедуры
Процедура ЗаполнитьМатериалыПоПродукцииУслугам() из модуля менеджера документа получает таблицу материалов и заполняет ТЧ "Материалы". Изменяем: исходя из статьи затрат делаем вывод о том, принадлежит ли номенклатура к материалам или к возвратным отходам. И, в зависимости от результата, добавляем строку в соответствующую ТЧ документа.
// Документ.ОтчетПроизводстваЗаСмену.МодульМенеджера
Процедура ЗаполнитьМатериалыПоПродукцииУслугам(Объект) Экспорт
Материалы = Объект.Материалы;
Продукция = Объект.Продукция.Выгрузить();
Услуги = Объект.Услуги.Выгрузить();
Организация = Объект.Организация;
Склад = Объект.Склад;
//.....
ТаблицаМатериалов = Запрос.Выполнить().Выгрузить();
СоответствиеСчетовУчета = БухгалтерскийУчетПереопределяемый.ПолучитьСчетаУчетаСпискаНоменклатуры(
Объект.Организация,
ОбщегоНазначения.ВыгрузитьКолонку(ТаблицаМатериалов, "Номенклатура", Истина),
Объект.Склад);
Для Каждого СтрокаТаблицы Из ТаблицаМатериалов Цикл
Если СтрокаТаблицы.СтатьяЗатрат.Код = "100000103" Тогда //Возвратные отходы
НоваяСтрока = Объект.ВозвратныеОтходы.Добавить();
Иначе
НоваяСтрока = Материалы.Добавить();
КонецЕсли;
ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаТаблицы);
СчетаУчета = СоответствиеСчетовУчета.Получить(НоваяСтрока.Номенклатура);
//Попытка нужна чтобы не проверять тип ТЧ. В ТЧ "Материалы" есть реквизит НалоговоеНазначение,
//а в ТЧ "Возвратные отходы" нет
Попытка
Если СчетаУчета <> Неопределено Тогда
НоваяСтрока.Счет = СчетаУчета.СчетУчетаБУ;
НоваяСтрока.НалоговоеНазначение = СчетаУчета.НалоговоеНазначение;
НоваяСтрока.НалоговоеНазначениеДоходовИЗатрат = СчетаУчета.НалоговоеНазначениеДоходовИЗатрат;
КонецЕсли;
Исключение
//ОписаниеОшибки()
КонецПопытки;
КонецЦикла;
Проверка результата
После регистрации нашей внешней обработки, в документе "Отчет производства за смену" в подменю "Еще" появилась команда "Заполнить" -> "Заполнить таб. части по спецификации", которая функционирует так как нам нужно.