Как запустить отладку внешней обработки на клиент-сервере (Linux/Windows) в 1С?

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

Отладка внешних обработок и отчетов в файловом варианте информационной базы обычно не вызывает трудностей. Однако при переходе на клиент-серверную архитектуру, особенно если сервер работает под управлением Linux, а разработка ведется на Windows, возникают специфические проблемы. Основная сложность заключается в том, что сервер 1С и Конфигуратор работают на разных машинах и видят файловую систему по-разному.

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

Понимание проблемы: почему не работает стандартная отладка?

Давайте разберемся, что происходит, когда вы подключаете внешнюю обработку в справочник "Дополнительные отчеты и обработки". Библиотека Стандартных Подсистем (БСП) при запуске такой обработки сохраняет её двоичные данные во временный файл на сервере (обычно с именем вида v8_sdr_....tmp).

Даже если вы откроете исходный файл .epf в Конфигураторе и поставите точку останова, отладчик не сопоставит этот файл с тем временным файлом, который реально исполняется сервером. Пути к файлам разные, поэтому отладка не включается.

Для успешной отладки нам необходимо обеспечить выполнение двух условий:

  1. Сервер должен исполнять код именно из того файла, который мы открыли в Конфигураторе (или его точной копии).
  2. Сервер должен быть запущен в режиме отладки с доступными портами.

Шаг 1. Настройка сервера 1С

Прежде чем приступать к коду, убедимся, что серверная часть готова к отладке. Это критически важно для клиент-серверных баз.

Если сервер работает на 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) открыты в брандмауэре/фаерволе как на сервере, так и на клиенте. Отладчик общается именно по этим портам.

Шаг 2. Метод "Обертки" (Wrapper)

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

Рассмотрим алгоритм действий для связки "Сервер Linux" + "Клиент Windows".

1. Подготовка файлов

Поместите вашу реальную обработку (например, RealProcessing.epf) в папку, доступную серверу 1С.

2. Создание обработки-обертки

Создадим новую внешнюю обработку (назовем её Wrapper.epf). В модуле объекта этой обработки напишем код, который будет инициализировать реальный файл.

Пример кода для модуля обработки-обертки:


Функция СведенияОВнешнейОбработке() Экспорт
    // Стандартная регистрация в БСП
    ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.3.1.73");
    ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительнаяОбработка();
    ПараметрыРегистрации.Версия = "1.0";
    // ВАЖНО: Безопасный режим должен быть ЛОЖЬ, иначе сервер не даст открыть внешний файл
    ПараметрыРегистрации.БезопасныйРежим = Ложь; 
    
    НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
    НоваяКоманда.Представление = "Запустить отладку";
    НоваяКоманда.Идентификатор = "RunDebug";
    НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода();
    
    Возврат ПараметрыРегистрации;
КонецФункции

Процедура ВыполнитьКоманду(ИдентификаторКоманды, ПараметрыВыполненияКоманды) Экспорт
    
    Если ИдентификаторКоманды = "RunDebug" Тогда
        // Вызываем нашу процедуру-посредник
        ВыполнитьОтладку(ПараметрыВыполненияКоманды);
    КонецЕсли;
    
КонецПроцедуры

Процедура ВыполнитьОтладку(Параметры)
    
    // ВАЖНО: Указываем путь, который видит СЕРВЕР 1С (локальный путь Linux)
    ПутьКФайлуНаСервере = "/linux/1cfiles/RealProcessing.epf";
    
    // Создаем объект внешней обработки из файла
    // Второй параметр Ложь отключает безопасный режим для загружаемой обработки
    ОбработкаНаДиске = ВнешниеОбработки.Создать(ПутьКФайлуНаСервере, Ложь);
    
    // Передаем параметры, если нужно, и вызываем экспортный метод
    // Предположим, в реальной обработке есть метод "ВыполнитьГлавноеДействие"
    ОбработкаНаДиске.ВыполнитьГлавноеДействие(Параметры);
    
КонецПроцедуры

3. Процесс отладки

  1. Загрузите Wrapper.epf в справочник "Дополнительные отчеты и обработки" в режиме 1С:Предприятие.
  2. В Конфигураторе откройте файл RealProcessing.epf (через Файл -> Открыть). Внимание: Желательно открывать тот же самый файл по сети (\\ServerLinux\share\RealProcessing.epf) или его точную локальную копию.
  3. Поставьте точку останова в модуле объекта RealProcessing.epf внутри процедуры ВыполнитьГлавноеДействие.
  4. Запустите выполнение команды из Wrapper.epf в режиме Предприятия.
  5. Сервер 1С выполнит код обертки, создаст объект из файла по пути /linux/1cfiles/... и перейдет в него. Поскольку этот же файл открыт у вас в Конфигураторе, сработает точка останова.

Разбор распространенных ошибок

В процессе обсуждения данной темы была выявлена критическая ошибка в пользовательском коде, из-за которой отладка не срабатывала даже при правильной настройке. Проанализируем её, чтобы не повторять.

Ошибка: Недостижимый код

Рассмотрим фрагмент кода, который привел к проблеме:


Процедура Обновить1(ПараметрыВыполненияКоманды) Экспорт
    
    ВО = ВнешниеОбработки.Создать("/linux/1cfiles/1.epf", Ложь);
    ВО.Обновить1(ПараметрыВыполненияКоманды);
    Возврат; // <--- Проблема здесь
        
    Сообщить("тест"); // Точка останова здесь
    
КонецПроцедуры

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

Ошибка: Безопасный режим

Обратите внимание, что при создании внешней обработки программно: ВнешниеОбработки.Создать(Путь, БезопасныйРежим), крайне важно передавать во втором параметре Ложь. Если этого не сделать, внешняя обработка запустится в безопасном режиме и может не иметь доступа к файловой системе, COM-объектам или интернету, что затруднит отладку или приведет к ошибкам выполнения.

Рекомендации для удобства

Чтобы не править код обертки каждый раз при смене пути к файлу, можно немного усовершенствовать механизм:

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

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

Резюме

Для успешной отладки внешней обработки на Linux-сервере:

  1. Включите -debug на сервере.
  2. Сделайте папку с обработкой доступной серверу по локальному пути (/mnt/... или /opt/...).
  3. Создайте простую обработку-обертку, которая вызывает ВнешниеОбработки.Создать() по серверному пути.
  4. Откройте исходный файл в Конфигураторе и ставьте точки останова в нем.
  5. Следите за потоком управления в коде — избегайте преждевременных операторов Возврат.
← На главную