Посоветуйте рассылку друзьям и знакомым. Для этого просто перешлите это письмо. Подписаться на рассылку можно на сайте рассылки. Каждый из Вас может поделиться своим опытом с читателями. Для этого присылайте свои статьи и разработки на адрес, указанный внизу выпуска.
Приветствую вас, уважаемые читатели!
Текущий выпуск продолжит тему предыдущего практическим примером.
1С и XML. Применение на практике.
Многие из вас, кому интересна эта тема и кто читал прошлый выпуск, смотрели обработку по выгрузке документа в формате xml с сайта рассылки. Вместе с этим выпуском обработка завершена до уровня выгрузка-загрузка документа в идентичных конфигурациях, чего вполне достаточно для понятия работы механизма 1С-XML. Для полной наглядности далее описываются алгоритмы и приемы работы.
Процесс выгрузки представляет собой разбор объекта на простейшие составляющие и группировку этих самых составляющих. Процесс загрузки - все то же самое с точностью до "наоборот". Проще говоря, чтобы переместить дом с одного места на другое, нужно составить его план, разобрать по кирпичикам, перевезти их в нужное место, и собрать дом глядя на ранее составленный план.
Выгрузка данных.
Чтобы выгрузить какие-либо данные, нужно знать их структуру и закономерность их связей. Рассмотрим объект метаданных "Документ". Он содержит три группы реквизитов:
- общие реквизиты;
- реквизиты шапки;
- реквизиты табличной части.
Документ представляет собой самый сложный объект для выгрузки данных. И это вот почему. Почти все реквизиты документа представляют собой составные типы данных, т.е. ссылки на объекты типа "Справочник", "Счет", "Перечисление", "Документ" и т.п. Поэтому при выгрузке документа надо рассмотреть возможность выгрузки каждого типа данных. Выгрузка документа состоит в том, что нужно выгрузить информацию о каждом его реквизите.
Например, рассмотрим метод выгрузки реквизита типа "Справочник". Для этого об объекте нужно знать следующее:
- Уникальный идентификатор (для проверки, выгружен ли уже такой элемент; при загрузке - поиск в XML-документе);
- Родитель (в какой группе находится выгружаемый элемент);
- Код;
- Наименование;
- остальные реквизиты.
Далее снова все сводится к тому, что нужно выгрузить каждый из вышеуказанных реквизитов справочника. Т.е. брать реквизит, смотреть какого он типа: если простого ("Дата", "Строка", "Число") - то записывать значение реквизита, если составного - то обращаться к методу выгрузки для типа этого реквизита, а вместо значения записывать "Уникальный идентификатор", по которому можно будет найти выгруженный реквизит. В текущем примере реквизиты "Владелец" и "Родитель"
- это реквизиты типа "Справочник", поэтому для их выгрузки нужно будет обратиться к методу выгрузки реквизита типа "Справочник". Реквизит "Код" - реквизит простого типа ("Строка" или "Число"), поэтому ни к каким методам обращаться не нужно, а нужно просто записать значение этого реквизита.
Подобный метод можно применить и к документу. Перебираются по очереди все реквизиты документа из каждой группы реквизитов, и, в зависимости от типа реквизита, идет обращение к соответствующему методу, или непосредственная запись значения реквизита.
Теперь составим структуру XML-документа. Для удобства, пусть она будет подобна структуре конфигурации:
Таким образом, выгружая реквизиты документа, справочника и др., помещаем их в соответствующие узлы XML-документа согласно их типизации.
Важно:
- при выгрузке нужно проверять, не выгружен ли уже этот объект, иначе процесс зависнет в бесконечном цикле;
- нужно помнить, что существуют периодические реквизиты, значения которых можно получить только на определенную дату;
- для уменьшения размера XML-файла нужно пропускать выгрузку незаполненных реквизитов.
Загрузка данных.
Алгоритм загрузки более прост. Производим чтение узлов XML-документа, проверяем, существуют ли такие объекты в загружаемой базе, если нет - создаем новые. Например: выбираем узел "Справочники", в нем выбираем подчиненные узлы "Вид справочника", создаем объект "Справочник.Вид справочника". Выбираем выгруженные элементы справочника, находящиеся в узлах "Элемент справочника", которые подчинены узлу "Вид справочника". И последняя выборка, которую делаем для
загрузки элемента справочника, - выборка узлов "Реквизит элемента справочника". Среди выбираемых реквизитов есть реквизит "Код", по значению которого производится поиск существующих элементов.
Важно:
- если у справочника нарушена уникальность кодов, то для избежания путаницы между элементами нужно добавить дополнительную проверку, например по реквизиту "Наименование". Но будет лучше восстановить уникальность кодов для избежания ошибок загрузки;
- если же у справочника вообще нет кода, то поиск существующих элементов нужно будет производить по наименованию или по какому-нибудь уникальному реквизиту, в признаках которого установлен флаг "Сортировка" (для более быстрого поиска).
Выводы.
Вывод можно сделать такой: обмен данными в формате XML отличается от других большой гибкостью, но для четкой работы нужно "попыхтеть" над построением структуры XML-документа. Напоминаю, что обработку с примером можно найти в разделе Скачать на сайте рассылки. Но в ней я специально убрал некоторые мелкие функции, чтобы тем, кому интересно, могли сами доделать обработку. Через некоторое время я выложу полный вариант.