Цель данной статьи – попытаться, в очередной раз, изложить вкратце суть объектов 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С возможно разными способами. Они перечислены здесь:
- Немного об 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, оставаясь достаточно конкурентным.