«Продвинутые» доработки в Контуре БП

Клиенту с комиссионной торговлей понадобилось сделать две продвинутые доработки.

Подключаемый модуль делал через расширение, потому что почему-то если его делать в файле, он не загружается с клиентской машины, его надо размещать в каталоге, доступном (расшаренном) с сервера.

Обнаружил, что все функции из документации подключаемого модуля доступны для перехвата в функции ОбработатьСобытие подключаемого модуля:

Функция ОбработатьСобытие(ИмяСобытия, Параметры) Экспорт

	Если ИмяСобытия = "ПолучитьТаблицуИспользуемыхПакетов" Тогда

		Возврат ПолучитьТаблицуИспользуемыхПакетов(Параметры);    
		
	ИначеЕсли ИмяСобытия = "ПослеОбновленияСпискаДокументов" Тогда
		
		Возврат ПослеОбновленияСпискаДокументов(Параметры);    
		
	ИначеЕсли ИмяСобытия = "ПолучитьТекстЗапросаДляСпискаПакетовНаОтправкуПоМассивуВидовПакетов" Тогда
		
		Возврат ПолучитьТекстЗапросаДляСпискаПакетовНаОтправкуПоМассивуВидовПакетов(Параметры);

	ИначеЕсли ИмяСобытия = "ПодготовитьПакет" Тогда

		Возврат ПодготовитьПакет(Параметры);

	ИначеЕсли ИмяСобытия = "ПослеПодготовкиПакета" Тогда

		Возврат ПослеПодготовкиПакета(Параметры);

	КонецЕсли;

КонецФункции

Удаление лишней счет-фактуры из списка документов

Я не понял, как подменить текст запроса в функции ПолучитьТекстЗапросаДляСпискаПакетовНаОтправкуПоМассивуВидовПакетов, но может оно и к лучшему, т.к. я просто удаляю ненужные документы в функции ПослеОбновленияСпискаДокументов:

Функция ПослеОбновленияСпискаДокументов(Параметры) Экспорт
	//После получения списка документов
	
	//Тут можно убрать ненужные документы
	Если ТипЗнч(Параметры) = Тип("Структура") И Параметры.Свойство("СписокДокументов") Тогда
		//Колонки:
		//НомерСтроки	ТребуемоеДействие	Документ	
		//НомерДокумента	ДатаДокумента	Организация	Контрагент	ДокументЭДО	СуммаДокумента	
		//ИмяКартинки	Архивный	ВидПакета	Пакет	Статус	ВидЭлДокумента	
		//Видимость	ТипДокумента	ТипКонтента	ФункцияДокумента	Направление	ВидПакетаID	ВидЭлДокументаID	
		//Метка	ДействиеВДД	ДействиеВ1С	ДопРеквизит1	ДопРеквизит2	ДопРеквизит3	ДопРеквизит4	ДопРеквизит5	
		//ОшибкиПроверкиТекст	ДатаПолучения	ДатаОтправки	ДополнительныйСтатус	Подразделение	
		//АнализПроведен	СодержимоеПакета	НомераДокументовПакета	ДатыДокументовПакета	
		//СуммыДокументовПакета	ОшибкиПроверкиТекстПакета	КоличествоДокументовПакета	
		//ЗаблокированныйПакет	ТребуетсяРасшифровка	ПредставлениеДокументаДиадок	ИмяФайла	ДанныеДокумента	
		//Шаблон	BoxId	LetterId	DocumentId	ИндексИконкиПакета	Флажок	ВнешнийСтатус	
		//Ключ	КлючОсновногоПакета	СтатусМЧД	СтатусМЧДКритичность	ОбъектМаршрутизации	
		//СтатусПКФНС	СтатусПКФНСКритичность	ПредставлениеКонтрагентаЭДО	ПодразделениеОтправитель	
		//ПодразделениеПолучатель
		
		СписокДокументов = Параметры.СписокДокументов;
		ТЗДОкументы = Параметры.СписокДокументов.Выгрузить(, "НомерСтроки, Документ");       
		
		З = Новый Запрос();
		З.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц();
		З.УстановитьПараметр("ТЗДокументы", ТЗДОкументы);
		З.Текст = 
		"ВЫБРАТЬ
		|	ТЗДокументы.НомерСтроки КАК НомерСтроки,
		|	ТЗДокументы.ДОкумент КАК ДОкумент
		|ПОМЕСТИТЬ ТЗДокументы
		|ИЗ
		|	&ТЗДокументы КАК ТЗДокументы";   
		З.Выполнить();   
		
		//Отбираем по полю СуммаДокументаКомиссия = 0, но можно и по полю Продавец - не заполнено
		З.Текст = 
		"ВЫБРАТЬ
		|	ТЗДокументы.НомерСтроки КАК НомерСтроки,
		|	ТЗДокументы.ДОкумент КАК ДОкумент,
		|	ВЫБОР
		|		КОГДА ТЗДокументы.ДОкумент.ДокументОснование ССЫЛКА Документ.ОтчетКомитентуОПродажах
		|				И ТЗДокументы.ДОкумент.СуммаДокументаКомиссия <> 0
		|			ТОГДА ИСТИНА
		|		ИНАЧЕ ЛОЖЬ
		|	КОНЕЦ КАК Удалить
		|ИЗ
		|	ТЗДокументы КАК ТЗДокументы
		|
		|УПОРЯДОЧИТЬ ПО
		|	НомерСтроки УБЫВ";      
		
		ТЗДОкументы = З.Выполнить().Выгрузить();
		
		//Удаляем задом наперед
		Для Каждого Строка ИЗ ТЗДОкументы Цикл
			Если Строка.Удалить = Истина Тогда
				СписокДокументов.Удалить(Строка.НомерСтроки - 1);
			КонецЕсли;
		КонецЦикла;
		
		
	КонецЕсли;
	
	Возврат Истина; //Возвращать истина
КонецФункции

Создал два тестовых документа по контрагенту к отчету комитента — на сам отчет и на сумму вознаграждения.

Убрал документ по самому отчету комитента, оставил счет-фактуру на вознаграждение:

Автоматическое включение в пакет печатных форм

Нашел готовый пример тут. Но пришлось его несколько доработать.

Суть в том, что нужно в подготовке пакета описать состав пакета, а в подготовке электронного документа уже вложить файл.

Я пошел по схеме автора примера, можно было в подготовке пакета не получать файл печатной формы, а получать ее уже только при подготовке электронного документа.

Типовые печатные формы документов формирую по отработанной у меня методике.

Столкнулся также с проблемой, что подготовка пакета вызывается и при формировании списка документов, пришлось повозиться, чтобы найти, в чем разница:

	//Если это вызов из списка документов, пропускаем. Определить это можно только так. ЭТО БЫЛО СЛОЖНО РАЗЛИЧИТЬ
	Если Параметры.Пакет.СлужебнаяИнформация.ПараметрыОтправки.ЗаполнитьДокументыБезКонтента = Истина Тогда
		Возврат Неопределено;
	КонецЕсли;

Если не добавлять файл в электронный документ, он будет выглядеть так:

Я добавил две печатные формы, получил такой пакет документов, с нормальным предварительным просмотром печатных форм:

Расширения должны быть именно pdf. Возможно, можно изменить представление файла, но я не стал работать в этом направлении.

Счет-фактуру в печатном виде включаю именно не на вознаграждение, а на весь отчет комитенту.

Интересно, в 1С-ЭДО возможны такие доработки как в Контуре? Сильно сомневаюсь, что там все так же просто…

Итоговый код подключаемого модуля выглядит таким образом:


Перем ОсновнойМодуль Экспорт;

#Область СобытияКонтура

Функция ОбработатьСобытие(ИмяСобытия, Параметры) Экспорт

	Если ИмяСобытия = "ПослеОбновленияСпискаДокументов" Тогда
		
		Возврат ПослеОбновленияСпискаДокументов(Параметры);    
		
	ИначеЕсли ИмяСобытия = "ПодготовитьПакет" Тогда

		Возврат ПодготовитьПакет(Параметры);

	ИначеЕсли ИмяСобытия = "ПодготовитьЭлектронныйДокумент" Тогда

		Возврат ПодготовитьЭлектронныйДокумент(Параметры);

	ИначеЕсли ИмяСобытия = "ПолучитьТаблицуИспользуемыхВидовДокументов" Тогда
		
		Результат = ПолучитьТаблицуИспользуемыхВидовДокументов(Параметры);   
		
	КонецЕсли;

КонецФункции

Функция ПослеОбновленияСпискаДокументов(Параметры) Экспорт
	//После получения списка документов
	
	//Тут можно убрать ненужные документы
	Если ТипЗнч(Параметры) = Тип("Структура") И Параметры.Свойство("СписокДокументов") Тогда
		//Колонки:
		//НомерСтроки	ТребуемоеДействие	Документ	
		//НомерДокумента	ДатаДокумента	Организация	Контрагент	ДокументЭДО	СуммаДокумента	
		//ИмяКартинки	Архивный	ВидПакета	Пакет	Статус	ВидЭлДокумента	
		//Видимость	ТипДокумента	ТипКонтента	ФункцияДокумента	Направление	ВидПакетаID	ВидЭлДокументаID	
		//Метка	ДействиеВДД	ДействиеВ1С	ДопРеквизит1	ДопРеквизит2	ДопРеквизит3	ДопРеквизит4	ДопРеквизит5	
		//ОшибкиПроверкиТекст	ДатаПолучения	ДатаОтправки	ДополнительныйСтатус	Подразделение	
		//АнализПроведен	СодержимоеПакета	НомераДокументовПакета	ДатыДокументовПакета	
		//СуммыДокументовПакета	ОшибкиПроверкиТекстПакета	КоличествоДокументовПакета	
		//ЗаблокированныйПакет	ТребуетсяРасшифровка	ПредставлениеДокументаДиадок	ИмяФайла	ДанныеДокумента	
		//Шаблон	BoxId	LetterId	DocumentId	ИндексИконкиПакета	Флажок	ВнешнийСтатус	
		//Ключ	КлючОсновногоПакета	СтатусМЧД	СтатусМЧДКритичность	ОбъектМаршрутизации	
		//СтатусПКФНС	СтатусПКФНСКритичность	ПредставлениеКонтрагентаЭДО	ПодразделениеОтправитель	
		//ПодразделениеПолучатель
		
		СписокДокументов = Параметры.СписокДокументов;
		ТЗДОкументы = Параметры.СписокДокументов.Выгрузить(, "НомерСтроки, Документ");       
		
		З = Новый Запрос();
		З.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц();
		З.УстановитьПараметр("ТЗДокументы", ТЗДОкументы);
		З.Текст = 
		"ВЫБРАТЬ
		|	ТЗДокументы.НомерСтроки КАК НомерСтроки,
		|	ТЗДокументы.ДОкумент КАК ДОкумент
		|ПОМЕСТИТЬ ТЗДокументы
		|ИЗ
		|	&ТЗДокументы КАК ТЗДокументы";   
		З.Выполнить();   
		
		//Отбираем по полю СуммаДокументаКомиссия = 0, но можно и по полю Продавец - не заполнено
		З.Текст = 
		"ВЫБРАТЬ
		|	ТЗДокументы.НомерСтроки КАК НомерСтроки,
		|	ТЗДокументы.ДОкумент КАК ДОкумент,
		|	ВЫБОР
		|		КОГДА ТЗДокументы.ДОкумент.ДокументОснование ССЫЛКА Документ.ОтчетКомитентуОПродажах
		|				И ТЗДокументы.ДОкумент.СуммаДокументаКомиссия <> 0
		|			ТОГДА ИСТИНА
		|		ИНАЧЕ ЛОЖЬ
		|	КОНЕЦ КАК Удалить
		|ИЗ
		|	ТЗДокументы КАК ТЗДокументы
		|
		|УПОРЯДОЧИТЬ ПО
		|	НомерСтроки УБЫВ";      
		
		ТЗДОкументы = З.Выполнить().Выгрузить();
		
		//Удаляем задом наперед
		Для Каждого Строка ИЗ ТЗДОкументы Цикл
			Если Строка.Удалить = Истина Тогда
				СписокДокументов.Удалить(Строка.НомерСтроки - 1);
			КонецЕсли;
		КонецЦикла;
		
		
	КонецЕсли;
	
	Возврат Истина; //Возвращать истина
КонецФункции

Функция ПодготовитьПакет(Параметры)     
	

	Если ОбработчикиСобытий_ЭтоВызовПередТиповымОбработчиком(Параметры) Тогда
		Возврат Неопределено;
	КонецЕсли;
	
	Если НЕ ТребуетсяДобавлениеНеформализованныхДокументовПоКомитенту(Параметры) Тогда
		Возврат Неопределено;
	КонецЕсли;
	
	ТекущийПакет = Параметры.Пакет;
	Документ1С = Параметры.Пакет.ДокументУчета;      
	
	//Если это вызов из списка документов, пропускаем. Определить это можно только так. ЭТО БЫЛО СЛОЖНО РАЗЛИЧИТЬ
	Если Параметры.Пакет.СлужебнаяИнформация.ПараметрыОтправки.ЗаполнитьДокументыБезКонтента = Истина Тогда
		Возврат Неопределено;
	КонецЕсли;                

	ДокументОтчетКомитенту = Документ1С.ДокументОснование;

	//Находим счет-фактуру именно к отчету комитента, не на вознаграждение
	СчетФактураКОтчетуКомитента = НайтиСчетФактуруКОтчетуКомитента(ДокументОтчетКомитенту);
	Если Не ЗначениеЗаполнено(СчетФактураКОтчетуКомитента) Тогда
		ОписаниеОшибки = "Не заполнена счет-фактура к отчету комитента: " + СчетФактураКОтчетуКомитента;
		Сообщить(ОписаниеОшибки, СтатусСообщения.Важное);
		ВызватьИсключение ОписаниеОшибки;
	КонецЕсли;
	
	//Добавляем в пакет печатную форму счет-фактуры именно к отчету комитента, не на вознаграждение
	ДанныеПечатнойФормы = СформироватьВстроеннуюПечатнуюФормуДокумента(СчетФактураКОтчетуКомитента, "Счет-фактура.pdf");
	Пакеты_ДобавитьПриложение(ТекущийПакет, ДанныеПечатнойФормы, СчетФактураКОтчетуКомитента, ВидДокументаПечатнаяФормаСчетФактурыОтчетаКомитенту());                    

	//Добавляем в пакет печатную форму отчета комитента
	ДанныеПечатнойФормы = СформироватьВстроеннуюПечатнуюФормуДокумента(ДокументОтчетКомитенту, "Отчет комитенту.pdf");
	Пакеты_ДобавитьПриложение(ТекущийПакет, ДанныеПечатнойФормы, ДокументОтчетКомитенту, ВидДокументаПечатнаяФормаОтчетаКомитента());                    
	
КонецФункции


Функция ПодготовитьЭлектронныйДокумент(Параметры)

	Если ОбработчикиСобытий_ЭтоВызовПередТиповымОбработчиком(Параметры) Тогда
		Возврат Неопределено;
	КонецЕсли;
	
	Если ТипЗнч(Параметры) = Тип("Структура") И Параметры.Свойство("ВидДокументаРазвернутый") И НЕ
		(Параметры.ВидДокументаРазвернутый.ID = ВидДокументаПечатнаяФормаСчетФактурыОтчетаКомитенту() ИЛИ 
		Параметры.ВидДокументаРазвернутый.ID = ВидДокументаПечатнаяФормаОтчетаКомитента()
		) Тогда
		Возврат Неопределено;
	КонецЕсли;
	
	Документ1С = Параметры.Результат.Документ1С;   
	ДопПараметры = Параметры.ДополнительныеПараметры;
	ЭлектронныйДокумент = Параметры.Результат;   
	ВидДокумента = Параметры.ВидДокументаРазвернутый.ID;
	
	Если ВидДокумента = ВидДокументаПечатнаяФормаСчетФактурыОтчетаКомитенту() ИЛИ
		ВидДокумента = ВидДокументаПечатнаяФормаОтчетаКомитента()  Тогда    
		
		РеквизитыДокумента = Неопределено;
		ИмяФайла = ДопПараметры.ИмяФайла;
		Файл = ПолучитьИзВременногоХранилища(ДопПараметры.АдресФайла);
		
		Документы_ПодготовитьНеформализованныйДокумент(
		ЭлектронныйДокумент,
		Файл,
		ИмяФайла,
		РеквизитыДокумента
		);
		
		ЭлектронныйДокумент.ЗапрашиватьОтветнуюПодпись = Ложь;

	КонецЕсли;


КонецФункции

Функция ПолучитьТаблицуИспользуемыхВидовДокументов(ПараметрыСобытия)
	
	Если ОбработчикиСобытий_ЭтоВызовПередТиповымОбработчиком(ПараметрыСобытия) Тогда
		Возврат Неопределено;
	КонецЕсли;
	
	ВидыДокументов = ПараметрыСобытия.Результат_ИМ;
	
	ВидыДокументов_ДобавитьНеформализованный(
		ВидыДокументов,
		ВидДокументаПечатнаяФормаСчетФактурыОтчетаКомитенту(),
		"Счет-фактура"
	);
	
	ВидыДокументов_ДобавитьНеформализованный(
		ВидыДокументов,
		ВидДокументаПечатнаяФормаОтчетаКомитента(),
		"Отчет комитенту"
	);
	
	Возврат ВидыДокументов;
	
КонецФункции

#КонецОбласти


#Область ВспомогательныеФункции                                                            

Функция НайтиСчетФактуруКОтчетуКомитента(ДокументОтчетКомитенту) Экспорт
	З = Новый Запрос(
	"ВЫБРАТЬ
	|	СчетФактураВыданный.Ссылка КАК Ссылка
	|ИЗ
	|	Документ.СчетФактураВыданный КАК СчетФактураВыданный
	|ГДЕ
	|	СчетФактураВыданный.Проведен 
	|	И СчетФактураВыданный.ДокументОснование = &ДокументОснование
	|	И СчетФактураВыданный.СуммаДокументаКомиссия <> 0 ");
	З.УстановитьПараметр("ДокументОснование", ДокументОтчетКомитенту);
	Выборка = з.Выполнить().Выбрать();
	Если Выборка.Следующий() Тогда
		Возврат Выборка.Ссылка;
	КонецЕсли;
КонецФункции

Процедура Документы_ПодготовитьНеформализованныйДокумент(ЭлектронныйДокумент, Файл, ИмяФайла, РеквизитыДокумента)
	
	ЭлектронныйДокумент.ИмяФайла = ИмяФайла;
	ЭлектронныйДокумент.ДвоичныеДанные = Файл;
	ЭлектронныйДокумент.Метаданные.FileName = ИмяФайла;
	
	Если Не ЗначениеЗаполнено(РеквизитыДокумента) Тогда
		Возврат;
	КонецЕсли;
	
	ЭлектронныйДокумент.Метаданные.DocumentDate = РеквизитыДокумента.Дата;
	ЭлектронныйДокумент.Метаданные.DocumentNumber = РеквизитыДокумента.Номер;
	
	Если ЭлектронныйДокумент.Метаданные.Свойство("TotalSum") Тогда
		ЭлектронныйДокумент.Метаданные.TotalSum = РеквизитыДокумента.Сумма;
	КонецЕсли;
	
	Если ЭлектронныйДокумент.Метаданные.Свойство("TotalVat") Тогда
		ЭлектронныйДокумент.Метаданные.TotalVat = РеквизитыДокумента.СуммаНДС;
	КонецЕсли;
	
КонецПроцедуры

Функция ТребуетсяДобавлениеНеформализованныхДокументовПоКомитенту(Параметры)
	
	//Можем заходить в функцию и из формирования пакета и из формирования электронного документа         
	Если ТипЗнч(Параметры) = Тип("Структура") И
		(Параметры.Свойство("ВидДокументаРазвернутый") И
		Параметры.ВидДокументаРазвернутый.ID = "ID_УПД" ИЛИ 	
		Параметры.Свойство("ВидПакетаРазвернутый") И
		Параметры.ВидПакетаРазвернутый.ID = "ID_УПД"         
		)
		Тогда	
		
		Если Параметры.Свойство("Пакет") Тогда
			Документ1С = Параметры.Пакет.ДокументУчета;
		ИначеЕсли Параметры.Свойство("Результат") Тогда
			Документ1С = Параметры.Результат.Документ1С;
		КонецЕсли;
		
		//Если это СФ на вознаграждение по комиссии
		Если ТипЗнч(Документ1С) = Тип("ДокументСсылка.СчетФактураВыданный") И 
			ТипЗнч(Документ1С.ДокументОснование) = Тип("ДокументСсылка.ОтчетКомитентуОПродажах")
			И Документ1С.СуммаДокументаКомиссия = 0 
			Тогда
			Возврат Истина;
		КонецЕсли;
	КонецЕсли;
	
	Возврат ложь; 
	
КонецФункции



Функция ВидДокументаПечатнаяФормаСчетФактурыОтчетаКомитенту()
	
	Возврат "ID_ПЕЧСФКОМИТЕНТУ";
	
КонецФункции

// Идентификатор вида документа для приложений.
// 
// Возвращаемое значение:
//  Строка.
//
Функция ВидДокументаПечатнаяФормаОтчетаКомитента()
	
	Возврат "ID_ПЕЧОТЧЕТКОМИТЕНТУ";
	
КонецФункции

Процедура ВидыДокументов_ДобавитьНеформализованный(ВидыДокументов, Идентификатор, Представление, ТипДокументаAPI = "Nonformalized")
	
	//Добавляем в используемые виды документов не формализованный документ нашего вида
	
	ТипКонтентаAPI = "";
	
	ОсновнойМодуль.ЭДО_Служебные_ДобавитьСтрокуВТаблицуЗначений(
		ВидыДокументов,
		Идентификатор,
		Представление,
		ТипДокументаAPI,
		ТипКонтентаAPI
	);
	
КонецПроцедуры        


Процедура Пакеты_ДобавитьПриложение(Пакет, ДанныеФайла, УчетныйДокумент, ВидЭлектронногоДокумента)
	
	//ДанныеФайла = РаботаСФайлами.ДанныеФайла(ПрисоединенныйФайл);
	
	ПараметрыОтправкиФайла = Новый Структура;
	ПараметрыОтправкиФайла.Вставить("АдресФайла", ДанныеФайла.АдресФайла);
	ПараметрыОтправкиФайла.Вставить("ИмяФайла", ДанныеФайла.ИмяФайла);
	
	//ВидЭлектронногоДокумента = ВидДокументаПриложение();
	//УчетныйДокумент = ДанныеФайла.Владелец;
	
	ОсновнойМодуль.ЭДО_ДокументМенеджер_ПодготовитьИДобавитьДокументВПакет(
		Пакет,
		УчетныйДокумент,
		ВидЭлектронногоДокумента,
		ПараметрыОтправкиФайла
	);
	
КонецПроцедуры

Функция СформироватьВстроеннуюПечатнуюФормуДокумента(ТекДокумент, ИмяФайла) Экспорт
	//ДанныеПечатнойФормы = СформироватьВнешнююПечатнуюФорму(Документ1С, ВПФ, "");
	//Параметры.Результат.ДвоичныеДанные = Новый ДвоичныеДанные(ДанныеПечатнойФормы.ИмяВременногоФайла);
	//Параметры.Результат.ЗапрашиватьОтветнуюПодпись = Истина;
	//Параметры.Результат.Метаданные.FileName	= ДанныеПечатнойФормы.ИмяФайла;
	//Параметры.Результат.Метаданные.DocumentNumber	= Документ1С.Номер;
	//Параметры.Результат.Метаданные.DocumentDate	= Документ1С.Дата;
	
	ТД = ПолучитьПечатнуюФормуДокумента(ТекДокумент);
	ВФ = ПолучитьИмяВременногоФайла(".pdf");
	ТД.Записать(ВФ, ТипФайлаТабличногоДокумента.PDF);       
	ДД = Новый ДвоичныеДанные(ВФ);            
	АдресФайла = ПоместитьВоВременноеХранилище(ДД);
	
	ДанныеПечатнойФормы = Новый Структура();
	ДанныеПечатнойФормы.Вставить("ИмяВременногоФайла", ВФ);
	ДанныеПечатнойФормы.Вставить("ИмяФайла", ИмяФайла);
	ДанныеПечатнойФормы.Вставить("АдресФайла", АдресФайла);
	
	
	Возврат ДанныеПечатнойФормы;
	
КонецФункции   

Функция ПолучитьПечатнуюФормуДокумента(ТекДокумент) Экспорт  
	//https://geniy1s.ru/programmno-poluchit-pechatnuyu-formu-dokumenta/
    МД = Метаданные.НайтиПоТипу(ТипЗнч(ТекДокумент));
    ТекВид = МД.Имя;

    МассивОбъектов = Новый Массив();
    МассивОбъектов.Добавить(ТекДокумент);
    ПараметрыПечати = Новый Структура(); //"ДополнитьКомплектВнешнимиПечатнымиФормами" = ложь
    ДопустимыеТипыОбъектовПечати = Неопределено;

    Если ТекВид = "СчетНаОплатуПокупателю" Тогда
        ИмяМенеджераПечати = "Обработка.ПечатьСчетаНаОплату";
        ИменаМакетов = "СчетЗаказ";
    ИначеЕсли ТекВид = "АктСверкиВзаиморасчетов" Тогда
        ИмяМенеджераПечати = "Документ.АктСверкиВзаиморасчетов";
        ИменаМакетов = "АктСверки";
    ИначеЕсли ТекВид = "РеализацияТоваровУслуг" Тогда
        ИмяМенеджераПечати = "Документ.РеализацияТоваровУслуг";
        ИменаМакетов = "Накладная";
    ИначеЕсли ТекВид = "СчетФактураВыданный" Тогда
        ИмяМенеджераПечати = "Документ.СчетФактураВыданный";
        ИменаМакетов = "СчетФактура1096"; //Тут определил отладчиком
    ИначеЕсли ТекВид = "ОтчетКомитентуОПродажах" Тогда
        ИмяМенеджераПечати = "Документ.ОтчетКомитентуОПродажах";
        ИменаМакетов = "ОтчетКомитентуОПродажах"; //В менеджере документа можно посмотреть в процедуре Печать какие есть макеты
    Иначе
        Возврат Неопределено;
    КонецЕсли;

    ПечатныеФормы = УправлениеПечатью.СформироватьПечатныеФормы(ИмяМенеджераПечати, ИменаМакетов, МассивОбъектов, ПараметрыПечати, ДопустимыеТипыОбъектовПечати);

    Возврат ПечатныеФормы.КоллекцияПечатныхФорм[0].ТабличныйДокумент;
КонецФункции

Функция ОбработчикиСобытий_ЭтоВызовПослеТиповогоОбработчика(ПараметрыСобытия)
	
	Результат = Ложь;
	
	Если ТипЗнч(ПараметрыСобытия) = Тип("Структура") Тогда
		Результат = ПараметрыСобытия.Свойство("Результат_ИМ");
	КонецЕсли;
	
	Возврат Результат;
	
КонецФункции

Функция ОбработчикиСобытий_ЭтоВызовПередТиповымОбработчиком(ПараметрыСобытия)
	
	Результат = Не ОбработчикиСобытий_ЭтоВызовПослеТиповогоОбработчика(ПараметрыСобытия);
	Возврат Результат;
	
КонецФункции


//Функция ОбработчикиСобытий_ЭтоВызовПередТиповымОбработчиком(ПараметрыСобытия)
//	
//	Результат = Не ОбработчикиСобытий_ЭтоВызовПослеТиповогоОбработчика(ПараметрыСобытия);
//	Возврат Результат;
//	
//КонецФункции

//Процедура Пакеты_ДобавитьПриложение(Пакет, ПрисоединенныйФайл)
//	
//	ДанныеФайла = РаботаСФайлами.ДанныеФайла(ПрисоединенныйФайл);
//	
//	ПараметрыОтправкиФайла = Новый Структура;
//	ПараметрыОтправкиФайла.Вставить("АдресФайла", ДанныеФайла.СсылкаНаДвоичныеДанныеФайла);
//	ПараметрыОтправкиФайла.Вставить("ИмяФайла", ДанныеФайла.ИмяФайла);
//	
//	ВидЭлектронногоДокумента = ВидДокументаПриложение();
//	УчетныйДокумент = ДанныеФайла.Владелец;
//	
//	ОсновнойМодуль.ЭДО_ДокументМенеджер_ПодготовитьИДобавитьДокументВПакет(
//		Пакет,
//		УчетныйДокумент,
//		ВидЭлектронногоДокумента,
//		ПараметрыОтправкиФайла
//	);
//	
//КонецПроцедуры

#КонецОбласти


Функция СформироватьВнешнююПечатнуюФорму(Документ,	ВнешняяПечатнаяФорма, ИдентификаторКомандыПечатнойФормы)
			
	РезультатПечати 	= Неопределено;	
	ПараметрыВывода 	= Неопределено;	
	ОбъектыНазначения 	= Новый Массив;
	ПараметрыИсточника 	= Новый Структура("ИдентификаторКоманды, ОбъектыНазначения", ИдентификаторКомандыПечатнойФормы, ОбъектыНазначения);
	ОбъектыПечати 		= Новый СписокЗначений;
	
	ОбъектыНазначения.Добавить(Документ);
	
	МодульДополнительныеОтчетыИОбработки = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработки");
	МодульДополнительныеОтчетыИОбработки.ПечатьПоВнешнемуИсточнику(ВнешняяПечатнаяФорма, ПараметрыИсточника, РезультатПечати, ОбъектыПечати, ПараметрыВывода);
		
	Если ТипЗнч(РезультатПечати) <> Тип("ТаблицаЗначений") ИЛИ РезультатПечати.Количество() <> 1 Тогда
		ВызватьИсключение "Не удалось сформировать печатную форму """ + ВнешняяПечатнаяФорма + """ для документа " + Документ;
	КонецЕсли;
	
	ИмяВременногоФайла = ПолучитьИмяВременногоФайла();
	ИмяФайла = РезультатПечати[0].СинонимМакета + " № " + Документ.Номер + " от " + Формат(Документ.Дата,"ДФ=dd.MM.yyyy") + ".pdf";
	
	РезультатПечати[0].ТабличныйДокумент.Записать(ИмяВременногоФайла, ТипФайлаТабличногоДокумента.PDF);		
			
	Возврат Новый Структура("ИмяВременногоФайла, ИмяФайла", ИмяВременногоФайла, ИмяФайла);
	
КонецФункции

Функция СведенияОВнешнейОбработке() Экспорт
	
	ПараметрыРегистрации = Новый Структура;
	ПараметрыРегистрации.Вставить("Вид",			 	"ДополнительнаяОбработка");
	ПараметрыРегистрации.Вставить("Наименование", 		"Диадок (СКБ Контур): Подключаемый модуль");
	ПараметрыРегистрации.Вставить("БезопасныйРежим", 	Ложь);
	ПараметрыРегистрации.Вставить("Версия", 			ЭДО_ВерсияAPIПодключаемогоМодуля());
	ПараметрыРегистрации.Вставить("Информация", 		"Модуль работы с электронными первичными документами через Диадок (подключаемая часть)");
	
	ТаблицаКоманд = ПолучитьТаблицуКоманд();
	
	ДобавитьКоманду(ТаблицаКоманд, "Выполнение регламентных операций подключаемого модуля Диадок", "ВыполнитьРегламентныеДействияПМ", "ВызовСерверногоМетода");
	
	ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд);
	
	Возврат ПараметрыРегистрации;
	
КонецФункции

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

Процедура ДобавитьКоманду(ТаблицаКоманд, Представление, Идентификатор, Использование, ПоказыватьОповещение = Ложь, Модификатор = "")
	
	НоваяКоманда						= ТаблицаКоманд.Добавить();
	НоваяКоманда.Представление			= Представление;
	НоваяКоманда.Идентификатор			= Идентификатор;
	НоваяКоманда.Использование			= Использование;
	НоваяКоманда.ПоказыватьОповещение	= ПоказыватьОповещение;
	НоваяКоманда.Модификатор			= Модификатор;
	
КонецПроцедуры

Процедура ВыполнитьКоманду(ИдентификаторКоманды, ПараметрыВыполненияКоманды = Неопределено) Экспорт
	
	Если ИдентификаторКоманды = "ВыполнитьРегламентныеДействияПМ" Тогда
		ВыполнитьРегламентныеДействияПМ(ПараметрыВыполненияКоманды);
	КонецЕсли;
	
КонецПроцедуры

Процедура ВыполнитьРегламентныеДействияПМ(Параметры)
	// Регламентные действия, НЕ требующие инициализации основного модуля
КонецПроцедуры

Функция ЭДО_ВерсияAPIПодключаемогоМодуля() Экспорт
	
	Возврат 4;
	
КонецФункции

UPD 25.08.20: Попросили, чтобы печатная форма акта подписывалась, а счет-фактура нет, доработал:

//Осипов 25.08.2001 - доработки по электронной подписи
Если ВидДокумента = ВидДокументаПечатнаяФормаОтчетаКомитента() Тогда
	ЭлектронныйДокумент.ЗапрашиватьОтветнуюПодпись = Истина;              
Иначе
	ЭлектронныйДокумент.ЗапрашиватьОтветнуюПодпись = Ложь;              
КонецЕсли;

UPD 25.09.23: попросили сделать формализованные формы документа УПД и Отчета комитента. Для УПД это оказалось несложно, нужно просто указать нужный вид документа при формировании пакета:

	//Добавляем в пакет печатную форму счет-фактуры именно к отчету комитента, не на вознаграждение
	//ДанныеПечатнойФормы = СформироватьВстроеннуюПечатнуюФормуДокумента(СчетФактураКОтчетуКомитента, "Счет-фактура.pdf");   
	//ВидДокумента = ВидДокументаПечатнаяФормаСчетФактурыОтчетаКомитенту();
	//ОсновнойМодуль.ПолучитьТаблицуИспользуемыхВидовДокументов();
	ВидДокумента = "ID_УПД";
	ДанныеПечатнойФормы = Неопределено;
	Пакеты_ДобавитьПриложение(ТекущийПакет, ДанныеПечатнойФормы, СчетФактураКОтчетуКомитента, ВидДокумента);                    

А вот для отчета комитента в Контуре нет формализированной формы, нужно писать выгрузку документа в XML.

Среда: БП 3.0.178.2 Объем: 5 час.

image_pdfimage_print

fixin

Программирую на 1С с 1999 года. В 1С просто Гений. В 2020 году ушел из офиса на вольные хлеба фриланса. Принимаю заказы.

Вам может также понравиться...

комментариев 5

  1. rzd:

    Удаляем задом наперед — смешное место, но этот подход здесь не нужен

    • Отчего же не нужен?

      • rzd:

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

        • я не сторонник перфекционизма.
          работаю по бюджету клиента.
          вылизывать все в идеал нет времени и смысла.
          у меня очередь клиентов стоит.
          главное, чтобы работало.

          вы вместо того, чтобы восхититься масштабом и крутизной решения, ищите мелочно пятна на солнце.

  1. 06.09.2025

    […] когда я программно формирую пакет, текст услуги не добавляется в Контуре по УПД на […]

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *