Как отладить внешнюю печатную форму или обработку в 1С?

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

При разработке и сопровождении подключаемых внешних печатных форм (ВПФ) и обработок разработчики часто сталкиваются с ситуацией, когда стандартные точки останова не срабатывают, а вызовы логирования не выводят данные. Внешняя печатная форма хранится в базе данных (в справочнике дополнительных отчетов и обработок) и запускается в серверном контексте, нередко внутри фонового задания. Разберем по шагам, почему привычные методы отладки могут не давать результата, и подробно рассмотрим проверенные способы быстрой и надежной отладки кода таких объектов.

Почему не работает запись в журнал регистрации?

Попытка использовать метод ЗаписьЖурналаРегистрации для отслеживания хода выполнения модуля ВПФ часто оказывается безрезультатной. Проанализируем возможные причины такого поведения:

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

Способ 1. Добавление тестовой управляемой формы в обработку

Самый распространенный и универсальный способ отладки внешней печатной формы — создание внутри файла .epf собственной управляемой формы. Это позволяет запускать обработку непосредственно через меню «Файл» — «Открыть» в режиме предприятия и выполнять отладку в обычном клиент-серверном взаимодействии без необходимости каждый раз перезагружать файл в справочник базы.

Разберем по шагам, как настроить такую форму:

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

Посмотрим на пример клиент-серверного кода формы для вызова процедуры печати:


&НаСервере
Процедура СформироватьПечатнуюФормуНаСервере()
    
    // Создаем коллекцию печатных форм по стандарту БСП
    КоллекцияПечатныхФорм = Новый ТаблицаЗначений;
    КоллекцияПечатныхФорм.Колонки.Добавить("ИмяМакета", Новый ОписаниеТипов("Строка"));
    КоллекцияПечатныхФорм.Колонки.Добавить("ТабличныйДокумент", Новый ОписаниеТипов("ТабличныйДокумент"));
    КоллекцияПечатныхФорм.Колонки.Добавить("СинонимМакета", Новый ОписаниеТипов("Строка"));
    
    НоваяСтрока = КоллекцияПечатныхФорм.Добавить();
    НоваяСтрока.ИмяМакета = "ПФ_MXL_ИмяМакета";
    НоваяСтрока.ТабличныйДокумент = Новый ТабличныйДокумент;
    
    МассивОбъектов = Новый Массив;
    МассивОбъектов.Добавить(СсылкаНаОбъект);
    
    ОбъектыПечати = Новый СписокЗначений;
    ПараметрыВывода = Новый Структура;
    
    // Получаем объект текущей обработки и вызываем процедуру формирования
    ОбработкаОбъект = РеквизитФормыВЗначение("Объект");
    ОбработкаОбъект.Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода);
    
    // Отображаем сформированный результат
    РеквизитТабличныйДокумент = НоваяСтрока.ТабличныйДокумент;
    
КонецПроцедуры

&НаКлиенте
Процедура КомандаПечать(Команда)
    
    Если Не ЗначениеЗаполнено(СсылкаНаОбъект) Тогда
        Предупреждение("Выберите документ для отладки печати!");
        Возврат;
    КонецЕсли;
    
    СформироватьПечатнуюФормуНаСервере();
    
КонецПроцедуры

В таком варианте точка останова, установленная в модуле объекта обработки в процедуре Печать, гарантированно сработает сразу после нажатия кнопки на форме.

Способ 2. Настройка конфигуратора для отладки на сервере и в фоновых заданиях

Если требуется отладить внешнюю печатную форму непосредственно при ее вызове из типового интерфейса конфигурации, необходимо убедиться, что отладчик настроен для перехвата серверных и фоновых вызовов.

Проанализируем необходимые настройки:

  1. Запуск сервера 1С в режиме отладки. Служба сервера 1С:Предприятия должна быть запущена с ключом отладки (параметр -debug при протоколе TCP или с включенной отладкой по HTTP). Если отладка на сервере отключена, точки останова в серверных модулях работать не будут.
  2. Автоматическое подключение отладчика. В конфигураторе откроем главное меню «Отладка» — «Подключение» и нажмем кнопку «Настройка автоматического подключения». Установим флаги Сервер и Фоновые задания.
  3. Открытие исходного файла. Откроем файл .epf в конфигураторе через «Файл» — «Открыть» и установим точку останова в нужной строке. Однако следует помнить: если БСП выгружает обработку из базы данных во временный каталог на сервере, путь к файлу может не совпасть с локальным файлом, и отладчик не свяжет исполняемый модуль с открытым в конфигураторе. В таком случае точку останова следует ставить в общем модуле БСП.

Способ 3. Перехват выполнения в общем модуле БСП

Чтобы отследить выполнение обработки без изменения ее внутренней структуры, поставим точку останова в коде конфигурации, который отвечает за запуск внешних обработок.

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

Способ 4. Использование временного расширения конфигурации

Если логика формирования печатной формы сложная и требует длительной отладки со сбором стека вызовов, замером производительности и частым изменением кода, целесообразно перенести ее во временное расширение конфигурации.

  1. Создадим пустое расширение конфигурации (с назначением «Адаптация» или «Исправление»).
  2. Добавим в расширение новую обработку и скопируем в нее макеты и модули из внешней печатной формы.
  3. В модуле расширения код отлаживается стандартным образом: работают абсолютно все точки останова без ограничений на временные файлы и без задержек при обновлении.
  4. После завершения исправления и тестирования перенесем отлаженный код обратно в исходный файл внешней обработки (.epf) и обновим его в справочнике базы.

Способ 5. Альтернативное логирование через запись в файл

Если база данных находится на удаленном сервере, где отсутствует возможность подключить отладчик, а журнал регистрации не фиксирует события, воспользуемся явной записью во внешний текстовый файл на стороне сервера.

Посмотрим на пример служебной процедуры записи в файл:


Процедура ЗаписатьЛогСервер(ТекстЛога)
    
    ПутьКЛогу = "C:\Logs\debug_print.txt";
    
    ЗаписьТекста = Новый ЗаписьТекста(ПутьКЛогу, КодировкаТекста.UTF8, , Истина);
    ЗаписьТекста.ЗаписатьСтроку(Формат(ТекущаяДата(), "ДФ=yyyy-MM-dd HH:mm:ss") + " | " + ТекстЛога);
    ЗаписьТекста.Закрыть();
    
КонецПроцедуры

Важно: каталог, в который выполняется запись, должен быть доступен для пользователя операционной системы, от имени которого запущена служба сервера 1С (обычно USR1CV8).

← На главную