«Продвинутые» доработки в Контуре БП
Клиенту с комиссионной торговлей понадобилось сделать две продвинутые доработки.
Подключаемый модуль делал через расширение, потому что почему-то если его делать в файле, он не загружается с клиентской машины, его надо размещать в каталоге, доступном (расшаренном) с сервера.
Обнаружил, что все функции из документации подключаемого модуля доступны для перехвата в функции ОбработатьСобытие подключаемого модуля:
Функция ОбработатьСобытие(ИмяСобытия, Параметры) Экспорт Если ИмяСобытия = "ПолучитьТаблицуИспользуемыхПакетов" Тогда Возврат ПолучитьТаблицуИспользуемыхПакетов(Параметры); ИначеЕсли ИмяСобытия = "ПослеОбновленияСпискаДокументов" Тогда Возврат ПослеОбновленияСпискаДокументов(Параметры); ИначеЕсли ИмяСобытия = "ПолучитьТекстЗапросаДляСпискаПакетовНаОтправкуПоМассивуВидовПакетов" Тогда Возврат ПолучитьТекстЗапросаДляСпискаПакетовНаОтправкуПоМассивуВидовПакетов(Параметры); ИначеЕсли ИмяСобытия = "ПодготовитьПакет" Тогда Возврат ПодготовитьПакет(Параметры); ИначеЕсли ИмяСобытия = "ПослеПодготовкиПакета" Тогда Возврат ПослеПодготовкиПакета(Параметры); КонецЕсли; КонецФункции
Удаление лишней счет-фактуры из списка документов
Я не понял, как подменить текст запроса в функции ПолучитьТекстЗапросаДляСпискаПакетовНаОтправкуПоМассивуВидовПакетов, но может оно и к лучшему, т.к. я просто удаляю ненужные документы в функции ПослеОбновленияСпискаДокументов:
Функция ПослеОбновленияСпискаДокументов(Параметры) Экспорт //После получения списка документов //Тут можно убрать ненужные документы Если ТипЗнч(Параметры) = Тип("Структура") И Параметры.Свойство("СписокДокументов") Тогда //Колонки: //НомерСтроки ТребуемоеДействие Документ //НомерДокумента ДатаДокумента Организация Контрагент ДокументЭДО СуммаДокумента //ИмяКартинки Архивный ВидПакета Пакет Статус ВидЭлДокумента //Видимость ТипДокумента ТипКонтента ФункцияДокумента Направление ВидПакета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 час.




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