Как эффективно отладить внешнюю обработку расчета скидок в 1С:Управление торговлей 11

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

Разработка и отладка внешних обработок для расчета скидок и наценок в конфигурациях на базе Библиотеки стандартных подсистем (БСП), таких как Управление торговлей 11 или Розница 2.х, имеет ряд специфических сложностей. В отличие от внешних печатных форм, которые можно запустить вручную, расчет скидок инициируется системой автоматически в определенные моменты (например, при изменении состава корзины или нажатии кнопки «Рассчитать скидки»).

Основная проблема заключается в том, что система извлекает обработку из справочника ДополнительныеОтчетыИОбработки, сохраняет ее во временный каталог с расширением .tmp и запускает именно этот временный экземпляр. В результате точки останова, расставленные в исходном .epf файле, не срабатывают. В этой статье мы разберем несколько проверенных методов, которые позволят нам «поймать» выполнение кода и успешно отладить алгоритм. Для этой задачи можно использовать набор расширений для одновременной отладки зарегистрированных в системе внешних обработок.

Метод 1: Провокация ошибки для перехода в конфигуратор

Проанализируем самый простой, хотя и несколько «грубый» способ, который часто выручает в условиях ограниченного времени. Если мы не знаем, в какой именно временный файл система сохраняет нашу обработку, мы можем заставить саму платформу указать нам на это место.

Для этого в начало модуля внешней обработки (например, в процедуру РассчитатьСкидки) добавим код, вызывающий заведомую ошибку:


Процедура РассчитатьСкидки(ПараметрыРасчета) Экспорт
    // Намеренная ошибка для прерывания выполнения
    Попытка
        Число = 1 / 0;
    Исключение
        // Здесь выполнение остановится, если включена опция "Остановка по ошибке"
        ВызватьИсключение "Отладка: мы внутри обработки!";
    КонецПопытки;
КонецПроцедуры

Чтобы этот метод сработал, выполним следующие шаги:

  1. Запустим 1С:Предприятие в режиме отладки.
  2. В Конфигураторе выберем пункт меню Отладка – Остановка по ошибке.
  3. Установим флажок Останавливаться по ошибке.
  4. Выполним в программе действие, вызывающее расчет скидок.

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

Метод 2: Модификация БСП для работы с нормальным расширением

Разберем ситуацию, когда нам мешает расширение .tmp. Платформа 1С позволяет отлаживать временные файлы, но иногда удобнее работать с привычным форматом. Мы можем временно изменить программный код конфигурации (в тестовой базе), чтобы система сохраняла обработку с расширением .epf.

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

Метод 3: Использование специализированной обработки-отладчика

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

Создадим вспомогательную обработку, в которой:

  1. Выбирается файл нашей разрабатываемой обработки скидок с диска.
  2. Выбирается документ-основание (например, Заказ клиента).
  3. Формируется структура ПараметрыРасчета, заполненная данными из документа.
  4. Вызывается метод Создать объекта ВнешниеОбработки, и запускается процедура расчета.

Пример кода для запуска внешней обработки с диска для отладки:


ПутьКФайлу = "C:\MyDiscounts\DiscountCalc.epf";
ОбработкаОбъект = ВнешниеОбработки.Создать(ПутьКФайлу, Ложь);
// Подготавливаем данные, которые обычно передает система
ПараметрыРасчета = Новый Структура;
ПараметрыРасчета.Вставить("Объект", ДокументСсылка);
ПараметрыРасчета.Вставить("ТаблицаТоваров", ДокументСсылка.Товары.Выгрузить());

// Вызываем основной метод
ОбработкаОбъект.РассчитатьСкидки(ПараметрыРасчета);

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

Метод 4: Сериализация контекста (Сохранение данных в файл)

Выясним причину, по которой скидка может считаться неверно на реальных данных, когда под рукой нет возможности запустить отладку (например, на сервере клиента). Мы можем добавить в код внешней обработки механизм «дампа» входящих данных.

Используем ЗначениеВФайл или СериализаторXDTO, чтобы сохранить структуру параметров в XML-файл на диске в момент вызова расчета на «боевой» базе. Затем мы забираем этот файл, загружаем его в своей тестовой базе через ЗначениеИзФайла и запускаем обработку в спокойной обстановке с абсолютно теми же входными данными.

Важные настройки сервера для отладки

Проанализируем технические нюансы серверной отладки. Поскольку расчет скидок часто выполняется в серверном контексте, убедимся в выполнении следующих условий:

Подводя итог, можно сказать, что наиболее эффективным методом для постоянной разработки является использование обработки-эмулятора, которая вызывает файл напрямую с диска. А для быстрого поиска ошибок в уже зарегистрированной в системе обработке лучше всего подходит метод с провокацией исключения 1/0. Совместное использование этих подходов позволит вам оперативно решать задачи любой сложности при разработке систем лояльности в 1С.

← На главную