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