При работе с электронным документооборотом через Диадок часто возникает необходимость изменить данные, которые попадают в электронный документ (УПД). Например, нужно программно заполнить должность или ФИО ответственного лица в «подвале» документа, который в терминах формата УПД (приказ №820) относится к сведениям о передаче. Разберем подробно, как найти нужные блоки кода и правильно внести изменения в подключаемый модуль (ПМ), учитывая различия между версиями модуля и методики отладки.
Прежде чем приступать к написанию кода, проанализируем, как модуль Диадок формирует данные. В современных версиях интеграции (особенно в версии «Про») разработчики используют двухэтапную схему:
Рассмотрим подробнее, как вносить изменения в зависимости от вашей версии модуля.
В версии «Про» основная точка входа для кастомизации — функция ПодготовитьЭлектронныйДокумент. Если вам необходимо изменить данные о сотруднике (лице, передавшем товар/услугу), мы можем обратиться к объекту Content сразу после его получения из типовых алгоритмов. Рассмотрим пример кода:
// В функции ПодготовитьЭлектронныйДокумент
Content = ОсновнойМодуль.ТиповойМодуль_ПолучитьКонтент(ТиповойМодульДиадока, РежимУправляемыхФорм, Документ1С, ТипКонтента_XDTO, ДополнительныеПараметры);
// Обращаемся к структуре сведений о передаче
Employee = Content.TransferInfo.Employee;
// Заполняем данные из нашей информационной базы (предположим, у нас есть структура ДанныеСотрудника)
Employee.EmployeePosition = ДанныеСотрудника.Должность; // Должность (до 128 символов)
Employee.Surname = ДанныеСотрудника.Фамилия; // Фамилия
Employee.FirstName = ДанныеСотрудника.Имя; // Имя
Employee.Patronymic = ДанныеСотрудника.Отчество; // Отчество
Важно помнить, что в формате УПД сведения о лице могут находиться в разных блоках. Также возможно добавление кнопки "Отправить по ЭДО" для других документов. Если вы меняете данные продавца-передатчика, ищите путь через TransferInfo.
В версии «Стандарт» функции ПодготовитьЭлектронныйДокумент может не быть. В этом случае проанализируем процедуру ОбработатьСобытиеПослеЗаполненияКонтента. Здесь работа идет не с финальным контентом, а с промежуточным объектом. Выясним причину, почему это удобнее: вы можете менять данные до того, как они будут окончательно сериализованы в XML.
Пример изменения данных через Протоконтент (когда выполняется формирование файла типа xml):
// Внутри процедуры обработки события после заполнения контента
Employee = Протоконтент.TransferInfo.Employee;
// Наполняем структуру данными
Employee.EmployeePosition = "Главный бухгалтер";
Employee.Surname = "Иванова";
Employee.FirstName = "Мария";
Employee.Patronymic = "Сергеевна";
Обратите внимание, что если в Протоконтенте нет нужных полей, их нужно инициализировать в соответствии со структурой, ожидаемой модулем интеграции.
Иногда поиск нужной процедуры превращается в настоящий квест. Выясним, где Диадок прячет логику заполнения УПД для конкретных конфигураций. Модуль интеграции часто представляет собой «матрешку» из вложенных обработок. Проанализируем типичный путь поиска:
ТиповойМодульДиадокУФ_epf (или похожим). Сохраните его на диск как внешнюю обработку.Модуль_ИнтеграцияУТ11 или Модуль_ИнтеграцияБП3.ЗаполнитьКонтентXmlUTD, которая отвечает за маппинг полей 1С в поля электронного документа.Совет: Если вам нужно добавить в наименование номенклатуры серию или дополнительные реквизиты, ищите цикл по строкам документа именно в этих вложенных модулях.
Многие сталкиваются с проблемой: точка останова во внешней обработке (ПМ) не срабатывает. Разберем по шагам, как заставить отладчик работать:
-debug). Поскольку формирование XML часто происходит в фоновом задании или на серверном вызове, без серверной отладки перехватить выполнение кода не удастся./ДиадокРежимОтладки. В ряде версий это заставляет модуль игнорировать серверные оптимизации и облегчает отладку.Проанализируем ситуацию, когда вы изменили код, но в отправленном документе все равно отображаются старые данные. В Диадоке данные подписанта часто имеют приоритет перед данными, передаваемыми из 1С. Проверьте следующие настройки:
1. В самой обработке Диадок перейдите в Настройки -> Сотрудники.
2. Найдите нужного пользователя и проверьте, какие права и должности указаны у него там. Если в настройках сотрудника жестко прописана должность, она может перекрывать то, что вы передаете из кода ПМ.
3. Помните, что ФИО подписанта всегда берется из Сертификата электронной подписи. Программно изменить ФИО в блоке подписанта, если оно отличается от данных в сертификате, невозможно по правилам криптографии и регламентам ЭДО.
Таким образом, мы рассмотрели основные механизмы модификации модуля. Рекомендуем всегда начинать с создания ПМ на базе шаблона, предоставляемого поддержкой Диадока, и использовать механизм событий ПослеЗаполненияПротоконтента для максимально безопасного внесения изменений.