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

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

ВНИМАНИЕ!!! Отладка не работает на платформе версии 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 и посмотреть). Такая возможность есть, как при выгрузке, так и при загрузке. Итак, в моих правилах в одном из правил выгрузки данных, в процедуре ПередОбработкой «собираются данные, а затем выгрузка идет по определенному правилу.

Здесь я создаю структуру под названием «ИсходящиеДанныеВыпуска» и выгружаю по правилу «ОбщепитВыпускПродукции». Затем в процедуре ПередВыгрузкой правила конвертации объекта я хочу посмотреть, куда вообще попала та структура, которую я уже подготовил.

Вырезка из встроенной справки по обработчикам:

В справке много параметров, которые передаются в событие, но что в них находится на определенном этапе выгрузки, это уже вопрос.  Запускаем конфигуратор и предприятие в режиме отладки Для начала необходимо создать пустую внешнюю обработку, с любым названием, и сохранить в любое место. Итак, сохраняем правила в файл и запускаем обработку «Универсальный обмен данными XML». На вкладке Выгрузка загружаем правила, указываем файл для выгрузки и ставим флажок «Режим отладки обработчиков выгрузки» —> Настройка отладки выгрузки—> Сформировать модуль отладки выгрузки. На экране появится окно с кодом. Весь код копируем в буфер обмена, затем открываем созданную нами ранее обработку, вставляем весь код в модуль объекта и сохраняем. А в поле ввода «Имя файла внешней обработки с модулем отладки» указываем файл этой самой обработки.

Затем «Готово». Ищем в модуле объекта нашей обработки нужную строку кода и ставим точку останова.

Далее запускаем процесс выгрузки и ждем )))) Управление переходит в отладчик, где уже и можно просмотреть все параметры, понять, какой именно код прописать, увидеть ошибку и т.д.

Процесс загрузки абсолютно идентичен… Думаю, с ним вопросов не возникнет. В принципе все. Если кого что интересует, пишите…

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

На закладке «АлгоритмыЗапросы» может быть создан программный код или запрос, который, как правило,  неоднократно используется в различных обработчиках правил обмена. 

Как же отладить правила в этом случае?! Как просмотреть, какие параметры передаются в Алгоритм, выполняется ли текст запроса и т.д.? Я создал алгоритм «ПроверкаНаЗаполнение» и запрос «ПолучитьКонтактнуюИнформацию». Затем в процедуре ПередОбработкой правила выгрузки данных прописал код вызова этих АлгоритмовЗапросов.

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

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

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

Разберем все 3 режима на примере: 1) см. выше. Ранее я про него уже говорил. 2) Попробуем сформировать модуль отладки и проверим наши алгоритмы. Как известно, то алгоритмы используют локальные переменные модуля, из которого они вызываются. Т.е. в месте вызова алгоритма такой код: 

Пока Выборка.Следующий() Цикл
Выполнить(Алгоритмы.ПроверкаНаЗаполнение);
КонецЦикла;

 А в алгоритме будет доступна переменная Выборка.

Если Выборка.Представление = "" Тогда
Сообщить("У объекта: " + Выборка.Объект + " представление не заполнено...");
КонецЕсли;

Но когда мы сформируем модуль отладки и вставим его в модуль внешней обработки, то при сохранении у нас покажется ошибка, что переменная Выборка не обнаружена. 

Я в этом случае поступаю так. Может не совсем правильно, но работает. Алгоритмы — это Структура. Нужно найти место, где эта структура заполняется и добавить те параметры, которые используются в алгоритме. А именно процедура 

Процедура Конструктор(Владелец)

Затем найти процедуру с названием «Алгоритм_ПроверкаНаЗаполнение» и добавить ей тоже параметр.

 

Тем самым обработка сохранится. Далее ставим точку останова в нужном месте и смотрим. 

Как видно из рисунка, то точка останова стоит в обработчике «ПередОбработкойДанных». А можно легко перейти в нужный алгоритм и просмотреть параметр, который в него передается.

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

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

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

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

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

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

P.S. Для быстроты тестирования правил обмена расскажу про одну хитрость. В модуле обработки V77Exp.ert не обязательно каждый раз вставлять программый код, созданный конвертаций. Достаточно в модуле прописать лишь одну строчку

#ЗагрузитьИзФайла D:МодульВыгрузки.txt

Я думаю понятно, что после #ЗагрузитьИзФайла нужно указать полное имя файла. Отладка конечно в этом случае будет невозможна, но зато это гораздо ускоряет процесс.

Возможно, кому-то будет полезна статья с ИТС. http://its.1c.ru/db/metod8dev#content:2942:hdoc

На этом все. Всем спасибо, все свободны )))))

70 Comments

  1. davdykin

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

    Reply
  2. pyrkin_vanya

    (1) davdykin, Поясните пожалуйста. Что значит загруженные обработки? А то я с первого раза хреного понимаю xDDD

    Reply
  3. Артано

    (1) davdykin, для семерки они еще необходимы. А для 8x — зачем, если весь код, с учетом совместимости платформ, будет браться непосредственно из файла XML?

    (0) Автор, тема интересная и для многих снимет ряд вопросов по созданию и поддержке правил. Но убедительная просьба поправьте хотя бы орфографию. Кровь заливающая глаза мешает вдумчивому чтению.

    по средствам чего либо

    вместо посредством чего либо.

    в кратце

    вместо вкратце

    Reply
  4. pyrkin_vanya

    (3) Артано, Прошу прощения за ошибки. На работе просто статью писал. Торопился.

    Reply
  5. pyrkin_vanya

    (3) Артано, прошу прощения. А где Вы у меня ошибки то нашли? У меня нет таких в этой статье…

    Reply
  6. jamirza

    (5) ctrl+F используй

    Reply
  7. i132

    Чтобы посмотреть какие параметры попадают в конкретный обработчик правил и стек вызовов я иногда специально в текст обработчика добавляю синтаксическую ошибку и отладчику ставлю галочку останавливаться по ошибке

    Reply
  8. help1Ckr

    Спасибо огромное за статью, Вы очень помогли

    Reply
  9. Vita703

    Спасибо. Всегда мучалась, что не могу поймать ошибку, а тут так всё просто и легко!!

    Reply
  10. davdykin

    (3) Артано, Если чего-нибудь мудреное пишешь, гораздо проще писать и отлаживать в обработке, чем в КД.

    Reply
  11. pyrkin_vanya

    (6) jamirza, Вы не поверите, я именно так и делал. Только вот ошибки в своем тексте я не заметил. Именно эти слова написаны правильно. Конечно, может ее кто за меня поправил…

    Reply
  12. pyrkin_vanya

    (7) i132, можно и так тоже. Просто решил написать, так сказать, основы. А вообще самый простой способ и быстрый, это простое использование Сообщить();

    Reply
  13. 1cvirus

    «по средствам XML фалов» — исправьте на «посредством XML файлов»

    Reply
  14. fomix

    Использование функции «Сообщить()» в тексте обработчиков бывает полезно, когда отлаживаешь простые правила. А описанный автором способ отладки в разы сокращает время отладки «навороченных» правил обмена. Так что, автору однозначно +. И еще совет: перед публикацией статьи проверять ее текст хотя бы в MS Word, тогда не будет шовинистических нападок и ценность статьи увеличится…

    Reply
  15. glek

    Шикарно. То, что надо

    Reply
  16. DAnry

    Дякую, друже.

    Reply
  17. pyrkin_vanya

    (16) DAnry, Нема за що. Правильно же написал? ))))

    Reply
  18. ivanov660
    Процесс загрузки абсолютно идентичен… Думаю с ним вопросов не возникнет. В принципе все. Если кого, что интересует, пишите…

    Вот и нет, как на счет режима выгрузка on-line?

    Что не рассказали про различные режимы выгрузки отладки кода?

    Reply
  19. pyrkin_vanya

    (18) ivanov660, как время будет обязательно отредактирую статью.

    Reply
  20. LexSeIch

    Мир этому дому!

    Статья интересная и полезная. Крупицы чужого опыта часто помогают решать собственные большие проблемы…

    Reply
  21. Созинов

    То что доктор прописал. Для новичков в самый раз. Спасибо.

    Reply
  22. KliMich

    Спасибо за интересную статью! Здорово!

    Reply
  23. russinow

    тщательно сохраню в эверноут. Бо такие статьи зело полезны и поучительны есть )))

    Reply
  24. pyrkin_vanya

    (23) russinow, Чеееееего? У меня, видимо, фигово с пониманием сейчас…

    Reply
  25. Algiz

    спс:)

    (24)в сервис хранения заметок — evernote

    Reply
  26. RimidalV

    Отличная статья, некоторые вопросы недопонимал 🙂 теперь все стало на свои места.

    Reply
  27. andrey314

    А где бы покурить о последовательности вызовов обработчиков: ПКО, ПКС и т.д.? И вообще документация какая есть по конвертации?

    Reply
  28. pyrkin_vanya

    (27) andrey314, есть книга. А также встроенная справка. В ней много чего хорошего.

    Reply
  29. pt_olga

    (23) russinow, эверноут не люблю, по остальному согласна

    плюс за то, что было не лень написать эту статью для новичков и вообще))

    Reply
  30. Zas1402

    Огромное, спасибо за статью.

    Reply
  31. knigina

    А я по образованию программист, а по факту уже 15 лет бухгалтер и все свои мелкие вопросики по 1С решаю сама. Эта статья для меня! Спасибо. Читать серьезные книжки по 1С нет ни времени, ни возможности. А это как раз то, что нужно. Совсем недавно, готовясь к переходу на БП 3.0, репетировала обмен с УТ. Штатный вариант меня не устроил, пришлось разбираться с конвертацией и регистрацией. Вот, мне в тему…

    Reply
  32. DoctorRoza

    Хорошо написано, возьму на заметку! 🙂

    Reply
  33. xten

    Хорошая статься, большое спасибо ! ))

    Reply
  34. acanta

    Спасибо за статью, даже для новичка наступает просветление!

    Reply
  35. chev

    Спасибо за статью. Вот теперь многое становится понятно.

    Reply
  36. maclen_mmv

    Спасибо за познавательную статью…

    Reply
  37. Ele1234567

    Замечательная статья, возьму на заметку!

    Reply
  38. lesenoklenok

    Спасибо большое за статью

    Reply
  39. lonsby

    Отличная статья, большое спасибо, узнал много нового.

    Reply
  40. Andrey@

    Забавная статья, надо будет попробовать этот метод проверки, когда столкнусь с обменом XML. Спасибо автору.

    Reply
  41. yyx

    А я не понял как пользоваться — при сохранении ошибка:

    Переменная не определена (Источник)…

    Переменная не определена (СоздатьВидНоменклатуры_Номенклатура)…

    Reply
  42. pyrkin_vanya

    (42) yyx, Значит сделали что то не так как в моей статье. Внимательнее еще раз прочитайте.

    Reply
  43. werwolf_666999

    Познавательная статья!

    Reply
  44. serg_prom

    Плюсую. Чужой опыт не бывает лишним.

    Reply
  45. vikips

    У меня почему то, не останавливается на точке останова, хотя делаю по инструкции, как будто не входит во внешную обработку, хотя раньше все получалось, раньше платформа была другая, а сейчас 8.3.6, в чем проблема не понятно

    Reply
  46. pyrkin_vanya

    (46) vikips, я Вам уже написал на другом форуме. Давайте там вести обсуждение.

    Reply
  47. Star_SU

    Точка останова при отладке не срабатывае — думаю из-за того, что после формирования модуля отладки выгрузки приходится из-за сообщеения «Необходимо перезагрузить правила обмена для выгрузки данных.» перезагружаю правила обмена.

    Может знаете как быть в этой ситуации?

    Reply
  48. pyrkin_vanya

    (48) Star_SU, Да, правила обмена необходимо перезагрузить. Это нормально. Перезагружаете и все нормально должно быть. Проверьте версию вашей платформы. На платформе 8.3.6.2041 например, отладка не работает. На 8.2 таких проблем я не замечал.

    Reply
  49. AnotherSide

    Под 8.3.6.2152 тоже, видимо, отладка не работает. Уже все перепробовали… Какой последний стабильный релиз для отладки?

    Reply
  50. pyrkin_vanya

    К сожалению на 8.3 дальше чем на 8.3.6.2041 не проверял. Сейчас Вы пишите, что и на 8.3.6.2152 аналогичные проблемы. Запустите на 8.2. Отладьте и все.

    Reply
  51. Дмитрий74Чел

    Вопросы отладки хорошо рассмотрены в курсе http:// /data-conv/ (не рекламы ради, а знаний для).

    Reply
  52. tormozit

    Добавили более удобную возможность отладки правил конвертации по второму режиму в наш платный продукт https://www.youtube.com/watch?v=KzabP0ccliU (рекламы ради).

    Reply
  53. demon_infernal

    А если использовать GCOMP — то не придется вручную копировать тексты модулей обработки выгрузкизагрузки на платформе 7.7 в модули обработок, GCOPM соберет все за вас автоматически.

    Reply
  54. pyrkin_vanya

    (54) demon_infernal, для сего использовать лишнее ПО если все делается одной строчкой кода и ничего не нужно копировать. В сьатье же все указал.

    Reply
  55. kasper076

    Что касается отладки на 8.3.6. При записи файла с модулем обработка убегает на сервер и сохраняет там временный файл. А затем возвращается и проверяет его наличие на клиенте.

    &НаСервере
    Процедура ВыгрузитьОбработчикиСобытийНаСервере(Отказ)
    
    ОбъектДляСервера = РеквизитФормыВЗначение(«Объект»);
    ЗаполнитьЗначенияСвойств(ОбъектДляСервера, Объект);
    ОбъектДляСервера.ВыгрузитьОбработчикиСобытий(Отказ);
    ЗначениеВРеквизитФормы(ОбъектДляСервера, «Объект»);
    
    КонецПроцедуры
    
    &НаКлиенте
    Процедура ПоказатьОбработчикиСобытийВОкне()
    
    ФайлОбработчиков = Новый Файл(Объект.ИмяВременногоФайлаОбработчиковСобытий);
    Если ФайлОбработчиков.Существует() И ФайлОбработчиков.Размер() <> 0 Тогда
    ТекстовыйДокумент = Новый ТекстовыйДокумент;
    ТекстовыйДокумент.Прочитать(Объект.ИмяВременногоФайлаОбработчиковСобытий);
    ТекстовыйДокумент.Показать(Нстр(«ru = ‘Модуль отладки обработчиков'»));
    КонецЕсли;
    
    ФайлОшибок = Новый Файл(Объект.ИмяВременногоФайлаПротоколаОбмена);
    Если ФайлОшибок.Существует() И ФайлОшибок.Размер() <> 0 Тогда
    ТекстовыйДокумент = Новый ТекстовыйДокумент;
    ТекстовыйДокумент.Прочитать(Объект.ИмяВременногоФайлаОбработчиковСобытий);
    ТекстовыйДокумент.Показать(Нстр(«ru = ‘Ошибки выгрузки модуля обработчиков'»));
    КонецЕсли;
    
    КонецПроцедуры
    

    Показать

    И если клиент и сервер это две разные машины, то конечно ничего не находится.

    Это норма? (с) Или я чего-то не понимаю?

    Reply
  56. pyrkin_vanya

    (56) kasper076, вообще не понимаю о чем Вы.

    Reply
  57. kasper076

    (57) как видно из кода, процедура

    &НаСервере
    Процедура ВыгрузитьОбработчикиСобытийНаСервере(Отказ)

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

    Reply
  58. pyrkin_vanya

    (58) kasper076, не важно. В файловом варианте также не работает отладка на 8.3.

    Reply
  59. qwest

    Не совсем верно. На 8.3.5 отладка работает. Не работает именно в 8.3.6.

    Reply
  60. pyrkin_vanya

    (60) qwest, Спасибо.

    Reply
  61. garik79

    На 8.3.7 работает

    Reply
  62. AlexLM75

    Спасибо за статью. В свое время самостоятельно изучал данные возможности при разработке обмена. Сейчас убедился, что использовал их правильно))

    Reply
  63. hamec

    (62) garik79, Добрый день.

    А не подскажете как у вас получилось запустить отладку на 8.3.7.

    Делал все по данному мануалу и плюс статья ИТС.

    Использую обработку выгрузки/загрузки версии 2.1.8.

    Выгрузил модуль по 3-ему способу, создал обработку новую, подставил ее, но в конфигураторе ну никак не хочет останавливаться по точке.

    Reply
  64. pyrkin_vanya

    (64) hamec, лично я не проверял работоспособность на 8.3.7. Поверил на слово garik79. Проверю чуть позже.

    Reply
  65. pyrkin_vanya

    Только что проверил на 8.3.7.1776. Отладка не работает.

    Reply
  66. hamec

    Спасибо вам за ответ.

    А может быть тогда подскажете, как отлаживать правила выгрузки предназначенные для конфигураций последних редакций БП 3, УТ 11, КА 2

    Reply
  67. pyrkin_vanya

    (67) hamec, ну на сколько я знаю, то только ждать пока сей недочет поправят в новых версиях платформы. Как коллеги сообщают, то на 8.3.5 отладка работает. Опять же у Вас все в руках. Методом тыка попробуйте разные версии платформ. Не думаю, что это будет уж прям огромное значение иметь на работу самой конфигурации, разве что парочки методов не будет найдено и все.

    Reply
  68. astrot

    Для тех у кого не работает отладка в 8.3.7, 8.3.8(8.3.6 не проверял). Необходимо сменить механизм отладки на HTTP. Инструкция по адресу http://v8.1c.ru/o7/201506debug/index.htm. После настройки механизма идем в конфигураторе в меню Отладка->Подключение-> Автоматическое подключение, выбираем нужное и вуаля — все заработало.

    З.Ы. Возможно ошибка связанна с используемой операционной системой. На WinXP отладка заработала без смены механизма, на Win10 не захотела.

    Reply
  69. flax

    (3) Артано, Вы в самом начале поправляете автора!) И видимо не очень хорошо знаете сами:

    Вкратце. это наречие ( предлоги с наречиями пишутся СЛИТНО)

    1. Посредством электронной связи = при помощи электронной связи

    2. По средствам (кому-либо/чему-либо) = (кто-то/что-то) может себе позволить.. .(а дальше по смыслу, что именно может себе позволить)

    Reply
  70. citicat

    Спасибо за методику отладки! С примерами, которые помогают методику понять.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *