Разработка дополнительных отчетов и обработок в среде 1С:Предприятие 8.3 — стандартная задача для любого программиста. Однако на этапе тестирования многие начинающие специалисты сталкиваются с крайне неприятной проблемой: отладчик в Конфигураторе упорно отказывается заходить в процедуры и функции, выполняемые под директивой &НаСервере. Точки останова в серверном коде остаются "пустыми", а выполнение программы проходит мимо них, даже если мы открываем обработку напрямую через меню "Файл — Открыть".
В этой статье мы подробно разберем, почему возникает эта проблема, проанализируем архитектурные особенности выполнения кода в клиент-серверном режиме и пошагово настроим рабочее окружение для полноценной отладки.
Для начала разберем типичную ошибку, которую совершают многие разработчики. Прописав параметр запуска -debug в ярлыке клиентского приложения 1С на своей рабочей станции, мы включаем отладку только для клиентского сеанса. Это позволяет нам отлаживать код, исполняемый непосредственно на компьютере пользователя (под директивой &НаКлиенте).
Однако в клиент-серверном варианте работы базы данных вся логика, помеченная как &НаСервере, отправляется на выполнение серверу приложений 1С. Если сам сервер 1С запущен в обычном (не отладочном) режиме, он ничего "не знает" о точках останова в вашем Конфигураторе. В результате серверный код выполняется, но отладчик не может перехватить этот процесс. Чтобы исправить это, нам необходимо принудительно запустить службу сервера 1С с разрешением на отладку.
Рассмотрим стандартный сценарий, когда сервер приложений 1С функционирует под управлением операционной системы Windows в качестве системной службы. Для включения отладки нам понадобятся права администратора на сервере.
services.msc) и найдем службу сервера 1С. Обычно она называется 1C:Enterprise 8.3 Server Agent (или аналогично, в зависимости от версии платформы). Остановим эту службу.regedit и нажмем Enter.HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\1C:Enterprise 8.3 Server Agent... (в конце пути будет указана конкретная версия вашей платформы).ImagePath. Он содержит строку запуска службы. Дважды кликнем по нему для редактирования.-debug. Будьте внимательны: не удаляйте существующие параметры, просто добавьте ключ в конец строки.После проведения этих манипуляций сервер 1С начнет транслировать отладочную информацию, и Конфигуратор сможет перехватывать серверные процедуры.
Если сервер приложений 1С развернут на операционной системе семейства Linux, процесс настройки выглядит иначе. Здесь параметры работы службы определяются в конфигурационном файле.
/etc/sysconfig/srv1cv83 или /etc/default/srv1cv83.SRV1CV8_DEBUG.SRV1CV8_DEBUG=1 (в некоторых версиях может потребоваться написать SRV1CV8_DEBUG=true).systemctl restart srv1cv83 (или соответствующей команды для вашего дистрибутива).Даже при включенной отладке на сервере вы можете столкнуться с тем, что точки останова внутри дополнительной обработки, зарегистрированной в справочнике "Дополнительные отчеты и обработки", все равно не срабатывают. Разберем, почему это происходит.
Когда вы регистрируете внешнюю обработку в системе, БСП сохраняет файл .epf как двоичные данные непосредственно в базу данных. В момент интерактивного запуска система динамически выгружает эти данные во временное хранилище на сервере и выполняет обработку оттуда. Конфигуратор не может сопоставить динамически созданный в памяти объект с тем физическим файлом на вашем диске, в котором вы расставили точки останова.
Для решения этой проблемы мы можем использовать несколько эффективных приемов.
В современных конфигурациях разработчики БСП предусмотрели штатную возможность тестирования внешних обработок без их постоянного импорта в базу данных:
ДополнительныеОтчетыИОбработки.Если нам необходимо регулярно и быстро отлаживать сложный серверный код во внешнем файле, отличным решением будет создание вспомогательной обработки-стартера. Этот инструмент будет программно подключать наш рабочий файл с диска напрямую. Проанализируем пример кода для такого стартера:
&НаСервере
Процедура ЗапуститьОбработкуНаСервере()
// Отключаем предупреждения безопасности для удобства разработки
ОписаниеЗащиты = Новый ОписаниеЗащитыОтОпасныхДействий;
ОписаниеЗащиты.ПредупреждатьОбОпасныхДействиях = Ложь;
// Путь к файлу обработки на диске, обязательно доступный серверу 1С!
ПутьКФайлу = "C:\Development\MyExternalProcessing.epf";
// Подключаем внешнюю обработку напрямую
ИмяОбработки = ВнешниеОбработки.Подключить(ПутьКФайлу, , Ложь, ОписаниеЗащиты);
ОбъектОбработки = ВнешниеОбработки.Создать(ИмяОбработки, Ложь);
// Вызываем нужный экспортный метод модуля объекта для отладки
ОбъектОбработки.ВыполнитьПолезнуюРаботуНаСервере();
КонецПроцедуры
Поскольку при таком подходе база данных создает объект непосредственно из указанного физического пути на диске, отладчик Конфигуратора моментально сопоставит выполняемый контекст с открытым модулем и остановит выполнение на нужной строке.
Очень часто дополнительные обработки (особенно регламентные задачи или ресурсоемкие процедуры заполнения данных) выполняются асинхронно — в фоновых заданиях. По умолчанию отладчик их игнорирует, даже если режим -debug на сервере включен.
Настроим автоматическое подключение к фоновым заданиям:
Теперь при запуске фонового процесса сервер передаст управление отладчику, и мы сможем пошагово отследить выполнение алгоритма внутри фонового задания.
Если у вас есть возможность выполнять разработку на локальной копии базы данных, мы настоятельно рекомендуем использовать файловый режим работы. В файловой базе данных клиентское приложение и серверная часть работают внутри одного локального процесса на вашем компьютере. В этом случае сложная настройка служб, редактирование реестра Windows и проброс портов в брандмауэре не требуются — отладка как клиентского, так и серверного кода во внешних файлах работает "из коробки" без каких-либо дополнительных усилий.