При обмене электронными документами через систему Контур.Диадок часто возникает необходимость передавать в XML-файлах (УПД, счетах-фактурах) дополнительные сведения, которых нет в стандартных полях типовой конфигурации. Типичный пример — передача контрагенту информации о Номере заказа, адресе доставки или коде договора.
Если просто добавить дополнительный реквизит к документу Счет-фактура выданный в конфигурации 1С, стандартная обработка Диадока не подтянет его автоматически в файл выгрузки. Переписывать код основной обработки Диадока крайне не рекомендуется, так как это усложнит последующие обновления. Рассмотрим, как решить эту задачу правильно с помощью Подключаемого модуля (ПМ). В качестве альтернативы без доработки модулей можно использовать обработку для выгрузки XML-файлов ЭДО по приказам ФНС.
Интеграционное решение Диадока для 1С спроектировано по модульной структуре. Вся основная логика и закрытый код находятся во внешней обработке. Чтобы пользователи могли кастомизировать заполнение полей под свои нужды, разработчики Диадока предусмотрели механизм внешних подключаемых модулей (ПМ). Это отдельная внешняя обработка (файл .epf), которая содержит предопределенные процедуры перехвата событий. Мы можем перехватить момент формирования электронного документа и дозаполнить нужные структуры данных своими реквизитами из 1С.
Для создания собственной логики нам понадобится стандартный шаблон подключаемого модуля от Диадока. Получить его можно двумя способами:
Откроем обработку Диадока в режиме «1С:Предприятие». Перейдем в «Настройки» — «Расширенные настройки» — вкладка «Подключаемый модуль». Нажмем кнопку «Сохранить шаблон подключаемого модуля на диск» и выберем каталог для сохранения файла .epf.
Если кнопка сохранения недоступна, откроем основную обработку Диадока в Конфигураторе 1С. Перейдем в раздел макетов, найдем макет конфигурации соответствующего модуля интеграции и сохраним его на жесткий диск как внешнюю обработку.
В современных версиях обработки Диадок во вкладке «Плагины» доступен инструмент «Генератор подключаемого модуля». Он позволяет интерактивно сгенерировать ПМ под конкретные задачи автоматизации.
Откроем сохраненный шаблон внешней обработки в Конфигураторе 1С. В зависимости от версии Диадока и используемых форматов документов (например, УПД по приказу ФНС № 820 или № 970), заполнение данных происходит в разных событиях.
Разберем классический пример заполнения события ОбработатьСобытиеПослеЗаполненияКонтента для формата УПД (XmlUTD). Наша задача — получить значение дополнительного реквизита «Номер заказа» и добавить его в коллекцию иных сведений документа AdditionalInfoId.StructedAdditionalInfos. Для быстрого поиска готовых программных конструкций пригодится справочник по методам БСП с примерами кода.
Для надежного извлечения дополнительных реквизитов рекомендуется задействовать стандартные механизмы БСП (Библиотеки стандартных подсистем), а именно общий модуль УправлениеСвойствами. Проанализируем пример кода:
Функция ОбработатьСобытиеПослеЗаполненияКонтента(Параметры) Экспорт
// Получаем тип документа и его текущую структуру данных
DocumentType = Параметры.ТипДокумента;
Content = Параметры.Контент;
ДокументСсылка = Параметры.ДокументСсылка;
// Обрабатываем формат УПД (XmlUTD) или обычный Счет-фактуру (Invoice)
Если DocumentType = "XmlUTD" Или DocumentType = "Invoice" Тогда
// Поиск свойства по наименованию в конфигурации 1С
СвойствоНомерЗаказа = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Номер заказа");
Если ЗначениеЗаполнено(СвойствоНомерЗаказа) Тогда
// Извлекаем значение доп. реквизита с помощью БСП
ЗначениеСвойства = УправлениеСвойствами.ЗначениеСвойства(ДокументСсылка, СвойствоНомерЗаказа);
Если ЗначениеЗаполнено(ЗначениеСвойства) Тогда
СтрокаНомераЗаказа = СокрЛП(Строка(ЗначениеСвойства));
// Проверим инициализацию структур в XML-контенте Диадока
Если Content.AdditionalInfoId = Неопределено Тогда
Content.Вставить("AdditionalInfoId", Новый Структура("StructedAdditionalInfos", Новый Массив));
ИначеЕсли Content.AdditionalInfoId.StructedAdditionalInfos = Неопределено Тогда
Content.AdditionalInfoId.Вставить("StructedAdditionalInfos", Новый Массив);
КонецЕсли;
// Добавим наше значение в коллекцию дополнительных полей
НовоеДопСведение = Новый Структура("Key, Value", "Номер заказа", СтрокаНомераЗаказа);
Content.AdditionalInfoId.StructedAdditionalInfos.Добавить(НовоеДопСведение);
КонецЕсли;
КонецЕсли;
Возврат Content;
КонецЕсли;
КонецФункции
В более новых версиях универсального модуля Диадока рекомендуется использовать экспортную процедуру ПодготовитьЭлектронныйДокумент. Разберем реализацию для этого события:
Процедура ПодготовитьЭлектронныйДокумент(Параметры) Экспорт
// Проверим наличие необходимых ключей в структуре параметров
Если Не Параметры.Свойство("Контент") Или Не Параметры.Свойство("ДокументСсылка") Тогда
Возврат;
КонецЕсли;
Контент = Параметры.Контент;
ДокументСсылка = Параметры.ДокументСсылка;
// Получаем ссылку на доп. свойство
СвойствоНомерЗаказа = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Номер заказа");
Если ЗначениеЗаполнено(СвойствоНомерЗаказа) Тогда
ЗначениеРеквизита = УправлениеСвойствами.ЗначениеСвойства(ДокументСсылка, СвойствоНомерЗаказа);
Если ЗначениеЗаполнено(ЗначениеРеквизита) Тогда
// Убедимся, что структуры для дополнительных сведений подготовлены
Если Не Контент.Свойство("AdditionalInfoId") Или Контент.AdditionalInfoId = Неопределено Тогда
Контент.Вставить("AdditionalInfoId", Новый Структура("StructedAdditionalInfos", Новый Массив));
КонецЕсли;
// Формируем структуру и добавляем ее в коллекцию Диадока
НоваяИнфоСтрока = Новый Структура("Key, Value", "Номер заказа", Строка(ЗначениеРеквизита));
Контент.AdditionalInfoId.StructedAdditionalInfos.Добавить(НоваяИнфоСтрока);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Важно: Не забудьте раскомментировать вызов измененных функций в самом начале шаблона подключаемого модуля (обычно разработчики Диадока оставляют там закомментированные вызовы по умолчанию).
После написания кода сохраним изменения во внешней обработке в Конфигураторе.
.epf). Зададим наименование и сохраним изменения.Часто в процессе разработки возникает необходимость отладить код ПМ «на лету» в реальной сессии отправки документов. Поскольку обработка вызывается Диадоком динамически, обычные точки останова в Конфигураторе могут не срабатывать. Выясним, как настроить отладку правильно:
.epf на локальном жестком диске. При включенной опции отладки Диадок будет игнорировать версию модуля из базы данных и выполнять код напрямую из локального файла..epf в Конфигураторе 1С.ОбработатьСобытиеПослеЗаполненияКонтента или ПодготовитьЭлектронныйДокумент.Важно: По окончании отладочных работ обязательно снимите флаг «Режим отладки» в Диадоке и обновите бинарный файл обработки в справочнике «Дополнительные отчеты и обработки», чтобы изменения вступили в силу для всех пользователей информационной базы.