Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

1С: Обмен опытом Выпуск №5


Выпуск №5 от 18 мая 2006 года.

Архив рассылки.

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

Приветствую вас, уважаемые читатели!

Текущий выпуск продолжит тему предыдущего практическим примером.

1С и XML. Применение на практике.

Многие из вас, кому интересна эта тема и кто читал прошлый выпуск, смотрели обработку по выгрузке документа в формате xml с сайта рассылки. Вместе с этим выпуском обработка завершена до уровня выгрузка-загрузка документа в идентичных конфигурациях, чего вполне достаточно для понятия работы механизма 1С-XML. Для полной наглядности далее описываются алгоритмы и приемы работы.

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

Выгрузка данных.

Чтобы выгрузить какие-либо данные, нужно знать их структуру и закономерность их связей. Рассмотрим объект метаданных "Документ". Он содержит три группы реквизитов:

- общие реквизиты;

- реквизиты шапки;

- реквизиты табличной части.

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

Например, рассмотрим метод выгрузки реквизита типа "Справочник". Для этого об объекте нужно знать следующее:

- Уникальный идентификатор (для проверки, выгружен ли уже такой элемент; при загрузке - поиск в XML-документе);

- Владелец (какому элементу справочника подчинен выгружаемый элемент);

- Родитель (в какой группе находится выгружаемый элемент);

- Код;

- Наименование;

- остальные реквизиты.

Далее снова все сводится к тому, что нужно выгрузить каждый из вышеуказанных реквизитов справочника. Т.е. брать реквизит, смотреть какого он типа: если простого ("Дата", "Строка", "Число") - то записывать значение реквизита, если составного - то обращаться к методу выгрузки для типа этого реквизита, а вместо значения записывать "Уникальный идентификатор", по которому можно будет найти выгруженный реквизит. В текущем примере реквизиты "Владелец" и "Родитель" - это реквизиты типа "Справочник", поэтому для их выгрузки нужно будет обратиться к методу выгрузки реквизита типа "Справочник". Реквизит "Код" - реквизит простого типа ("Строка" или "Число"), поэтому ни к каким методам обращаться не нужно, а нужно просто записать значение этого реквизита.

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

Теперь составим структуру XML-документа. Для удобства, пусть она будет подобна структуре конфигурации:

-Корневой узел
|-узел "Константы"
 |-узел "Наименование константы"
|-узел "Справочники"
 |-узел "Вид справочника"
  |-узел "Элемент справочника"
   |-узел "Реквизит элемента справочника"
|-узел "Документы"
 |-узел "Вид документа"
  |-узел "Документ"
   |-узел "Общие реквизиты документа"
   |-узел "Реквизиты шапки"
   |-узел "Реквизиты табличной части"
|-узел "Перечисления"
|-узел "Счета"

Таким образом, выгружая реквизиты документа, справочника и др., помещаем их в соответствующие узлы XML-документа согласно их типизации.

Важно:

- при выгрузке нужно проверять, не выгружен ли уже этот объект, иначе процесс зависнет в бесконечном цикле;

- нужно помнить, что существуют периодические реквизиты, значения которых можно получить только на определенную дату;

- для уменьшения размера XML-файла нужно пропускать выгрузку незаполненных реквизитов.

Загрузка данных.

Алгоритм загрузки более прост. Производим чтение узлов XML-документа, проверяем, существуют ли такие объекты в загружаемой базе, если нет - создаем новые. Например: выбираем узел "Справочники", в нем выбираем подчиненные узлы "Вид справочника", создаем объект "Справочник.Вид справочника". Выбираем выгруженные элементы справочника, находящиеся в узлах "Элемент справочника", которые подчинены узлу "Вид справочника". И последняя выборка, которую делаем для загрузки элемента справочника, - выборка узлов "Реквизит элемента справочника". Среди выбираемых реквизитов есть реквизит "Код", по значению которого производится поиск существующих элементов.

Важно:

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

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

Выводы.

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

Ваши вопросы, идеи и предложения присылайте мне.

Удачи!


В избранное