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