Как отладить внешнюю подключаемую обработку заполнения табличной части в 1С 8.3?

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

Разработка внешних подключаемых обработок для заполнения табличных частей документов — стандартная задача для разработчика 1С. Однако на этапе тестирования и отладки кода многие сталкиваются с серьезной трудностью: точки останова в модуле внешней обработки просто не срабатывают. Выясним причину этой проблемы и подробно рассмотрим самые эффективные способы ее решения без внесения изменений в основную конфигурацию.

Почему не работают стандартные точки останова?

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

  1. Извлекает двоичные данные файла .epf из базы данных.
  2. Помещает их во временное хранилище или сохраняет во временный файл на диске с уникальным сгенерированным именем.
  3. Подключает обработку в сеансе с помощью метода ВнешниеОбработки.Подключить().

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

Способ 1. Использование временной подмены кода в модуле БСП

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

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

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

Посмотрим на пример реализации такой подмены:


// Оригинальный код БСП:
// Возврат ВнешниеОбработки.Подключить(АдресХранилища, ИмяПодключения, БезопасныйРежим);

// Наш код для отладки:
ПутьКФайлу = "C:\1C_Develop\MyFillProcessing.epf";
Возврат ВнешниеОбработки.Создать(ПутьКФайлу, Ложь);

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

Способ 2. Создание вспомогательной обработки-стартера

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

Для реализации этого метода выполним следующие шаги:

  1. Создадим новую внешнюю обработку и назовем ее "Стартер".
  2. Добавим на ее форму реквизит ДокументСсылка (ссылка на документ, ТЧ которого мы планируем заполнить) и кнопку "Запустить отладку".
  3. В модуле формы стартера напишем код, который подключает нашу разрабатываемую обработку с жесткого диска и имитирует передачу параметров БСП.

Проанализируем пример кода для серверного обработчика кнопки "Запустить отладку":


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

Запустите сеанс "1С:Предприятие", откройте обработку-стартер через стандартное меню Файл -> Открыть, выберите тестовый документ и нажмите кнопку запуска. Точки останова внутри модуля разрабатываемой обработки сработают мгновенно.

Способ 3. Внедрение тестовой формы в разрабатываемую обработку

Этот способ похож на предыдущий, но избавляет от необходимости создавать второй файл. Мы можем внедрить механизм запуска прямо внутрь самой разрабатываемой обработки.

Рассмотрим по шагам, как это реализовать:

  1. Добавим во внешнюю обработку заполнения управляемую форму и назначим ее Основной формой обработки.
  2. На форму поместим поле выбора документа-цели и кнопку запуска.
  3. В модуле этой формы опишем вызов основного алгоритма заполнения, передав туда выбранный документ.
  4. После завершения разработки и отладки перед загрузкой обработки в рабочую базу просто удалим эту форму или снимем с нее статус основной.

Такой подход делает обработку полностью автономной на этапе разработки, позволяя запускать ее как обычный файл через меню Файл -> Открыть в любом тестовом сеансе.

Способ 4. Использование расширения конфигурации

Если основная конфигурация находится на поддержке и менять ее модули напрямую нельзя, идеальным решением станет использование механизма расширений. Мы можем перехватить вызов БСП с помощью аннотации &Вместо.

Рассмотрим пример перехвата функции подключения обработки в расширении:


&Вместо("ПодключитьВнешнююОбработку")
Функция Моя_ПодключитьВнешнююОбработку(ПараметрыПодключения)
    
    Если ПараметрыПодключения.ИмяИсполняемогоФайла = "ИмяНашейОбработки" Тогда
        // Подставляем локальный путь для отладки
        Возврат ВнешниеОбработки.Создать("C:\1C_Develop\MyFillProcessing.epf", Ложь);
    КонецЕсли;
    
    // Для остальных обработок вызываем стандартное поведение БСП
    Возврат ПродолжитьВызов(ПараметрыПодключения);
    
КонецФункции

Использование расширений позволяет безопасно вести разработку на рабочих копиях баз данных, не влияя на общие процессы других пользователей конфигурации.

Способ 5. Отладка фоновых заданий через "/C РежимОтладки"

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

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

  1. В Конфигураторе откроем меню Сервис -> Параметры.
  2. Перейдем на вкладку Запуск 1С:Предприятия, затем на вкладку Основные.
  3. В поле Параметры запуска пропишем латинскими буквами: /C РежимОтладки.

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

Способ 6. Использование "Инструментов разработчика"

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

← На главную