Разработка внешних печатных форм (ВПФ) — одна из наиболее частых задач программиста 1С. Однако очень часто разработчики сталкиваются с крайне неприятной проблемой: при попытке отладить код в модуле объекта внешней обработки конфигуратор упорно игнорирует установленные точки останова. При этом в модуле формы точки останова могут срабатывать без каких-либо проблем. Проблема становится особенно острой, когда база данных работает в клиент-серверном режиме (на СУБД MS SQL или PostgreSQL), а отладка происходит на сервере.
В этой статье мы подробно разберем, почему возникает эта проблема, проанализируем внутренние механизмы платформы 1С и Библиотеки стандартных подсистем (БСП), а также изучим несколько надежных и проверенных способов решения этой задачи.
Для того чтобы понять, как решить проблему, давайте сначала разберем физику процесса. Когда мы открываем внешнюю обработку через меню Файл — Открыть на стороне клиента, её код выполняется в контексте клиента. Точки останова в модуле формы срабатывают, потому что конфигуратор четко сопоставляет выполняемый на клиенте код с конкретным файлом на диске.
Однако в реальной работе внешние печатные формы регистрируются в справочнике ДополнительныеОтчетыИОбработки. Когда пользователь нажимает кнопку печати в документе, система БСП выполняет следующие действия:
ВнешниеОбработки.Подключить().Печать(), расположенную в модуле объекта этой обработки.Именно в этот момент связь между вашим исходным файлом на жестком диске компьютера и выполняемым на сервере кодом теряется. Для конфигуратора выполняемый на сервере код — это некий временный объект, загруженный из потока, у которого нет физического адреса на диске. Конфигуратор просто не знает, к какому файлу привязать точку останова. Ситуация усугубляется, если на сервере 1С не включен режим отладки или если обработка запускается в безопасном режиме.
Рассмотрим подробнее по шагам, как настроить окружение и обойти эти ограничения.
Прежде чем приступать к манипуляциям с кодом, необходимо убедиться, что сервер 1С в принципе готов к отладке. Если служба сервера запущена в обычном режиме, никакие ухищрения в конфигураторе не заставят сработать точку останова на сервере.
Выясним, как правильно включить отладку в зависимости от операционной системы, на которой работает сервер приложений 1С.
Если сервер 1С работает под управлением Windows:
regedit и нажмите Enter.HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\1C:Enterprise 8.3... (название ветки зависит от точной версии платформы).ImagePath.-debug.Пример исходного значения:
"C:\Program Files\1cv8\8.3.22.1709\bin\ragent.exe" -srvc -agent -regport 1541 -port 1540 -range 1560:1591 -d "C:\Program Files\1cv8\srvinfo"
Пример значения после редактирования:
"C:\Program Files\1cv8\8.3.22.1709\bin\ragent.exe" -srvc -agent -regport 1541 -port 1540 -range 1560:1591 -d "C:\Program Files\1cv8\srvinfo" -debug
После изменения реестра обязательно перезапустим службу сервера 1С:Предприятия через оснастку Службы (services.msc).
Если сервер 1С работает под управлением Linux:
/etc/sysconfig/srv1cv83 или параметры systemd-сервиса (например, /lib/systemd/system/srv1cv83.service).SRV1CV8_DEBUG и присвоим ей значение 1:SRV1CV8_DEBUG=1-debug непосредственно в строку запуска демона ragent.systemctl restart srv1cv83После включения отладки на сервере откроем конфигуратор, перейдем в меню Отладка — Подключение — Автоматическое подключение и установим флажки напротив пунктов Клиентские соединения на сервере и Фоновые задания.
Разработчики Библиотеки стандартных подсистем предусмотрели штатный механизм, позволяющий избежать ручного изменения конфигурации или использования сторонних обработок для отладки ВПФ. Этот механизм позволяет системе запускать печатную форму не из базы данных, а непосредственно из указанного разработчиком файла на жестком диске.
Разберем этот процесс по шагам:
Печать()).Если по какой-то причине использовать режим отладки БСП не удается (например, в старых версиях конфигураций), самым надежным и классическим способом является создание отладочной формы прямо внутри самой печатной формы.
Этот способ позволяет эмулировать вызов серверного метода печати БСП через стандартное открытие файла на клиенте. Разберем создание такого механизма подробно.
Войдем в конфигуратор и откроем нашу внешнюю обработку. Добавим в нее основную форму (назовем ее ФормаОтладки) и назначим ее основной формой обработки. Выполним следующие шаги:
СсылкаНаДокумент. Тип реквизита должен соответствовать документу, для которого предназначена эта печатная форма (например, ДокументСсылка.РеализацияТоваровУслуг). Вынесем этот реквизит на рабочую область формы.ВыполнитьОтладку и создадим для нее команду.
&НаКлиенте
Процедура ВыполнитьОтладку(Команда)
ВыполнитьПечатьНаСервере();
КонецПроцедуры
&НаСервере
Процедура ВыполнитьПечатьНаСервере()
// Конвертируем данные формы обратно в прикладной объект обработки
ОбъектОбработки = РеквизитФормыВЗначение("Объект");
// Формируем параметры, которые БСП обычно передает в процедуру Печать()
МассивОбъектов = Новый Массив;
МассивОбъектов.Добавить(СсылкаНаДокумент);
// Инициализируем коллекцию печатных форм, как это делает БСП
КоллекцияПечатныхФорм = Новый ТаблицаЗначений;
КоллекцияПечатныхФорм.Колонки.Добавить("ИмяВР");
КоллекцияПечатныхФорм.Колонки.Добавить("Синоним");
КоллекцияПечатныхФорм.Колонки.Добавить("ТабличныйДокумент");
КоллекцияПечатныхФорм.Колонки.Добавить("Экземпляров");
КоллекцияПечатныхФорм.Колонки.Добавить("Картинка");
// Добавим строку для нашей печатной формы
НоваяСтрока = КоллекцияПечатныхФорм.Добавить();
НоваяСтрока.ИмяВР = "ИмяВашейПечатнойФормы"; // Имя макета или идентификатор
НоваяСтрока.Синоним = "Печатная форма для теста";
ОбъектыПечати = Новый СписокЗначений;
ПараметрыВывода = Новый Структура;
// Вызываем процедуру Печать из модуля объекта внешней обработки
ОбъектОбработки.Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода);
КонецПроцедуры
После реализации этой формы запустим отладку следующим образом:
СсылкаНаДокумент.Печать().Бывают ситуации, когда конфигуратор категорически отказывается останавливаться на обычных точках останова в модуле объекта (например, из-за специфических сетевых настроек или ограничений прав доступа). В этом случае можно применить хитрость, основанную на механизме остановки по ошибке.
Для этого выполним следующие действия:
Печать() (или в том месте, где нам нужно прервать выполнение), пропишем конструкцию, вызывающую гарантированное исключение во время выполнения:
Попытка
ВызватьИсключениеДляОтладки = 1 / 0;
Исключение
// Конфигуратор прервет выполнение здесь, если настроена остановка по ошибке
ЗаписьЖурналаРегистрации("Отладка", УровеньЖурналаРегистрации.Предупреждение, , , "Точка прерывания");
КонецПопытки;
Обратим внимание на важную деталь: Библиотека стандартных подсистем по умолчанию подключает любые внешние обработки с установленным флагом безопасного режима (БезопасныйРежим = Истина). В зависимости от версии платформы 1С:Предприятие, выполнение кода в безопасном режиме может накладывать жесткие ограничения на сетевую активность, работу с файловой системой и, что самое главное, на возможность интерактивной отладки кода конфигуратором.
Если точки останова не срабатывают, попробуем временно отключить безопасный режим для нашей печатной формы:
СведенияОВнешнейОбработке() найдем параметр регистрации безопасного режима и установим его в значение Ложь:
ПараметрыРегистрации.Вставить("БезопасныйРежим", Ложь);
В современных версиях платформы 1С (начиная с 8.3.14) по умолчанию используется отладка по протоколу HTTP. Однако на практике сетевое окружение предприятий (активные брандмауэры, прокси-серверы, антивирусы) часто блокирует прохождение пакетов отладчика HTTP между сервером 1С и локальным компьютером разработчика.
Посмотрим, как можно решить эту проблему переключением на старый и проверенный протокол TCP/IP:
-http на ключ -tcp (если они были жестко заданы).Мы детально проанализировали причины сбоев при отладке внешних печатных форм в среде 1С и изучили самые популярные способы обхода этой проблемы. Использование штатного режима отладки БСП или создание временной формы-стартера позволяют быстро локализовать любую программную ошибку в модуле объекта и сэкономить массу рабочего времени разработчика.