Почему не работают точки останова в модуле объекта внешней печатной формы и как это исправить

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

Разработка внешних печатных форм (ВПФ) — одна из наиболее частых задач программиста 1С. Однако очень часто разработчики сталкиваются с крайне неприятной проблемой: при попытке отладить код в модуле объекта внешней обработки конфигуратор упорно игнорирует установленные точки останова. При этом в модуле формы точки останова могут срабатывать без каких-либо проблем. Проблема становится особенно острой, когда база данных работает в клиент-серверном режиме (на СУБД MS SQL или PostgreSQL), а отладка происходит на сервере.

В этой статье мы подробно разберем, почему возникает эта проблема, проанализируем внутренние механизмы платформы 1С и Библиотеки стандартных подсистем (БСП), а также изучим несколько надежных и проверенных способов решения этой задачи.

Выясняем причину: почему конфигуратор «не видит» точки останова?

Для того чтобы понять, как решить проблему, давайте сначала разберем физику процесса. Когда мы открываем внешнюю обработку через меню Файл — Открыть на стороне клиента, её код выполняется в контексте клиента. Точки останова в модуле формы срабатывают, потому что конфигуратор четко сопоставляет выполняемый на клиенте код с конкретным файлом на диске.

Однако в реальной работе внешние печатные формы регистрируются в справочнике ДополнительныеОтчетыИОбработки. Когда пользователь нажимает кнопку печати в документе, система БСП выполняет следующие действия:

  1. Считывает двоичные данные файла обработки из базы данных.
  2. Помещает этот бинарный поток во временное хранилище на сервере.
  3. Подключает обработку во временном сеансе на стороне сервера с помощью метода ВнешниеОбработки.Подключить().
  4. Вызывает процедуру Печать(), расположенную в модуле объекта этой обработки.

Именно в этот момент связь между вашим исходным файлом на жестком диске компьютера и выполняемым на сервере кодом теряется. Для конфигуратора выполняемый на сервере код — это некий временный объект, загруженный из потока, у которого нет физического адреса на диске. Конфигуратор просто не знает, к какому файлу привязать точку останова. Ситуация усугубляется, если на сервере 1С не включен режим отладки или если обработка запускается в безопасном режиме.

Рассмотрим подробнее по шагам, как настроить окружение и обойти эти ограничения.

Решение 1. Проверяем и включаем отладку на сервере 1С:Предприятия

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

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

Если сервер 1С работает под управлением Windows:

  1. Откроем редактор реестра ОС Windows. Для этого нажмите сочетание клавиш Win + R, введите regedit и нажмите Enter.
  2. Перейдем по следующему пути (ветка службы сервера 1С):
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\1C:Enterprise 8.3... (название ветки зависит от точной версии платформы).
  3. Найдем строковый параметр с именем ImagePath.
  4. Внимательно изучим значение этого параметра. Нам нужно дописать в самый конец строки запуска (после всех кавычек и существующих параметров) пробел и ключ -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:

  1. Откроем конфигурационный файл службы сервера 1С. В зависимости от дистрибутива и настроек, это может быть файл /etc/sysconfig/srv1cv83 или параметры systemd-сервиса (например, /lib/systemd/system/srv1cv83.service).
  2. Найдем переменную SRV1CV8_DEBUG и присвоим ей значение 1:
    SRV1CV8_DEBUG=1
  3. Если используется systemd, добавим параметр -debug непосредственно в строку запуска демона ragent.
  4. Выполним перезапуск службы сервера 1С с помощью команды терминала:
    systemctl restart srv1cv83

После включения отладки на сервере откроем конфигуратор, перейдем в меню Отладка — Подключение — Автоматическое подключение и установим флажки напротив пунктов Клиентские соединения на сервере и Фоновые задания.

Решение 2. Использование штатного «Режима отладки» в БСП

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

Разберем этот процесс по шагам:

  1. Запустим информационную базу в режиме «1С:Предприятие».
  2. Перейдем в раздел Администрирование — Печатные формы, отчеты и обработки — Дополнительные отчеты и обработки.
  3. Найдем в списке нашу внешнюю печатную форму и откроем её карточку.
  4. В поле Публикация выберем значение Режим отладки. Если в вашей версии БСП доступна кнопка Настройка отладки, нажмите её.
  5. Система предложит указать локальный путь к файлу обработки на компьютере разработчика. Укажем этот файл.
  6. Теперь откроем этот же файл обработки в конфигураторе, расставим нужные точки останова прямо в модуле объекта (например, в процедуре Печать()).
  7. Вернемся в режим предприятия и запустим печать документа. Система БСП перехватит вызов и выполнит код из указанного локального файла. Конфигуратор мгновенно остановит исполнение на вашей точке останова!

Решение 3. Создание вспомогательной формы («Стартера») внутри обработки

Если по какой-то причине использовать режим отладки БСП не удается (например, в старых версиях конфигураций), самым надежным и классическим способом является создание отладочной формы прямо внутри самой печатной формы.

Этот способ позволяет эмулировать вызов серверного метода печати БСП через стандартное открытие файла на клиенте. Разберем создание такого механизма подробно.

Войдем в конфигуратор и откроем нашу внешнюю обработку. Добавим в нее основную форму (назовем ее ФормаОтладки) и назначим ее основной формой обработки. Выполним следующие шаги:

  1. В данные формы добавим новый реквизит СсылкаНаДокумент. Тип реквизита должен соответствовать документу, для которого предназначена эта печатная форма (например, ДокументСсылка.РеализацияТоваровУслуг). Вынесем этот реквизит на рабочую область формы.
  2. Добавим на форму кнопку с именем ВыполнитьОтладку и создадим для нее команду.
  3. В модуле формы напишем следующий обработчик команды, который будет выполняться на сервере:

&НаКлиенте
Процедура ВыполнитьОтладку(Команда)
    ВыполнитьПечатьНаСервере();
КонецПроцедуры

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

После реализации этой формы запустим отладку следующим образом:

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

Решение 4. Использование искусственной ошибки («Хак с делением на ноль»)

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

Для этого выполним следующие действия:

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

Попытка
    ВызватьИсключениеДляОтладки = 1 / 0;
Исключение
    // Конфигуратор прервет выполнение здесь, если настроена остановка по ошибке
    ЗаписьЖурналаРегистрации("Отладка", УровеньЖурналаРегистрации.Предупреждение, , , "Точка прерывания");
КонецПопытки;
  1. В конфигураторе перейдем в меню Отладка — Настройка отладки... (или Отладка — Останавливаться по ошибкам).
  2. Установим флажок Останавливаться по ошибке. Также обязательно убедимся, что включен флажок И в случае, если ошибка обрабатывается (находится внутри блока Попытка...Исключение).
  3. Запустим печать формы из интерфейса программы. Как только система дойдет до строки с делением на ноль, конфигуратор немедленно приостановит работу системы и покажет строку кода, на которой произошел сбой. Отсюда мы сможем продолжить пошаговую отладку с помощью клавиши F10 или F11!

Решение 5. Влияние безопасного режима

Обратим внимание на важную деталь: Библиотека стандартных подсистем по умолчанию подключает любые внешние обработки с установленным флагом безопасного режима (БезопасныйРежим = Истина). В зависимости от версии платформы 1С:Предприятие, выполнение кода в безопасном режиме может накладывать жесткие ограничения на сетевую активность, работу с файловой системой и, что самое главное, на возможность интерактивной отладки кода конфигуратором.

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

ПараметрыРегистрации.Вставить("БезопасныйРежим", Ложь);

Решение 6. Переход на протокол TCP/IP при отладке

В современных версиях платформы 1С (начиная с 8.3.14) по умолчанию используется отладка по протоколу HTTP. Однако на практике сетевое окружение предприятий (активные брандмауэры, прокси-серверы, антивирусы) часто блокирует прохождение пакетов отладчика HTTP между сервером 1С и локальным компьютером разработчика.

Посмотрим, как можно решить эту проблему переключением на старый и проверенный протокол TCP/IP:

  1. В конфигураторе откроем меню Сервис — Параметры — Запуск 1С:Предприятия — Отладка.
  2. Переставим переключатель Протокол отладки в положение TCP/IP.
  3. Аналогично изменим параметры запуска сервера 1С, заменив в реестре (или файлах конфигурации Linux) ключ -http на ключ -tcp (если они были жестко заданы).
  4. Выполним перезапуск службы сервера 1С и конфигуратора, после чего проверим подключение отладчика заново.

Резюме

Мы детально проанализировали причины сбоев при отладке внешних печатных форм в среде 1С и изучили самые популярные способы обхода этой проблемы. Использование штатного режима отладки БСП или создание временной формы-стартера позволяют быстро локализовать любую программную ошибку в модуле объекта и сэкономить массу рабочего времени разработчика.

← На главную