Неожиданное использование XDTO

05.12.20

Интеграция - Перенос данных 1C

Расскажу про свой опыт, как XDTO может помочь в отладке обменов данных. И какие полезности можно почерпнуть для себя при работе с XDTO.

Начну с того, что расскажу свою историю, как я открыл для себя XDTO. И зачем оно мне неожиданно пригодилось.

Итак, типичная беда - обмен на КД 2.0. Конфигурации: 1С:ERP. Агропромышленный комплекс и 1C: Itilium. Интересный обмен написал мой коллега, но по каким-то обстоятельствам не смог с ним закончить, и вот оно пришло ко мне. Вся суть: в Itilium есть документы по учету активов и конфигурации (термины из ITIL), и нужно эти документы превращать в документы регламентированной системы, в роли которой выступал 1C: ERP. Вся история в том, что иногда нужно было создавать в ERP несколько документов на основании одного документа источника. И в целях упрощения жизни в обоих конфигурациях создали два идентичных документа (универсальный документ обмена) и заполняли его при проведении ключевых документов.

Всё бы круто: вся основная логика находится в конфигурациях, а не в самих правилах обмена, но есть одно плохое "но". Документы при приходе в конфигурацию-приемник создаются в обработке проведения универсального документа. Ну и, как многие уже подумали, частая беда этого обмена "В данной транзакции уже происходили ошибки".

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

Вот и беда эта была достаточно частой, т.к. обмен был ещё "сыроват". Ну и бессонные ночи были обеспечены. Большая куча времени уходила, чтобы понять, в какой момент и из-за чего именно нельзя было провести тот или иной документ, который создавался на основе универсального документа.

И вот однажды в процессе выполнения других своих задач мой лучший друг по имени "Синтакс-помощник" показал вот такой вот объект: СериализаторXDTO. Стало интересно: а что я могу сериализовать? Оказалось что очень много чего можно сериализовать, а если еще и подготовить данные в нужном виде (привести к определенным типам данных), то вообще без проблем можно сериализовать все, что угодно.

Ну и вот пару часов экспериментов и получилось:

  • отладочное расширение, которое содержит функцию для Сериализации переменной типа "ДокументОбъект, СправочникОбъект и т.п." и выдачи их в тексте  xml;
  • обработка для преобразовании записанного объекта в xml;
  • и обработка для просмотра объекта записанного в xml.

Ну и вот такое странное применение всему этому:

  • ловим ошибку "в данной транзакции уже происходили ошибки";
  • тратим минут 15 на поиск документа который вызывает эту ошибку;
  • находим место где вызывается запись этого документа и ставим там точку останова;
  • когда точка остановилась вызываем функцию (через Shift+F9) из расширения в которую передаём ДокументОбъект;
  • нам возвращается текст xml и мы его копируем;
  • вставляем полученный текст в обработку для просмотра объектов из xml (см. п.3 выше);
  • и смотрим как заполнился наш документ;
  • при необходимости пробуем его провести или записать;
  • смотрим на ошибки которые выдаются при записи/проведении;
  • что-то осознаем и сравниваем с похожим документом созданным вручную, который мы выгрузим обработкой из п.2 (см. выше) и посмотрим обработкой из п.3 (см. выше).

Самая прелесть этого всего, что здесь, так же как и в коде, не отрабатывают лишние обработчики которые срабатывают при записи из формы (потому что такие обработчики могут дозаполнять объект за вас, а вы об этом и не подозреваете)

А теперь самое интересное. Как это всё работает?

Что делает отладочное расширение:

В отладочном расширении есть один серверный общий модуль с одной экспортной функцией. Функция в итоге возвращает объект, сериализованный в xml.

Содержимое у функции примерно такое:

//Объект передается в эту функцию и превращается в текст XML, который станет понятен для СериализатораXDTO при преобразовании обратно в объект
ЗаписьXML = Новый ЗаписьXML; //здесь создаем объект для записи в XML, ну это и ежу понятно
ЗаписьXML.УстановитьСтроку(); //делаем так чтобы при закрытии записи нам вернулась строка а не файл
СериализаторXDTO.ЗаписатьXML(ЗаписьXML, Объект); //собсна, сериализуем
Возврат ЗаписьXML.Закрыть(); //и возвращаем текст xml

В обработке, которая выгружает в xml уже записанный объект, все то же самое. Принципиальное отличие только в том, что отладочное расширение более нужно для того, чтобы выгрузить то, что не может записаться в базу, а обработка для того, чтобы выгрузить то, что мы создали ручками и смогли записать. И дальше уже сравнивать реквизиты, чтобы понять, что у нас не так.

Ну и как же потом это вот всё преобразовать в объект, спросите вы. А всё очень просто. Код примерно такой вернет вам обратно ДокументОбъект и делайте с ним что хотите:

//XML - это текст XML который мы получили из нашего сериализатора
ЧтениеXML = Новый ЧтениеXML; //создаем объект для чтения XML, ну это и ежу понятно
ЧтениеXML.УстановитьСтроку(XML); //пихаем в Чтение нашу строку
Объект = СериализаторXDTO.ПрочитатьXML(ЧтениеXML); // получаем объект из Чтения
ЧтениеXML.Закрыть(); //как все приличные люди закрываем Чтение

Вот такие небольшие приёмчики с СериализаторомXDTO мне помогли сократить бессонные ночи под отладкой обмена, до нескольких минут локализации ошибки.

Позже напишу, как я разрабатывал интеграцию с внешней системой посредством XML и какие выводы и полезные приемы я для себя вынес.

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

XDTO СреиализаторXDTO отладка обмены данными

См. также

SALE! 10%

Перенос данных 1C Программист Платформа 1С v8.3 1С:Управление производственным предприятием 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Платные (руб)

Перенос документов, начальных остатков и справочной информации из УПП 1.3 в ERP 2 | из УПП 1.3 в УТ 11 | из УПП в КА 2 | Правила конвертации (КД 2) | Более 360 предприятий выполнили переход с использованием этого продукта! | Сэкономьте время - используйте готовое решение для перехода! | Позволяет перенести из УПП 1.3 в ERP / УТ 11 / КА 2 всю возможную информацию | В переносе есть фильтр по организации и множество других опциональных параметров выгрузки | Есть несколько алгоритмов выгрузки остатков на выбор

55778 50200 руб.

04.08.2015    169508    352    281    

388

SALE! 20%

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист Платформа 1С v8.3 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Россия Платные (руб)

Правила в универсальном формате обмена для ERP 2.5, КА 2.5, УТ 11.5, БП 3.0, Розница, УНФ, для последних версий конфигураций. Ссылки на другие конфигурации в описании публикации. Правила совместимы со всеми другими версиями конфигураций новыми и старыми, поддерживающими обмен и синхронизацию в формате EnterpriseData. Не требуется синхронного обновления правил после обновления другой конфигурации, участвующей в обмене. Типовой обмен через планы обмена кнопкой Синхронизация вручную или автоматически по расписанию, или вручную обработкой.

27660 руб.

12.06.2017    144401    839    297    

432

SALE! 10%

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Программист Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Платные (руб)

Перенос данных из ERP в БП 3 | из КА 2 в БП 3 | из УТ 11 в БП 3 | из ЕРП в БП 3 | Сэкономьте время - используйте готовое решение для перехода! | Перенос разработан в формате КД 2 (правила конвертации данных) | Переносятся все возможные виды документов, начальных остатков и нормативно-справочная информация| Можно опционально выгружать каждую пару "номенклатура+характеристика" как отдельную номенклатуру | Есть выгрузка настроек счетов учета и зарплатных данных из ERP / КА 2 | Можно проверить на вашем сервере перед покупкой

55778 50200 руб.

15.04.2019    73416    193    153    

130

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист Платформа 1С v8.3 Оперативный учет 1С:Управление торговлей 10 Россия Управленческий учет Платные (руб)

Перенос данных из 1С:Управление торговлей 10.3 в 1С:Управление торговлей 11.5 с помощью правил обмена. Переносятся остатки, документы (обороты за период), справочная информация. Правила проверены на конфигурациях УТ 10.3 (10.3.88.x) и УТ 11.5 (11.5.20.x), также подходят для релиза 11.5 (11.5.19.x).

35000 руб.

23.07.2020    54671    243    73    

197

SALE! 10%

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Программист Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Россия Бухгалтерский учет Управленческий учет Платные (руб)

Перенос данных из ERP в ЗУП 3 | из КА 2 в ЗУП | Готовые правила конвертации данных (КД 2) для переноса остатков, документов с движениями и справочной информации 3 | Есть перенос начальной задолженности по зарплате и начальной штатной расстановки на выбранную дату | Обороты за прошлые годы (данные для расчета среднего) переносятся свернуто в документ "Перенос данных" | Есть фильтр по организациям | Документы за текущий период переносятся сразу с движениями, поэтому не потребуется делать перерасчеты | Перенос можно проверить перед покупкой, обращайтесь!

53111 47800 руб.

03.12.2020    37748    103    69    

98

SALE! 10%

Перенос данных 1C Взаиморасчеты Оптовая торговля Логистика, склад и ТМЦ Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист Платформа 1С v8.3 1С:Управление торговлей 10 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Управленческий учет Платные (руб)

Можно проверить до покупки, оставьте заявку! Воспользовались более 268 компаний! Перенос данных из УТ 10.3 в УТ 11 | из УТ 10.3 в КА 2 | из УТ 10.3 в ERP. Предлагаем качественное и проверенное временем решение для перехода с УТ 10.3. Можно перенести начальные остатки, нормативно-справочную информацию и все возможные документы. При выгрузке можно установить отбор по периоду, организациям и складам. При выходе новых релизов конфигураций 1C оперативно выпускаем обновление переноса данных.

55778 50200 руб.

24.04.2015    196595    157    244    

287

Перенос данных 1C Программист Бухгалтер Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и Управление Персоналом 3.x Россия Бухгалтерский учет НДФЛ ФОМС, ЕФС Платные (руб)

Обработки для быстрого перехода с конфигураций «КАМИН:Расчет заработной платы 3.0», «КАМИН:Зарплата для бизнеса 4.0» и «КАМИН:Зарплата 5.0» на конфигурацию «Зарплата и управление персоналом» версии 3.1.

12000 руб.

25.09.2016    82192    339    253    

289

SALE! 10%

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист Платформа 1С v8.3 1С:Комплексная автоматизация 1.х 1С:Управление производственным предприятием 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Платные (руб)

Перенос данных из 1С:Управление производственным предприятием 1.3 в 1С:Бухгалтерия предприятия 3.0 с помощью правил обмена | Можно выполнить переход с УПП на БП 3 или запускать выгрузку данных за выбранный период времени | Переносятся документы, начальные остатки и вся справочная информация | Есть фильтр по организации и множество других параметров выгрузки | Поддерживается несколько сценариев работы: как первичный полный перенос, так и перенос только новых документов | Перенос данных возможен в "1С: Бухгалтерия 3.0" версии ПРОФ, КОРП или базовую | Переход с "1С: УПП1.3" / "1С:КА 1.1" на "1С:БП3.0" с помощью правил конвертации будет максимально комфортным! | Можно бесплатно проверить перенос на вашем сервере!

48278 43450 руб.

25.02.2015    172568    309    260    

385
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Tahallus 441 05.12.20 11:26 Сейчас в теме
Замечательно, ждем статью про ЗаполнитьЗначенияСвойств
3. davdykin 25 05.12.20 18:32 Сейчас в теме
(1)По-моему ваше замечание - мимо кассы. Если кто-то найдет нестандартное использование ЗаполнитьЗНачениеСвойств, при решение распространенной проблемы - почему-бы не написать статью?
2. partizand 139 05.12.20 14:24 Сейчас в теме
Мысли вам в помощь.
Данная ошибка возникает после чтения данных после ошибки в транзакции. Это можкт происходить в вашем документе. Есть ли в нем попытка искючение при вызове проведения других документов? По идее в этой попытке можно получить полную инфу по ошибке и прервать транзакцию. Образец кода есть в стандартах 1с.
Но возможно я ошибаюсь и у вас все это есть.
6. simon_sidoruk 44 06.12.20 10:59 Сейчас в теме
(2)
По идее в этой попытке можно получить полную инфу по ошибке и прервать транзакцию.

Мысль хорошая, и даже так уже сделано, чтобы меньше раз ходить в отладку. Но к сожалению никак не вытащить сообщения которые падают в СообщенияПользователю, ну или я не знаю таких способов. А когда срабатывает внутренняя проверка каких-нибудь документов учетной системы он ругается именно в СообщенияПользователю ((
8. partizand 139 07.12.20 18:59 Сейчас в теме
(6) запаздываю с ответом. Нет времени.
При загрузке выставляется флаг "ЗагрузкаДанных". Не помню точно как он называется. Это отключает проверки. Ваш документ мог бы его выставлять. Это конечно не хорошо. Но с другой стороны вы получите тот же функционал, что и при прямой загрузке создаваемых документов. И тогда ошибок не будет или они будут уловимы.
Если я вообще правильно понимаю.
9. simon_sidoruk 44 07.12.20 19:05 Сейчас в теме
(8) а тут опять минус при флаге ЗагрузкаДанных = Истина, нельзя документы проводить
10. partizand 139 08.12.20 15:58 Сейчас в теме
(9) Почему нельзя проводить?
В общем не знаю.
В универсальном обмене же проводятся документы при получении. И если не провелись, то ошибка записывается в таблицу и ее можно потом глянуть. Вот и нужно глянуть как это сделано в БСП.
В сущности копаться в отладчике при проблемах проведения документа при обмене на мой взгляд не есть хорошо. И я бы искал способы этого избежать, а не способы удобного копания в отладчике.
11. simon_sidoruk 44 08.12.20 19:28 Сейчас в теме
(10)
В сущности копаться в отладчике при проблемах проведения документа при обмене на мой взгляд не есть хорошо. И я бы искал способы этого избежать, а не способы удобного копания в отладчике.

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

По поводу почему документ нельзя проводить при ОбменДанными.Загрузка = Истина.
А какие движения вы хотите получить от такого документа?Если у него не получилось пройти проверки то вероятность того что в движениях все будет хорошо очень низкая.

В общем то я рассказываю про инструменты которые мне помогли и обмен сейчас работает как часы. Пользоваться ими или осуждать его это уже вам решать
13. fomix 33 06.01.21 14:34 Сейчас в теме
(9) Документ при таком флаге ПРОВОДИТСЯ в обход существующих в модуле объекта проверок. Т.е. пометка ПРОВЕДЕН установится, а вот движения будут "кривые" либо их совсем не будет.
15. simon_sidoruk 44 06.01.21 14:46 Сейчас в теме
(13) пометка Проведен и процесс проведения это разные вещи. Да при ОбменяДанными.Загрузка = Истина можно в тупую поставить Проведен = Истина, но как его потом отделить от тех которые и правда провелись. Потом сиди и думай почему остатки там и там не сходятся на складах. А оказывается что в приемнике док фиктивно провелся
12. Cyberhawk 135 15.12.20 17:05 Сейчас в теме
(6)
никак не вытащить сообщения которые падают в СообщенияПользователю
ПолучитьСообщенияПользователю
simon_sidoruk; +1 Ответить
4. lunjio 67 05.12.20 19:10 Сейчас в теме
Если создаваемый документ так сказать технический, достаточно ставить вызватьИсключение, а не Отказ при ошибках, так же в участке обработки проведения, где проводится этот подчиненный документ, если он в попытке, в исключении так же выкидывать ошибку ну или убрать совсем.
5. simon_sidoruk 44 05.12.20 20:38 Сейчас в теме
(4) в этом есть проблема. Когда у вас подчиненный документ, например, Реализация товаров. То при ошибке из серии на складе недостаточно товара Н в количестве М, то ругаться он будет в СообщенияПользователю. А что самое прикольное выяснится потом. Товара то достаточно, просто надо было поставить в ТЧ Товары правильные статусы указания серий (если вы поняли о чем я ;))
7. capitan 2603 06.12.20 14:48 Сейчас в теме
Минусов конечно я ставить не буду.
Любой написавший некоторое количество связанных букв достоин похвалы.
Предвижу только, когда автор откроет для себя конвертацию данных 3.0 он сильно удивится.
14. fomix 33 06.01.21 14:40 Сейчас в теме
(0) Не знаю как у вас, но у меня при типовом обмене тоже ошибки при проведении периодически возникают. Документ просто записывается в базу, но не проводится (это типовой функционал). А дальше ручками его уже можно провести. Причем проводится без ошибок! Отловить ошибку не удается, в техжурнале все без ошибок (просто констатация факта - ошибка при проведении документа, без подробностей). Можно ли, используя приведенный вами механизм, выявить эту ошибку?
16. simon_sidoruk 44 06.01.21 14:50 Сейчас в теме
(14) в этом и суть. Отлавливаете документ отладкой где он уже заполнен, используете функцию из расширения, вставляете результат функции в обработку и проводите там. Самое главное что никакие доп обработчик форм при этом не отработает и вы увидите реальную причину
17. fomix 33 06.01.21 16:25 Сейчас в теме
(16) В том то и прикол, что при проведении вручную ошибок нет! И отлавливать там, по сути, нечего...
18. simon_sidoruk 44 07.01.21 04:46 Сейчас в теме
(17) это через форму документа, потому что там вас спасают обработчик событий формы, которые что-то дозаполняют. А обработка открывает документ через универсальную форму и не содержит этих обработчиков
19. fomix 33 13.01.21 09:53 Сейчас в теме
(18) Если документ или любой объект УЖЕ записан в базу, но не проведен (по какой-то ошибке), поможет ли ваша обработка?
20. simon_sidoruk 44 13.01.21 10:55 Сейчас в теме
21. Dzenn 903 19.03.21 12:02 Сейчас в теме
Сама идея с промежуточным документом непонятного назначения и записи из него другого документа изначально плохая
22. simon_sidoruk 44 04.04.21 09:22 Сейчас в теме
(21) Если рассматривать этот проект, то там было так:
Есть Itillium в нем есть документы которые при выгрузке в ERP. Агрокомплекс будут создавать один или несколько документов. Пример перемещение между организациями (интеркампани насколько я помню это называется). В Itilium все просто - создаем документ перемещение активов и готово. В ERP должно было насколько я помню создастся Реализация на другую нашу организацию, счет-фактура, Поступление в другой организации и тоже счет-фактура.
Так вот мы решили что пусть при /записи создается универсальный документ обмена в Itillium и он уже пойдет в ERP. А ERP будет его принимать и что-то с ним делать.
При таком подходе мы можем в Itillium найти документ обмена (есть ссылка в форме документа).
Потом найти этот документ в ERP и узнать что на основании него создано.

И это облегчило задачу которая возникла позже: надо было чтобы пока в ERP есть хотя бы один проведенный документ в Itillium нельзя было бы менять документ-источник
Оставьте свое сообщение