Разработка и отладка внешних обработок для расчета скидок и наценок в конфигурациях на базе Библиотеки стандартных подсистем (БСП), таких как Управление торговлей 11 или Розница 2.х, имеет ряд специфических сложностей. В отличие от внешних печатных форм, которые можно запустить вручную, расчет скидок инициируется системой автоматически в определенные моменты (например, при изменении состава корзины или нажатии кнопки «Рассчитать скидки»).
Основная проблема заключается в том, что система извлекает обработку из справочника ДополнительныеОтчетыИОбработки, сохраняет ее во временный каталог с расширением .tmp и запускает именно этот временный экземпляр. В результате точки останова, расставленные в исходном .epf файле, не срабатывают. В этой статье мы разберем несколько проверенных методов, которые позволят нам «поймать» выполнение кода и успешно отладить алгоритм. Для этой задачи можно использовать набор расширений для одновременной отладки зарегистрированных в системе внешних обработок.
Проанализируем самый простой, хотя и несколько «грубый» способ, который часто выручает в условиях ограниченного времени. Если мы не знаем, в какой именно временный файл система сохраняет нашу обработку, мы можем заставить саму платформу указать нам на это место.
Для этого в начало модуля внешней обработки (например, в процедуру РассчитатьСкидки) добавим код, вызывающий заведомую ошибку:
Процедура РассчитатьСкидки(ПараметрыРасчета) Экспорт
// Намеренная ошибка для прерывания выполнения
Попытка
Число = 1 / 0;
Исключение
// Здесь выполнение остановится, если включена опция "Остановка по ошибке"
ВызватьИсключение "Отладка: мы внутри обработки!";
КонецПопытки;
КонецПроцедуры
Чтобы этот метод сработал, выполним следующие шаги:
Система выдаст сообщение об ошибке и предложит нажать кнопку Конфигуратор. После этого мы попадем в текст модуля того самого временного файла. Теперь мы можем расставлять в нем точки останова и изучать значения переменных (ПараметрыРасчета, Объект и др.) через табло.
Разберем ситуацию, когда нам мешает расширение .tmp. Платформа 1С позволяет отлаживать временные файлы, но иногда удобнее работать с привычным форматом. Мы можем временно изменить программный код конфигурации (в тестовой базе), чтобы система сохраняла обработку с расширением .epf.
Обычно за работу с внешними объектами отвечает общий модуль ДополнительныеОтчетыИОбработки. Найдем функцию, отвечающую за создание временного файла (например, ПолучитьОбъектВнешнейОбработки), и проанализируем, как формируется имя файла. Изменив расширение на .epf, мы сможем открывать эти файлы напрямую в Конфигураторе и видеть их структуру.
Рассмотрим более профессиональный подход. Чтобы не регистрировать обработку в системе после каждого изменения кода, можно использовать «эмулятор контекста». Суть метода заключается в создании внешней обработки, которая имитирует вызов со стороны системы. Для этой задачи можно использовать универсальную форму для тестирования и использования внешних обработок.
Создадим вспомогательную обработку, в которой:
ПараметрыРасчета, заполненная данными из документа.Создать объекта ВнешниеОбработки, и запускается процедура расчета.Пример кода для запуска внешней обработки с диска для отладки:
ПутьКФайлу = "C:\MyDiscounts\DiscountCalc.epf";
ОбработкаОбъект = ВнешниеОбработки.Создать(ПутьКФайлу, Ложь);
// Подготавливаем данные, которые обычно передает система
ПараметрыРасчета = Новый Структура;
ПараметрыРасчета.Вставить("Объект", ДокументСсылка);
ПараметрыРасчета.Вставить("ТаблицаТоваров", ДокументСсылка.Товары.Выгрузить());
// Вызываем основной метод
ОбработкаОбъект.РассчитатьСкидки(ПараметрыРасчета);
Этот способ позволяет использовать точки останова непосредственно в вашем исходном файле, открытом в Конфигураторе. Система будет обращаться к файлу по указанному пути, и отладка сработает мгновенно.
Выясним причину, по которой скидка может считаться неверно на реальных данных, когда под рукой нет возможности запустить отладку (например, на сервере клиента). Мы можем добавить в код внешней обработки механизм «дампа» входящих данных.
Используем ЗначениеВФайл или СериализаторXDTO, чтобы сохранить структуру параметров в XML-файл на диске в момент вызова расчета на «боевой» базе. Затем мы забираем этот файл, загружаем его в своей тестовой базе через ЗначениеИзФайла и запускаем обработку в спокойной обстановке с абсолютно теми же входными данными.
Проанализируем технические нюансы серверной отладки. Поскольку расчет скидок часто выполняется в серверном контексте, убедимся в выполнении следующих условий:
-debug. Без этого отладчик просто не «увидит» серверные вызовы.Подводя итог, можно сказать, что наиболее эффективным методом для постоянной разработки является использование обработки-эмулятора, которая вызывает файл напрямую с диска. А для быстрого поиска ошибок в уже зарегистрированной в системе обработке лучше всего подходит метод с провокацией исключения 1/0. Совместное использование этих подходов позволит вам оперативно решать задачи любой сложности при разработке систем лояльности в 1С.