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

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

С выходом обновлений платформы 1С:Предприятие 8.3 (начиная с версии 8.3.16) многие разработчики столкнулись с проблемой: привычный метод отладки внешних печатных форм (ВПФ) через временные файлы перестал работать. Отладчик просто «теряет» связь с объектом, как только выполнение переходит во временную копию файла, созданную подсистемой «Дополнительные отчеты и обработки» Библиотеки стандартных подсистем (БСП). Разберем по шагам, как эффективно решать эту задачу в современных реалиях.

Почему старые методы отладки перестали работать?

Проанализируем ситуацию: в новых версиях платформы был изменен механизм управления сеансовыми данными и временными хранилищами. Когда внешняя обработка запускается через стандартный интерфейс программы, БСП копирует её во временный каталог с уникальным именем. В версиях 8.3.16+ этот файл может удаляться или блокироваться сразу после завершения вызова, что делает невозможным установку точек останова в модуле объекта. Кроме того, часто печать выполняется в фоновом задании, что требует дополнительных настроек отладчика.

Способ 1: Создание отладочной формы в самой обработке

Рассмотрим наиболее надежный способ, который рекомендуют опытные разработчики. Он заключается в создании вспомогательной формы внутри вашей внешней печатной формы. Эта форма позволит нам напрямую вызывать процедуру Печать модуля объекта, не полагаясь на механизмы БСП. Это дает возможность отладчику стабильно «цепляться» за код.

Выполним следующие шаги:

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

Разберем пример кода для вызова печати из формы:


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

КонецПроцедуры

Проблема отсутствия экспортного метода ПодготовитьКоллекциюПечатныхФорм

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

Если вы столкнулись с такой ситуацией, проанализируйте версию вашей конфигурации. Как показывает практика, обновление до более свежего релиза часто возвращает нужный экспортный метод. Если же обновление невозможно, структуру КоллекцияПечатныхФорм можно создать вручную, так как это обычная таблица значений с определенным набором колонок (Имя, ТабличныйДокумент, Экземпляров и др.).

Способ 2: Отображение результата печати на клиенте

После того как отладка логики завершена, нам важно увидеть результат — сам табличный документ. Поскольку формирование происходит на сервере, нам нужно передать данные обратно на клиент. Посмотрим, как это сделать правильно:

На сервере мы заполняем коллекцию, а на клиенте обходим ее. Обратите внимание, что объекты типа ТабличныйДокумент успешно передаются между сервером и клиентом в управляемом приложении.


&НаКлиенте
Процедура ВыполнитьПечать(Команда)
    
    РезультатПечати = ПечатьНаСервере();
    
    Для каждого ПечатнаяФорма Из РезультатПечати Цикл
        ПечатнаяФорма.ТабличныйДокумент.Показать("Печать: " + ПечатнаяФорма.Имя);
    КонецЦикла;
    
КонецПроцедуры

&НаСервере
Функция ПечатьНаСервере()
    // ... код вызова печати из Способа 1 ...
    // Возвращаем коллекцию (таблицу значений) на клиент
    Возврат КоллекцияПечатныхФорм;
КонецФункции

Настройка параметров отладки для платформы 8.3.16+

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

Рекомендации по разработке (Best Practice)

Для минимизации проблем с отладкой в будущем, рекомендуем придерживаться архитектуры разделения логики. Старайтесь выносить расчет данных для печати (запросы, формирование сложных структур) в отдельные функции модуля объекта, которые возвращают Структура или ТабличныйДокумент. Чем меньше ваш код зависит от глобального контекста БСП во время формирования данных, тем проще его тестировать автономно. Для стандартизации структуры разработки подойдёт шаблон дополнительной обработки для конфигураций на БСП.

Использование специализированных инструментов, таких как внешние обработки-«пускачи» для ВПФ, также может значительно ускорить процесс. Они эмулируют среду БСП, подставляя необходимые параметры в процедуру Печать, и избавляют вас от необходимости создавать форму в каждой новой разработке. Для таких целей можно применить инструмент для отладки внешних печатных форм и обработок.

← На главную