Внешняя обработка вида "Заполнение объекта" для документа "Отчет производства за смену"

Задача: для конфигурации Бухгалтерия для Украины 2.0 написать обработку заполнения табличных частей "Материалы" и "Возвратные отходы" по спецификации номенклатуры в ТЧ "Продукция"

Конфигурация: Бухгалтерия для Украины, редакция 2.0 (2.0.8.2) 

В документе "Отчет производства за смену" в табличной части "Материалы" есть кнопка с командой "Заполнить", которая имеет нужный нам функционал, но не учитывает наличие в спецификации номенклатуры возвратных отходов.

Кнопка заполнения табличной части "Материалы"

Мы возьмем программный код этой команды в качестве базы и подкорректируем его поведение. В нашем случае, если в спецификации номенклатуры присутствует номенклатура со статьей затрат "100000103 Зворотні відходи", нужно поместить ее в табличную часть документа "Возвратные отходы", а не "Материалы".

Создание внешней обработки

Внесение изменений в базу не желательно, поэтому нужный нам функционал будем реализовывать в виде внешней обработки, которую мы добавим в справочник "Дополнительные отчеты и обработки".  Наша конфигурация использует Библиотеку стандартных подсистем (БСП) вер. 2.2.3.29. Для начала создаем новую обработку и в модуле объекта прописываем экспортную процедуру СведенияОВнешнейОбработке(), в которой описывается вся информация про обработку для БСП:

Функция СведенияОВнешнейОбработке() Экспорт
	
	ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("1.2.1.4");
	
    МассивНазначений = Новый Массив;
    МассивНазначений.Добавить("Документ.ОтчетПроизводстваЗаСмену"); //Указываем документ к которому делаем внешнюю печ. форму
	
	ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиЗаполнениеОбъекта();
	ПараметрыРегистрации.Назначение = МассивНазначений;
	ПараметрыРегистрации.Наименование = "Заполнить табличные части (Отчет производства за смену)";
	ПараметрыРегистрации.БезопасныйРежим = Ложь;
	ПараметрыРегистрации.Версия = "1.0";
	ПараметрыРегистрации.Информация = "Заполняет табличные части документа исходя из ТЧ Продукция";
	
	НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
	НоваяКоманда.Представление = "Заполнить таб. части по спецификации";
	НоваяКоманда.Идентификатор = "ЗаполнитьТЧ";
	НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыЗаполнениеФормы();
	НоваяКоманда.ПоказыватьОповещение = Ложь;
		
	Возврат ПараметрыРегистрации;
	
КонецФункции 

В соответствии с документацией для назначаемых обработок типа Заполнение объекта необходимо реализовать экспортную процедуру ВыполнитьКоманду. В ней мы вызываем процедуру ЗаполнитьТЧ или, если ИдентификаторКоманды не известен, вызываем исключение.

Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначения, ПараметрыВыполнения) Экспорт
	
	Если ИдентификаторКоманды = "ЗаполнитьТЧ" Тогда
		ЗаполнитьМатериалыПоСпецификацииНаСервере(ПараметрыВыполнения.ЭтаФорма);
	Иначе
		ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Команда ""%1"" не поддерживается обработкой ""%2""'"),
			ИдентификаторКоманды,
			Метаданные().Представление());
	КонецЕсли;
КонецПроцедуры

Процедура ЗаполнитьМатериалыПоСпецификацииНаСервере() заимствована из модуля формы документа "Отчет производства за смену" и слегка отредактирована

Процедура ЗаполнитьМатериалыПоСпецификацииНаСервере(Форма)
	Объект = Форма.Объект;

	Объект.Материалы.Очистить();
	ЗаполнитьМатериалыПоПродукцииУслугам(Объект);
		
	ПлательщикНДС = УчетнаяПолитика.ПлательщикНДС(Объект.Организация, Объект.Дата);
	ПараметрыОбъекта = Новый Структура("Дата, Организация, Склад, СчетЗатрат, ПлательщикНДС", Объект.Дата, Объект.Организация, Объект.Склад, Объект.СчетЗатрат, ПлательщикНДС);		
		
	Для Каждого СтрокаТаблицы Из Объект.Материалы Цикл
		ЗаполнитьДобавленныеКолонкиСтрокиМатериалы(СтрокаТаблицы, ПараметрыОбъекта);
	КонецЦикла;	
	
КонецПроцедуры

Процедура ЗаполнитьМатериалыПоПродукцииУслугам() из модуля менеджера документа получает таблицу материалов и заполняет ТЧ "Материалы". Изменяем: исходя из статьи затрат делаем вывод о том, принадлежит ли номенклатура к материалам или к возвратным отходам. И, в зависимости от результата, добавляем строку в соответствующую ТЧ документа.

// Документ.ОтчетПроизводстваЗаСмену.МодульМенеджера
Процедура ЗаполнитьМатериалыПоПродукцииУслугам(Объект) Экспорт
	
	Материалы 	=	Объект.Материалы;
	Продукция	=	Объект.Продукция.Выгрузить();
	Услуги		=	Объект.Услуги.Выгрузить();
	Организация	=	Объект.Организация;
	Склад		=	Объект.Склад;

//.....

	ТаблицаМатериалов = Запрос.Выполнить().Выгрузить();
	
	СоответствиеСчетовУчета = БухгалтерскийУчетПереопределяемый.ПолучитьСчетаУчетаСпискаНоменклатуры(
		Объект.Организация,
		ОбщегоНазначения.ВыгрузитьКолонку(ТаблицаМатериалов, "Номенклатура", Истина),
		Объект.Склад);
	
	Для Каждого СтрокаТаблицы Из ТаблицаМатериалов Цикл
		
		Если СтрокаТаблицы.СтатьяЗатрат.Код = "100000103" Тогда //Возвратные отходы
			НоваяСтрока = Объект.ВозвратныеОтходы.Добавить();
		Иначе
			НоваяСтрока = Материалы.Добавить();
		КонецЕсли; 
		ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаТаблицы);
		
		СчетаУчета	= СоответствиеСчетовУчета.Получить(НоваяСтрока.Номенклатура);
        //Попытка нужна чтобы не проверять тип ТЧ. В ТЧ "Материалы" есть реквизит НалоговоеНазначение,
        //а в ТЧ "Возвратные отходы" нет
		Попытка
			Если СчетаУчета <> Неопределено Тогда
				НоваяСтрока.Счет = СчетаУчета.СчетУчетаБУ;
				НоваяСтрока.НалоговоеНазначение = СчетаУчета.НалоговоеНазначение;
				НоваяСтрока.НалоговоеНазначениеДоходовИЗатрат = СчетаУчета.НалоговоеНазначениеДоходовИЗатрат;
			КонецЕсли;
		Исключение
		    //ОписаниеОшибки()
		КонецПопытки;
		
	КонецЦикла;

Проверка результата

После регистрации нашей внешней обработки, в документе "Отчет производства за смену" в подменю "Еще" появилась команда "Заполнить" -> "Заполнить таб. части по спецификации", которая функционирует так как нам нужно.

Новая команда, которая вызывает подключение внешней обработки


Похожие материалы

Комментарии