Разработка внешних печатных форм (ВПФ) для управляемых приложений, таких как 1С:Зарплата и управление персоналом 3.1, часто сопровождается трудностями при попытке использовать стандартный механизм отладки. Программист ставит точку останова в коде обработки, запускает печать из документа, но программа игнорирует брейкпоинт. Рассмотрим подробно, почему так происходит, и разберем все способы решения этой проблемы.
Для начала проанализируем ситуацию и выясним причину такого поведения системы. Когда мы работаем с обычным внешним отчетом или обработкой, мы открываем файл через меню Файл — Открыть. В случае с ВПФ ситуация иная. Мы подключаем обработку в справочник ДополнительныеОтчетыИОбработки. С этого момента 1С сохраняет файл во внутреннее хранилище базы данных в виде двоичных данных.
В момент вызова команды печати система выполняет следующие действия:
Ваш конфигуратор «знает» о файле .epf, который лежит у вас на диске D:\Work\MyPrintForm.epf, но он ничего не знает о временном файле с произвольным именем в недрах операционной системы, который исполняет сервер 1С. Связь между исходным кодом и исполняемым объектом разрывается. Кроме того, выполнение кода печати чаще всего происходит на стороне сервера, что требует особых настроек.
Если ваша база данных работает в клиент-серверном режиме, первым делом проверим настройки службы сервера 1С. По умолчанию отладка на сервере часто выключена для экономии ресурсов. Посмотрим, как ее включить.
Разберем процесс для протокола TCP/IP. Нам необходимо изменить параметры запуска службы 1C:Enterprise 8.3 Server Agent:
regedit).HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\1C:Enterprise 8.3 Server Agent.ImagePath.-debug.services.msc.Если вы используете платформу версии 8.3.7 и выше, рекомендуем рассмотреть отладку по протоколу HTTP. Это более современный и стабильный метод. Для этого в файле conf.cfg на сервере настраивается соответствующий адрес, а вместо флага -debug используется -http.
Многие современные конфигурации (ЗУП 3.1, ERP, КА) используют механизм ДлительныеОперации. Это означает, что при нажатии кнопки «Печать» формируется фоновое задание на сервере. Для конфигуратора это отдельный процесс, к которому он не подключается автоматически.
Проанализируем настройки конфигуратора:
Теперь при старте фонового задания сервер будет «сообщать» об этом конфигуратору, и точка останова в серверном коде сработает.
Поскольку отлаживать ВПФ непосредственно из справочника «Дополнительные отчеты и обработки» крайне неудобно, применим проверенный метод — создание вспомогательной формы. Рассмотрим по шагам:
ФормаОтладки).СсылкаНаОбъект с типом того документа, который мы печатаем (например, ДокументСсылка.ПриемНаРаботу).Пример кода в модуле формы для запуска отладки:
&НаКлиенте
Процедура КомандаПечать(Команда)
ОбъектОтладки = РеквизитФормыВЗначение("Объект");
// Передаем параметры, которые обычно ожидает БСП
МассивОбъектов = Новый Массив;
МассивОбъектов.Добавить(Объект.СсылкаНаОбъект);
КоллекцияПечатныхФорм = СформироватьКоллекциюПечатныхФорм();
ОбъектыПечати = Новый СписокЗначений;
ПараметрыВывода = Новый Структура;
// Вызываем серверную процедуру модуля объекта
ПечатьНаСервере(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода);
КонецПроцедуры
&НаСервере
Процедура ПечатьНаСервере(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода)
ОбработкаОбъект = РеквизитФормыВЗначение("Объект");
// Здесь ставим точку останова!
ОбработкаОбъект.Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода);
КонецПроцедуры
Теперь мы можем просто открыть .epf файл через Файл — Открыть, выбрать нужный документ и нажать кнопку. Конфигуратор четко отработает точку останова, так как путь к файлу на диске совпадает с тем, что открыто в редакторе.
Бывают ситуации, когда доступ к настройкам сервера ограничен (например, в облачных сервисах или при строгих политиках безопасности), и включить -debug невозможно. В этом случае программисты используют метод «искусственной ошибки».
Разберем, как это реализовать. В нужном месте кода мы можем вставить конструкцию, которая гарантированно прервет выполнение программы:
// Вместо точки останова используем исключение
Если ИмяПользователя() = "Администратор" Тогда
ВызватьИсключение "Остановка для проверки переменных: " + ЗначениеПеременной;
КонецЕсли;
Чтобы этот метод был полезен, в конфигураторе должна быть включена опция Отладка — Остановка по ошибке. При возникновении исключения система остановится, и вы сможете изучить стек вызовов и значения доступных переменных в локальном контексте.
Также можно использовать «дедовский» способ с делением на ноль, упомянутый в обсуждении, но ВызватьИсключение выглядит более профессионально и позволяет вывести информативное сообщение.
Не забудем про Безопасный режим. В 1С:ЗУП 3.1 при подключении ВПФ по умолчанию предлагается запуск в безопасном режиме. Это накладывает ограничения на использование некоторых серверных методов и может блокировать работу отладчика в определенных сценариях.
Проанализируем карточку обработки в режиме «Предприятие»:
Для успешной отладки внешней печатной формы в управляемом приложении необходимо соблюдение трех условий:
Соблюдение этих правил сэкономит вам массу времени и позволит отлаживать даже самые сложные алгоритмы формирования макетов ТабличныйДокумент в учетных решениях на базе 1С.