Отладка внешних обработок и отчетов в файловом варианте информационной базы обычно не вызывает трудностей. Однако при переходе на клиент-серверную архитектуру, особенно если сервер работает под управлением Linux, а разработка ведется на Windows, возникают специфические проблемы. Основная сложность заключается в том, что сервер 1С и Конфигуратор работают на разных машинах и видят файловую систему по-разному.
В этой статье мы подробно разберем, как правильно настроить среду и код для отладки внешних печатных форм и обработок, подключенных через БСП ("Дополнительные отчеты и обработки"), и разберем распространенные ошибки, из-за которых точки останова могут не срабатывать.
Давайте разберемся, что происходит, когда вы подключаете внешнюю обработку в справочник "Дополнительные отчеты и обработки". Библиотека Стандартных Подсистем (БСП) при запуске такой обработки сохраняет её двоичные данные во временный файл на сервере (обычно с именем вида v8_sdr_....tmp).
Даже если вы откроете исходный файл .epf в Конфигураторе и поставите точку останова, отладчик не сопоставит этот файл с тем временным файлом, который реально исполняется сервером. Пути к файлам разные, поэтому отладка не включается.
Для успешной отладки нам необходимо обеспечить выполнение двух условий:
Прежде чем приступать к коду, убедимся, что серверная часть готова к отладке. Это критически важно для клиент-серверных баз.
Если сервер работает на Linux или Windows, служба агента сервера (ragent) должна быть запущена с ключом -debug.
Для Windows проверьте параметры запуска службы в реестре. Для Linux проверьте конфигурационный файл (обычно /etc/sysconfig/srv1cv83 или юнит systemd). Строка запуска должна выглядеть примерно так:
"C:\Program Files\1cv8\bin\ragent.exe" -srvc -agent -regport 1541 -port 1540 -range 1560:1591 -d "C:\Program Files\1cv8\srvinfo" -debug
Важно: Убедитесь, что порты из диапазона -range (по умолчанию 1560:1591) открыты в брандмауэре/фаерволе как на сервере, так и на клиенте. Отладчик общается именно по этим портам.
Самый надежный способ отладки внешних обработок на сервере — это использование так называемой "обертки". Суть метода заключается в том, что мы загружаем в базу (в справочник доп. обработок) специальную версию обработки, которая не содержит полезного кода, а лишь вызывает файл, лежащий на диске.
Рассмотрим алгоритм действий для связки "Сервер Linux" + "Клиент Windows".
Поместите вашу реальную обработку (например, RealProcessing.epf) в папку, доступную серверу 1С.
/linux/1cfiles/RealProcessing.epf\\ServerLinux\share\RealProcessing.epf (или локальная копия на вашем ПК, если вы гарантируете их идентичность).Создадим новую внешнюю обработку (назовем её Wrapper.epf). В модуле объекта этой обработки напишем код, который будет инициализировать реальный файл.
Пример кода для модуля обработки-обертки:
Функция СведенияОВнешнейОбработке() Экспорт
// Стандартная регистрация в БСП
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.3.1.73");
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительнаяОбработка();
ПараметрыРегистрации.Версия = "1.0";
// ВАЖНО: Безопасный режим должен быть ЛОЖЬ, иначе сервер не даст открыть внешний файл
ПараметрыРегистрации.БезопасныйРежим = Ложь;
НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
НоваяКоманда.Представление = "Запустить отладку";
НоваяКоманда.Идентификатор = "RunDebug";
НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода();
Возврат ПараметрыРегистрации;
КонецФункции
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ПараметрыВыполненияКоманды) Экспорт
Если ИдентификаторКоманды = "RunDebug" Тогда
// Вызываем нашу процедуру-посредник
ВыполнитьОтладку(ПараметрыВыполненияКоманды);
КонецЕсли;
КонецПроцедуры
Процедура ВыполнитьОтладку(Параметры)
// ВАЖНО: Указываем путь, который видит СЕРВЕР 1С (локальный путь Linux)
ПутьКФайлуНаСервере = "/linux/1cfiles/RealProcessing.epf";
// Создаем объект внешней обработки из файла
// Второй параметр Ложь отключает безопасный режим для загружаемой обработки
ОбработкаНаДиске = ВнешниеОбработки.Создать(ПутьКФайлуНаСервере, Ложь);
// Передаем параметры, если нужно, и вызываем экспортный метод
// Предположим, в реальной обработке есть метод "ВыполнитьГлавноеДействие"
ОбработкаНаДиске.ВыполнитьГлавноеДействие(Параметры);
КонецПроцедуры
Wrapper.epf в справочник "Дополнительные отчеты и обработки" в режиме 1С:Предприятие.RealProcessing.epf (через Файл -> Открыть). Внимание: Желательно открывать тот же самый файл по сети (\\ServerLinux\share\RealProcessing.epf) или его точную локальную копию.RealProcessing.epf внутри процедуры ВыполнитьГлавноеДействие.Wrapper.epf в режиме Предприятия./linux/1cfiles/... и перейдет в него. Поскольку этот же файл открыт у вас в Конфигураторе, сработает точка останова.В процессе обсуждения данной темы была выявлена критическая ошибка в пользовательском коде, из-за которой отладка не срабатывала даже при правильной настройке. Проанализируем её, чтобы не повторять.
Рассмотрим фрагмент кода, который привел к проблеме:
Процедура Обновить1(ПараметрыВыполненияКоманды) Экспорт
ВО = ВнешниеОбработки.Создать("/linux/1cfiles/1.epf", Ложь);
ВО.Обновить1(ПараметрыВыполненияКоманды);
Возврат; // <--- Проблема здесь
Сообщить("тест"); // Точка останова здесь
КонецПроцедуры
Оператор Возврат принудительно завершает выполнение процедуры. Весь код, написанный после него (включая Сообщить и установленные точки останова), никогда не будет выполнен. Это частая ошибка невнимательности. Точку останова нужно ставить либо до оператора Возврат, либо внутри вызываемого метода ВО.Обновить1() (но уже в открытом файле внешней обработки).
Обратите внимание, что при создании внешней обработки программно: ВнешниеОбработки.Создать(Путь, БезопасныйРежим), крайне важно передавать во втором параметре Ложь. Если этого не сделать, внешняя обработка запустится в безопасном режиме и может не иметь доступа к файловой системе, COM-объектам или интернету, что затруднит отладку или приведет к ошибкам выполнения.
Чтобы не править код обертки каждый раз при смене пути к файлу, можно немного усовершенствовать механизм:
Также существуют готовые инструменты и расширения от сообщества (например, инструменты "ИР" или специальные расширения для отладки БСП), которые автоматизируют процесс подмены обработки из базы на файл с диска. Они работают по аналогичному принципу перехвата вызова, но предоставляют удобный графический интерфейс.
Для успешной отладки внешней обработки на Linux-сервере:
-debug на сервере./mnt/... или /opt/...).ВнешниеОбработки.Создать() по серверному пути.Возврат.