Как настроить отладку в модуле Диадок ПРО и перехватить событие формирования печатной формы?

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия IT и автоматизация бизнеса
← На главную

Работа с модулями ЭДО, такими как «Диадок ПРО», часто вызывает сложности у разработчиков из-за их закрытой или сложной внутренней структуры. Основная проблема заключается в том, что логика расширения функционала вынесена в так называемые Подключаемые Модули (ПМ), которые хранятся внутри основной обработки в виде бинарных данных (макетов). В этой статье мы разберем, как подготовить среду 1С для полноценной отладки, как выгрузить вложенные компоненты на диск и как правильно перехватить события формирования печатных форм, чтобы внести необходимые корректировки (например, при задвоении строк в УКД).

Шаг 1: Подготовка среды и выгрузка внешних модулей на диск

Для начала проанализируем, почему обычная точка останова не срабатывает. В типовом режиме работы модуль Диадок извлекает двоичные данные из своих макетов, создает временный файл .epf во временном каталоге пользователя, выполняет код и тут же удаляет файл. Чтобы «поймать» исполняемый код в конфигураторе, нам нужно заставить систему работать с постоянными файлами на диске.

Выполним следующие действия в интерфейсе 1С:

  1. Откроем модуль Диадок и перейдем в Расширенные настройки.
  2. Найдем вкладку «Системные» или «Подключаемый модуль» (расположение зависит от версии модуля, в 4.5.32 ищите в расширенных настройках).
  3. Воспользуемся функцией выгрузки всех компонентов. Нам необходимо указать локальный каталог, куда программа сохранит все вложенные обработки (например, ПечатныеФормы.epf, СтандартныеМетоды.epf и сам шаблон ПМ).
  4. Важный момент: Чтобы изменения в этих файлах учитывались, необходимо установить флаг «Использовать внешние модули» и указать путь к этой папке. Теперь основная обработка будет обращаться к файлам на диске, а не к своим внутренним макетам.

Шаг 2: Поиск нужного места в коде через замер производительности

Если мы не знаем, какая именно функция отвечает за формирование документа, рассмотрим эффективный метод — замер производительности. Рассмотрим алгоритм действий:

  1. В конфигураторе включим режим отладки и откроем замер производительности (меню Отладка — Замер производительности).
  2. В пользовательском режиме 1С выполним действие (например, нажатие кнопки «Печать» или «Просмотр» в Диадоке).
  3. Сразу после формирования формы остановим замер.
  4. В появившемся списке функций проанализируем стек вызовов. Нас интересуют вызовы, содержащие ключевые слова ПечатнаяФорма или ОбработкаСобытия.

Обычно управление передается из основного модуля в функцию ПечатнаяФормаТекущегоДокумента, которая в свою очередь обращается к Подключаемому Модулю.

Шаг 3: Регистрация события в Подключаемом Модуле (ПМ)

Разберем ситуацию, когда нам нужно отловить событие ПечатнаяФормаДокумента. Часто разработчики сталкиваются с тем, что в шаблоне ПМ этого события просто нет. Выясним причину: ПМ работает через единую точку входа — функцию-диспетчер. Чтобы событие «ожило», его нужно зарегистрировать вручную.

Откроем выгруженный файл вашего ПМ в конфигураторе и найдем экспортную функцию ОбработкаСобытияПодключаемогоМодуля. Добавим в нее обработку нашего события по следующему шаблону:


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

Обратите внимание: ИмяСобытия должно в точности соответствовать строке, которую передает основной модуль. В отладке на шаге 2 вы сможете увидеть точное значение этого параметра в момент остановки.

Шаг 4: Анализ и исправление логики (на примере задвоения строк в УКД)

Проанализируем ситуацию, когда в Универсальном корректировочном документе (УКД) дублируются строки. Это часто происходит в событии ПослеЗаполненияКонтента, когда структура данных для XML уже сформирована модулем, но содержит избыточные записи из-за особенностей учета ГТД или ставок НДС в 1С.

Для исправления ситуации в ПМ создадим процедуру, которая будет «сворачивать» таблицу контента. Рассмотрим пример кода:


Процедура ОбработатьСобытиеПослеЗаполненияКонтента(ПараметрыСобытия)
    
    // Получаем структуру контента документа
    Контент = ПараметрыСобытия.Контент;
    
    // Проверяем тип документа, если нужно работать только с УКД
    Если ПараметрыСобытия.ТипКонтента = "UniversalCorrectionDocument" Тогда
        
        // Логика обхода строк и удаления дублей
        // Например, анализ таблицы Контент.ТаблицаСведенийОТоварах
        // Здесь можно программно изменить количество или удалить лишние строки
        
    КонецЕсли;
    
КонецПроцедуры

Важные рекомендации при отладке

При работе с внешними файлами обработок помните о следующих нюансах:

Таким образом, организовав работу Диадока с внешними файлами на диске и правильно прописав условия в функции ОбработкаСобытияПодключаемогоМодуля, мы получаем полный контроль над процессом формирования электронных документов и их печатных форм, что позволяет оперативно решать любые технические проблемы.

← На главную