Пример обмена данными через XDTO

01.03.21

Интеграция - Внешние источники данных

Пример обмена данными между 1С и сторонним приложением посредством механизма XDTO.

Скачать исходный код

Наименование Файл Версия Размер
Пример обмена данными через XDTO:
.zip 81,95Kb
18
.zip 1.0. 81,95Kb 18 Скачать
Пример обмена данными через XDTO:
.zip 83,31Kb
7
.zip 83,31Kb 7 Скачать

    Цель данной статьи – попытаться, в очередной раз, изложить вкратце суть объектов XDTO в среде 1С и ознакомить читателей с практическим вариантом их применения в обмене данными между 1С и другим ПО.

    Сначала несколько слов о появлении XML, пропустив которые ярко выраженные практики и ярые адепты 1С ничего не потеряют.

1. Вкратце об обмене  данными   

Компьютеры, в основе работы которых лежит бинарный код, за короткое время изменили мир. Этот процесс походил на вытеснение бумагой использовавшихся ранее носителей информации. Тогда символы разных языков, как основа обмена, остались, а скорость распространения информации возросла. Со временем люди придумали почтовые службы, обернули письма в конверты, а на них появились индексы в качестве служебной части информации, способствующей её обмену. Всё новое - это хорошо забытое старое и, подобно индексам, при обменах между компьютерами, часть двоичных данных была отведена под адресацию и служебную информацию. Так появились протоколы обмена, с помощью которых передаётся любая информация. В операционных системах информация стала делиться на файлы с помощью служебных комбинаций бинарной информации, таких как EOF (конец файла) и пр.

   Освоение программистами компьютеров привело к появлению множества форматов для работы с файлами. Формат содержит служебную информацию, а также правила размещения бинарного содержимого. По этим правилам с файлами может работать прикладное ПО, которое трансформирует бинарное содержимое файлов в понятную для пользователя форму. Тексты остались текстами, но к ним добавились мультимедиафайлы. А также - привет 1С - базы данных, позволяющие организовать одномерное бинарное содержимое файла в двумерные таблицы и другие специальные типы файлов. Для объединения содержимого разных типов в одном файле стали использовать понятие документа и, в начале 90-х, возник универсальный формат HTML. Это было время веб-приложений, сделавших Интернет похожим на  радиовещание. Сайты, разработанные web-дизайнерами, демонстрировали своё содержимое в виде HTML-документов посетителям, которым оставалось довольствоваться возможностями браузеров для просмотра контента. Обратная связь сводилась к предоставлению предусмотренных разработчиком сайта вариантов обмена информацией – опрос, заказ и т .д.

    После появления социальных сетей настала эпоха Интернета 2.0., которая отменила монополию разработчиков на создание контента. Пользователи смогли создавать свои странички самостоятельно, в том числе с использованием независимого ПО и формат HTML перестал удовлетворять потребностям развивающегося Интернета. Вновь остро встал вопрос о стандартизации понятия документ. А стандартизация дело непростое. Например,  формат почтовых сообщений RFC822   появился только через 17 лет после начала использования электронной почты. В итоге, в конце XX века Консорциум Всемирной паутины (W3C) рекомендовал XML (язык расширенной разметки) в качестве универсального формата для обмена информацией.  

2. Вскользь об XML    

    XML это средство описания произвольного документа в определённом стандарте. Документ  представляется в виде дерева, корнем которого является он сам, и шапки, которая может и отсутствовать. Шапка содержит объявления, инструкции обработки, комментарии. Собственно, о самом XML уже написано множество статей и в его описание углубляться не буду. Важно понимать, что с его помощью можно описать практически любой документ и что документ XML представляет собой текст, сформированный по определённым правилам. Зная правила,   содержимое документа XML можно прочитать. На этом закончим вводную часть и перейдём к 1С.

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

Работать с XML в среде 1С возможно разными способами. Они перечислены здесь:

//infostart.ru/public/311011/

  1. Немного об XDTO   

На мой взгляд, наиболее удобный и лёгкий для освоения способ работы заключается в использовании механизма XDTO. Про него также написано много статей с примерами. В цикле статей, начинающемся с этой: //infostart.ru/1c/articles/167459/

XDTO и вовсе разобран по косточкам. 

   Если вкратце, то данный механизм позволяет не читать XML-документ последовательно в виде текста, разбирая его содержимое внутри алгоритма, а поручить платформе 1С создать объект непосредственно в памяти, на основании XSD-схемы документа, описанной в пакете XDTO.

Разберёмся сначала с новыми X-терминами. Благодаря математике X чаще всего обозначает нечто неизвестное. В случае XML это не так. X в самом XML eXtended (расширяемый), а в других понятиях – это просто обозначение самого XML. XSD (XML Schema Definition или описание схемы XML) - является описанием структуры XML документа, то есть, инструкцией для работы с документом по описанным в ней правилам для считывания/записи содержимого в её атрибуты. Важно понимать, что это за объект – не привычный тип прикладного объекта 1С - справочник, документ и т.п. - и не произвольный текст. Это промежуточный объект, готовый к переносу как в XML при записи, так и в 1С при чтении. Название XDTO расшифровывается как Xml Data Transfer Object или объект для переноса данных посредством XML. Примеры работы с ним есть в других статьях, например, в этой: //infostart.ru/1c/articles/1068187/. Я же приведу свой для понимания последовательности действий для настройки обмена данными со сторонним приложением. 

4. Небольшой пример

4.1. Данные для примера 

    Возьмём часто встречающуюся ситуацию, когда из сторонней программы, например, с  сайта, приходит заказ на товар.

Нужно считать данные заказа, присылаемые в xml-файле.  С целью, например, проверить цену и  наличие товара на складе. Здесь уже проявляется разница в конфигурациях 1С, которые хранят цены и остатки в разных объектах. В Бухгалтерии цена находится в регистре сведений ЦеныНоменклатуры, наличие определяется по регистру бухгалтерии (в других типовых по регистру накопления Остатки…). Поэтому для сохранения возможности работы прилагаемого к статье ПО в любых типовых конфигурациях ограничимся разработкой структуры данных для обмена, её считыванием и записью во внешней обработке.

    Данные по товарам и покупателю возьмём из справочников, присутствующих во всех типовых  конфигурациях, Номенклатура и Контрагенты соответственно.

4.2. Подготовка XDTO

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

Укажем в расширении пространство имён. Это требуется для того, чтобы передаваемые объекты, которые могут иметь совпадающие с другими объектами имена, обрабатывались по правилам данного пакета. Примерно тот же смысл, что и добавление фамилии (прописки или других уточняющих атрибутов) к имени человека.

В пакете добавим типы объектов: ЧастьЗаказа и Заказ.

Тем самым сообщаем платформе о том, в какие контейнеры нужно помещать данные при создании объекта XDTO.  Эти объекты платформа 1С использует как при записи данных, так и при их считывании. Следующий код образует пустые контейнеры в соответствии с типами пакета:

ТипОбъектаЗаказ = ФабрикаXDTO.Тип("http://www.PB.Orders.ru", "Заказ");

Далее, на основании типа, создаётся объект XDTO, в который можно помещать данные:

ОбъектЗаказ = ФабрикаXDTO.Создать(ТипОбъектаЗаказ);

ФабрикаXDTO – внутриплатформенный объект, способный создавать объекты XDTO на основе типов.

Сами данные для обмена помещаются в свойства объектов:

которые также должны иметь тип, чтобы корректно эти данные читать:

При выборе типа можно использовать любой тип из имеющихся в конфигурации. Для того, чтобы понять, что это такое, нужно ознакомиться с сериализатором XDTO.

4.3. Чуть-чуть о сериализаторе

Типовые конфигурации 1С содержат множество пакетов:

Пакеты служат для описания схем переноса объектов конфигурации в XML, а также в JSON, форматы. Сам перенос осуществляет встроенное в платформу средство – сериализатор XDTO. Это позволяет передавать содержимое двумерных табличных объектов 1С между конфигурациями, в которых эти объекты одинаковы,  в виде последовательного «плоского» текста. В прилагаемой обработке есть возможность сериализации объекта любого типа как в формат XML, так и в формат JSON. XML появился раньше и сам сериализатор был придуман для трансформации объектов в этот формат, но более лаконичный JSON находит всё более широкое применение в практических задачах. В частности, по той причине, что он лучше соответствует объектам баз данных, используемым в 1С. Поэтому разработчики добавили в сериализатор возможности трансформации объектов и в JSON.

Разница между форматами особенно сказывается при обменах множествами небольших объектов. Для примера приведу представление ссылки на справочник в XML:

и в JSON: . Как видно, XML точнее, в нём есть указание на пространство имён и на то, что это ссылка на конкретный справочник, а JSON обходится просто самой ссылкой и занимает существенно меньше места.

4.4. Конкретно о примере

Рассматриваемый пример касается обмена со сторонним приложением, предположительно сайтом, которое не использует объекты 1С. Поэтому для свойства "Товар" используем общедоступный тип string из пространства имён "http://www.w3.org/2001/XMLSchema" :

  

Для свойства "Количество" выберем тип integer ("Целое"), для свойства "Цена" тип decimal:

 

Для типа "Заказ" контрагента также определим, как строку, поскольку это объект 1С. Свойству "ТоварнаяПозиция" присвоим тип "ЧастьЗаказа" из созданного в расширении пространства имён и укажем, что частей может быть произвольное количество (мин кол-во = 0, макс кол-во = – 1):

Пакет примера готов. И, в целом, всё готово для обмена.

4.5. Формирование XML файла для отправки стороннему ПО

После создания объекта XDTO на основании типа его свойствам можно присваивать значения через точку:

ОбъектЗаказ.Контрагент = «Любимый покупатель»;
Для НомерТовара = 1 По 3 Цикл
    ОбъектЧастьЗаказа = ФабрикаXDTO.Создать(ТипОбъектаЧастьЗаказа);		
    ОбъектЧастьЗаказа.Товар = «Товар » + Строка(НомерТовара);
	ОбъектЧастьЗаказа.Количество = НомерТовара;
	ОбъектЧастьЗаказа.Цена = НомерТовара * КурсДоллара;
	ОбъектЗаказ.ТоварнаяПозиция.Добавить(ОбъектЧастьЗаказа);		
КонецЦикла;

Для записи объекта XDTO в файл достаточно выполнить следующий код:

ЗаписьВФайл = Новый ЗаписьXML;
ЗаписьВФайл.ОткрытьФайл(ИмяФайла)		
ФабрикаXDTO.ЗаписатьXML(ЗаписьВФайл, ОбъектЗаказ);
ЗаписьВФайл.Закрыть();

В результате получается следующий файл XML, который может быть отправлен другому приложению:

Поскольку содержимое XML это строка, то есть набор ASCII-символов, то использовать кириллицу в именах свойств и объектов при обменах данными между ИБ 1С допустимо. Что касается обменов с другими приложениями,  латиница предпочтительнее, так как для подавляющего большинства программ стандартом является она.

4.6. Чтение XML-файла

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

	ЧтениеXML = Новый ЧтениеXML();
	ЧтениеXML.ОткрытьФайл(ИмяФайла);
	ТипОбъектаЗаказ = ФабрикаXDTO.Тип(ПространствоИмён, "Заказ");
	ОбъектЗаказ = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML, ТипОбъектаЗаказ);
	МассивЗаказа = Новый Массив();
	Контрагент = ОбъектЗаказ.Контрагент;
	Для Каждого ПозицияЗаказа Из ОбъектЗаказ.ТоварнаяПозиция Цикл
		НоваяПозиция = Новый Структура;
		НоваяПозиция.Вставить("Товар", ПозицияЗаказа.Товар);
		НоваяПозиция.Вставить("Количество", ПозицияЗаказа.Количество);
		НоваяПозиция.Вставить("Цена", ПозицияЗаказа.Цена);
		МассивЗаказа.Добавить(НоваяПозиция);
	КонецЦикла;

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

Таким образом, для интеграции типовой конфигурации со сторонним приложением достаточно добавить расширение с пакетом XDTO, описывающим типы данных, используемые при обмене, и обработку для выгрузки/загрузки данных в объекты 1С данной конфигурации.

5. Приложения к статье

К статье приложен zip-архив, содержащий расширение с пакетом XDTO, внешнюю обработку с примерами кода для записи и чтения файлов XML и краткую инструкцию по использованию обработки в качестве мини-тренажёра. Обработка подходит для начала работы с собственными объектами XDTO. В ней создаётся файл с расширением xml на основе заданного в форме объекта согласно объектам пакета расширения.

 

Также обработка читает полученный от стороннего приложения файл в таблицу значений формы.

 

В расширении можно заменить наименование пространства имён и задать его в обработке, чтобы начать работать со своим объектом, взяв за основу код обработки. Также обработка демонстрирует работу сериализатора XDTO для любого объекта конфигурации. Работа обработки проверена на конфигурации Бухгалтерия предприятия, редакция 3.0 (3.0.88.22)  на платформе 8.3.18.1208.

6. Заключение

Рассмотренный выше пример представляет собой простейшую интеграцию приложения 1С со сторонним приложением с использованием формата XML. Его критикуют за некоторую многословность и избыточность, которую признают и сами разработчики. Это следствие его универсальности. В принципе, для решения большинства задач обмена подходит более лаконичный формат JSON, средства работы с которым также представлены в механизме XDTO платформы 1С. Однако, для сложных случаев обменов данными, а также во множестве ранних разработок, успешно применяется XML, оставаясь достаточно конкурентным.

интеграция со сторонним приложением обмен между и XDTO XML сериализатор

См. также

Перенос данных из Парус 8 в ЗГУ 3

Зарплата Внешние источники данных Бюджетный учет Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактических удержаниях, НДФЛ, вычетах, страховых взносах из базы Парус 8 учреждений в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (ЗГУ) и начать с ней работать с любого месяца года.

84000 руб.

19.08.2020    22586    19    1    

22

Экстрактор данных 1С в BI - выгрузка данных из 1С в BI-аналитику

Внешние источники данных Платформа 1С v8.3 Управляемые формы Анализ и прогнозирование Конфигурации 1cv8 Узбекистан Беларусь Кыргызстан Молдова Россия Казахстан Платные (руб)

Готовое решение для автоматической выгрузки данных из 1С 8.3 в базу данных ClickHouse, PostgreSQL или Microsoft SQL для работы с данными 1С в BI-системах. «Экстрактор данных 1С в BI» работает со всеми типовыми и нестандартными конфигурациями 1С 8.3 и упрощает работу бизнес-аналитиков. Благодаря этому решению, специалистам не требуется быть программистами, чтобы легко получать данные из 1С в вашей BI-системе.

15.11.2022    13527    12    SQV0    47    

28

Перенос данных из Парус 10 в ЗГУ ред.3

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

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактических удержаниях, НДФЛ, вычетах, страховых взносах из базы Парус 10 учреждений в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (ЗГУ) и начать с ней работать с любого месяца года.

60000 руб.

05.10.2022    9293    9    8    

11

Перенос данных из Парус 7.хх в ЗГУ ред.3

Внешние источники данных Зарплата Бюджетный учет Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактических удержаниях, НДФЛ, вычетах, страховых взносах из базы Парус 7.хх учреждений в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (ЗГУ) и начать с ней работать с любого месяца года.

24000 руб.

24.04.2017    48805    96    163    

86

Перенос данных из Парус 10 (Торнадо) в ЗГУ ред.3 через Excel

Внешние источники данных Загрузка и выгрузка в Excel Зарплата Бюджетный учет Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате из Парус 10(Торнадо) учреждений через файлы Excel в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (ЗГУ). В принципе, обработка может быть использована для загрузки из файлов Excel, полученных из любых информационных систем.

24000 руб.

16.11.2018    30068    20    31    

21

Загрузка спецификаций в УНФ из системы Базис-мебельщик

Производство готовой продукции (работ, услуг) Внешние источники данных Платформа 1С v8.3 1С:Управление нашей фирмой 1.6 Лесное и деревообрабатывающее хозяйство Россия Управленческий учет Платные (руб)

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

7200 руб.

24.06.2021    19282    52    50    

29
Комментарии
Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. aspirator23 339 04.03.21 13:41 Сейчас в теме
Универсальность ее конек. Недавно делал обмен между базами двух разных городов.
Таблица из 6 колонок и 70тыс строк. в Json Загружалась за 40 секунд включая соединение, запись каждой строки в приемник - нажал кнопку начался отчет.
Тоже, по просьбе, через XDTO сделал. Счет пошел на минуты. :(
Т.е. для простых случаев Json незаменим, если посложнее уже есть смысл подумать о XDTO.
2. user925427 123 04.03.21 14:44 Сейчас в теме
(1) Согласен. JSON проще, меньше текста, поэтому легче читается. К табличным данным он отлично приспособлен - ключ, значение, массив. С датами в нём не так очевидно, если понадобится пост-обработчик, то скорость чтения снизится. Но в целом, он быстрее из-за своей лаконичности. Изначально в платформе появился XML, встроенных средств его поддержки больше. Статью писал для того, чтобы начинающие могли легче освоить работу с XDTO, понять, что это такое. Кто поопытнее уже выбирают наиболее подходящее, в зависимости от условий задачи.
Оставьте свое сообщение