FAQ: Отладка правил обмена

Тема в разделе "Статьи", создана пользователем nbIpKuH_BaH9I, 9 июл 2014.

Статус темы:
Закрыта.
  1. TopicStarter Overlay
    nbIpKuH_BaH9I
    Offline

    nbIpKuH_BaH9I Модераторы Команда форума Модератор

    Регистрация:
    16 сен 2009
    Сообщения:
    8.120
    Симпатии:
    550
    Баллы:
    204
    ВНИМАНИЕ!!! Отладка не работает на платформе версии 8.3.6.2041, 8.3.6.2152, 8.3.6.1999, 8.3.6.2332. (это версии платформ, на которых точно не работает отладка. На основании этих тестов осмелюсь предположить, что отладка не работает на 8.3.6) (список будет корректироваться). На платформе 8.2 - подобных проблем замечено не было.

    И так, не для кого не секрет, что самый распространенный способ обмена данными это обмен данными по средствам XML фалов. Для тех кто не знает, постараюсь вкратце описать суть процесса. Т.к. статья посвящена другой теме, то в подробности вдаваться не будем. Т.е. есть 2 базы. Необходимо из одной выгрузить данные в другую. Будь то просто справочники или документы, не важно. Процесс настройки обмена данными происходит с помощью типовой конфигурации "Конвертация данных", а сам обмен осуществляется по правилам, которые как раз и настраиваются в конвертации. Для начала необходимо создать структуру метаданных обеих конфигураций (источника и приемника). Затем создать правила, где уже указать конфигурации источника и приемника со своими структурами. После того как правила созданы, открывается в базе источника типовая обработка «Универсальный обмен данными XML», указывается файл правил, файл для данных и данные выгружаются. Затем в конфигурации приемнике открыть эту же обработку, указать файл с выгруженными данными и загрузить. Вот и весь процесс. Самое сложное это создать и отладить правила. Особенно для тех, кто плохо в этом разбирается.

    Начну, пожалуй, со сложных правил. Есть вполне рабочие правила обмена данными, которые собирают определенные данные и преобразуют их совершенно в другие виды документов. Проблема возникает в том, что часто непонятно, что именно передается в переменные. Что делает та или иная процедура и т.д. Часто возникает ошибка, что мл переменная не определена и т.д. (Было бы прекрасно если бы можно было нажать Shift+F9 и посмотреть). Такая возможность есть, как при выгрузке, так и при загрузке. И так, в моих правилах в одном из правиле выгрузки данных, в процедуре ПередОбработкой «собираются данные, а затем выгрузка идет по определенному правилу.
    1.JPG
    Здесь я создаю структуру под названием «ИсходящиеДанныеВыпуска» и выгружаю по правилу «ОбщепитВыпускПродукции». Затем в процедуре ПередВыгрузкой правила конвертации объекта я хочу посмотреть куда вообще попала та структура, которую я уже подготовил.
    2.JPG
    Вырезка из встроенной справки по обработчикам:
    3.JPG
    В справке много параметров, которые передаются в событие, но что в них находится на определенном этапе выгрузки, это уже вопрос. Запускаем конфигуратор и предприятие в режиме отладки Для начала необходимо создать пустую внешнюю обработку, с любым названием и сохранить в любое место. И так сохраняем правила в файл, и запускаем обработку «Универсальный обмен данными XML». На вкладке Выгрузка загружаем правила, указываем файл для выгрузки и ставим флажок «Режим отладки обработчиков выгрузки» --> Настройка отладки выгрузки--> Сформировать модуль отладки выгрузки. На экране появится окно с кодом. Весь код копируем в буфер обмена, затем открываем созданную нами ранее обработку и вставляем весь код в модуль объекта и сохраняем. А в поле ввода «Имя файла внешней обработки с модулем отладки» указываем файл этой самой обработки.
    4.JPG
    Затем «Готово». Ищем в модуле объекта нашей обработки нужную строку кода и ставим точку останова.
    5.JPG
    Далее запускаем процесс выгрузки и ждем )))) Управление переходит в отладчик где уже и можно просмотреть все параметры, понять какой именно код прописать увидеть ошибку и т.д.
    6.JPG
    Процесс загрузки абсолютно идентичен… Думаю с ним вопросов не возникнет. В принципе все. Если кого, что интересует, пишите…

    Алгоритмы\Запросы

    На закладке «Алгоритмы\Запросы» может быть создан программный код или запрос, который, как правило, неоднократно используется в различных обработчиках правил обмена.
    1 (1).jpg
    Как же отладить правила в этом случае?! Как просмотреть, какие параметры передаются в Алгоритм, выполняется ли текст запроса и т.д.? Я создал алгоритм «ПроверкаНаЗаполнение» и запрос «ПолучитьКонтактнуюИнформацию». Затем в процедуре ПередОбработкой правила выгрузки данных прописал код вызова этих Алгоритмов\Запросов.
    2 (1).jpg
    Далее в базе источнике запускаю универсальную обработку. Устанавливаю галку «Режим отладки обработчиков выгрузки» --> «Настройка отладки выгрузки». Далее ВНИМАНИЕ!!! Есть 3 режима отладки кода. 1) Без отладки алгоритмов . 2) Вызывать алгоритмы как процедуры. 3) Подставлять код алгоритмов по месту вызова. Первый режим удобно использовать, когда мы точно знаем, что ошибка в обработчике не связана с кодом какого-либо алгоритма. В этом режиме код алгоритмов не выгружается в модуль отладки. Алгоритмы выполняются в контексте оператора "Выполнить()" и их код недоступен для отладки.


    Второй режим необходимо использовать в тех случаях, когда ошибка находится в коде алгоритма. При установке этого режима алгоритмы будут выгружены как отдельные процедуры. В момент вызова алгоритма из какого-либо обработчика происходит обращение к соответствующей процедуре обработки. Этот режим удобно использовать, когда для передачи параметров в алгоритмы используется глобальная переменная "Параметры". Ограничения использования этого режима в том, что при отладке в алгоритме недоступны локальные переменные обработчика, из которого он вызывается.

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

    Разберем все 3 режима на примере: 1) см. выше. Ранее я про него уже говорил. 2) Попробуем сформировать модуль отладки и проверим наши алгоритмы. Как известно, то алгоритмы используют локальные переменные модуля, из которого они вызываются. Т.е. в месте вызова алгоритма такой код:
    Код:
    Пока Выборка.Следующий() Цикл
        Выполнить(Алгоритмы.ПроверкаНаЗаполнение);
    КонецЦикла;
    А в алгоритме будет доступна переменная Выборка.
    Код:
    Если Выборка.Представление = "" Тогда
        Сообщить("У объекта: " + Выборка.Объект + " представление не заполнено...");
    КонецЕсли;
    Но когда мы сформируем модуль отладки и вставим его в модуль внешней обработки, то при сохранении у нас покажется ошибка, что переменная Выборка не обнаружена.
    3 (1).jpg
    Я в этом случае поступаю так. Может не совсем правильно, но работает. Алгоритмы - это Структура. Нужно найти место, где эта структура заполняется и добавить те параметры, которые используются в алгоритме. А именно процедура
    Код:
    Процедура Конструктор(Владелец)
    4 (1).jpg
    Затем найти процедуру с названием «Алгоритм_ПроверкаНаЗаполнение» и добавить ей тоже параметр.
    5 (1).jpg
    Тем самым обработка сохранится. Далее ставим точку останова в нужном месте и смотрим.
    6 (1).jpg
    Как видно из рисунка, то точка останова стоит в обработчике «ПередОбработкойДанных». А можно легко перейти в нужный алгоритм и просмотреть параметр, который в него передается.

    3) Пояснять, думаю, не стоит, т.к. в описании все более чем подробно написано, что это за режим. Лучше разберем на примере. Сформируем модуль отладки с режимом номер 3. Внешняя обработка сохраняется без ошибок, т.к. код алгоритма прописан непосредственно в самой процедуре вызова алгоритма.
    7.jpg
    Думаю, тут не возникнет вопросов, каким образом сработал код. В этом режиме отладке также доступны такие глобальные переменные как параметры. Проблематичность этого метода, заключается лишь в невозможности отладки при рекурсивном вызове алгоритма. (Если сказать по-простому, то это вызов процедуры самой из себя).

    С запросами вообще все просто. Во всех трех режимах запрос передается в структуру под названием Запросы. Кстати, тоже самое происходит и с алгоритмами с режимом отладки номер 1.
    8.jpg

    Отладка правил обмена платформы 7.7

    Отладка правил обмена на версии платформы 7.7 происходит гораздо легче, нежели на 8. Причина всему то, что при сохранении правил обмена для версии 7.7 необходимо также указать путь к файлу для выгрузки модуля обработки выгрузки данных.
    Сохранение.png
    По выбранному пути на жестком диске будет создан файл txt. В моем случае его название "МодульВыгрузки.txt". Далее открываем конфигуратор 1С:Предприятие 7.7. Открываем типовую обработку V77Exp.ert. (Универсальная выгрузка данных в формате XML (2.1.7)) открываем ее модуль и полностью заменяем на тот программный код, который сформировался в файле "МодульВыгрузки.txt". Сохраняем. Запускаем 1С в режиме отладки, открываем только что созданную обработку, находим нужный кусок кода, ставим точку останова и далее уже в предприятии запускаем выгрузку данных через эту же обработку. Управление перейдет в отладчик. Вот и все.

    P.S. Для быстроты тестирования правил обмена расскажу про одну хитрость. В модуле обработки V77Exp.ert не обязательно каждый раз вставлять программый код, созданный конвертаций. Достаточно в модуле прописать лишь одну строчку
    Код:
    #ЗагрузитьИзФайла D:\МодульВыгрузки.txt
    Я думаю понятно, что после #ЗагрузитьИзФайла нужно указать полное имя файла. Отладка конечно в этом случае будет невозможна, но зато это гораздо ускоряет процесс.

    Возможно, кому-то будет полезна эта статья с ИТС.

    На этом все.
    Все обсуждения на эту тему вести здесь
    Последнее редактирование: 29 апр 2016
    kinlex, VitalPr, Yakov и 4 другим нравится это.
Статус темы:
Закрыта.