Работа с внешними обработками в современных конфигурациях на базе Библиотеки стандартных подсистем (БСП), таких как ЗУП 3.1, ERP или КА 2, часто вызывает затруднения у разработчиков в части отладки. Основная сложность заключается в том, что система при выполнении команды из справочника «Дополнительные отчеты и обработки» копирует код обработки во временное хранилище или во временный файл, из-за чего точки останова в вашем исходном .epf файле просто не срабатывают.
В этой статье мы подробно разберем, как преодолеть эти ограничения. Мы проанализируем несколько проверенных методик — от простых манипуляций с формой до продвинутых способов подмены исполняемого кода, которые позволят вам эффективно находить ошибки в алгоритмах заполнения табличных частей.
Самый простой и надежный метод — это адаптация обработки для возможности её запуска как обычного файла через меню «Файл — Открыть». Рассмотрим подробнее, как это реализовать. Нам необходимо имитировать поведение БСП, которая при вызове обработки передает ей параметры и массив объектов назначения.
Разберем по шагам, что нужно сделать в модуле объекта и форме вашей обработки:
СсылкаНаОбъект с типом документа, который мы планируем заполнять (например, ДокументСсылка.НачислениеЗарплаты).ВыполнитьКоманду таким образом, чтобы она могла принимать данные как от БСП, так и из нашей отладочной формы.Проанализируем пример кода в модуле объекта:
Процедура ВыполнитьКоманду(ИмяКоманды, ОбъектыНазначения) Экспорт
// Проверим, откуда пришел вызов.
// Если ОбъектыНазначения пусто - значит, мы запустили обработку вручную через форму.
Если ОбъектыНазначения = Неопределено Или ОбъектыНазначения.Количество() = 0 Тогда
// Здесь можно вызвать исключение или просто выйти,
// но лучше предусмотреть логику открытия формы.
Возврат;
КонецЕсли;
Для Каждого ТекущийОбъект Из ОбъектыНазначения Цикл
ЗаполнитьТабличнуюЧасть(ТекущийОбъект);
КонецЦикла;
КонецПроцедуры
Процедура ЗаполнитьТабличнуюЧасть(ОбъектДокумент)
// Основная логика заполнения, где мы ставим точку останова
// Например:
Для Каждого СтрокаТЧ Из ОбъектДокумент.Зарплата Цикл
// Ваши вычисления...
КонецЦикла;
КонецПроцедуры
Теперь в модуле формы создадим команду «Запустить отладку», которая будет вызывать процедуру модуля объекта:
&НаСервере
Процедура КомандаОтладкаНаСервере()
ОбъектОбработка = РеквизитФормыВЗначение("Объект");
МассивСсылок = Новый Массив;
МассивСсылок.Добавить(Объект.СсылкаНаОбъект);
// Имитируем вызов БСП
ОбъектОбработка.ВыполнитьКоманду("ЗаполнитьТЧ", МассивСсылок);
// Если нужно вернуть данные в форму документа (если документ открыт)
// потребуется дополнительная логика оповещения форм.
КонецПроцедуры
Этот метод считается наиболее профессиональным среди опытных разработчиков 1С. Суть заключается в том, что в справочник «Дополнительные отчеты и обработки» загружается «пустышка», которая лишь перенаправляет вызов на файл, лежащий на вашем диске. Таким образом, вам не нужно каждый раз перезагружать обработку в базу при изменении кода.
Разберем, как это работает. В процедуре ВыполнитьКоманду основной обработки, зарегистрированной в системе, мы пишем следующий код:
Процедура ВыполнитьКоманду(ИмяКоманды, ОбъектыНазначения) Экспорт
ПутьКФайлу = "C:\Debug\MyProcessing.epf";
ФайлНаДиске = Новый Файл(ПутьКФайлу);
Если ФайлНаДиске.Существует() Тогда
// Создаем объект внешней обработки напрямую из файла на диске
ВнешняяОбработкаОбъект = ВнешниеОбработки.Создать(ПутьКФайлу, Ложь);
// Вызываем команду из файла на диске, передавая текущие параметры
ВнешняяОбработкаОбъект.ВыполнитьКоманду(ИмяКоманды, ОбъектыНазначения);
Иначе
ВызватьИсключение "Файл для отладки не найден по пути: " + ПутьКФайлу;
КонецЕсли;
КонецПроцедуры
Важный момент: при таком подходе точка останова должна стоять в файле C:\Debug\MyProcessing.epf. Когда система вызовет ВнешниеОбработки.Создать(), Конфигуратор поймет, что этот файл открыт, и активирует отладку.
Если вы не хотите менять код обработки, можно воспользоваться особенностью работы платформы 1С. Когда внешняя обработка запускается через БСП, она физически сохраняется в каталог временных файлов пользователя. Выясним, как поймать этот момент.
%TEMP% или Local/Temp)..epf и странным именем (например, v8_2345_12.epf). Ориентируйтесь по времени изменения файла.Этот метод удобен тем, что позволяет увидеть именно тот код, который реально выполняется на сервере в данный момент, включая все динамические изменения, если они были.
Часто программисты сталкиваются с тем, что всё настроено верно, но отладка "не цепляется". Проанализируем технические настройки, которые необходимы для корректной работы в ЗУП 3.1 (особенно в клиент-серверном варианте):
-debug. Без этого серверный код (а заполнение ТЧ почти всегда происходит на сервере) отлаживаться не будет.Если ваша обработка заполнения табличной части превращается в огромный программный комплекс, стоит рассмотреть возможность использования Расширений конфигурации. Рассмотрим преимущества этого подхода:
В расширении вы можете создать команду, которая будет отображаться в меню «Заполнение» документа так же, как и внешняя обработка. Однако код расширения является частью конфигурации. Это означает, что:
Посмотрим на пример структуры команды в расширении:
&НаСервере
Процедура Расш1_ЗаполнитьПоАлгоритму(ИмяКоманды, ПараметрыКоманды)
ДокументОбъект = ПараметрыКоманды.Источник.Объект;
// Здесь ваша логика
// Точка останова сработает мгновенно!
КонецПроцедуры
Мы проанализировали основные стратегии отладки внешних обработок в ЗУП 3.1. Для быстрой правки "на лету" лучше всего подходит метод подмены файла на диске (Способ 2). Для разовых исправлений в незнакомой базе — поиск временного файла в каталоге TEMP (Способ 3). Если же вы только начинаете разработку, заложите в архитектуру обработки отладочную форму (Способ 1), что сэкономит вам массу времени в будущем.
Помните, что качественная отладка — это залог отсутствия ошибок в расчетах заработной платы и кадровом учете, где цена ошибки крайне высока.