01.04.2013 Новая версия файла
в прошлой версии при выгрузке иерархических справочников, наблюдалось задвоение корневых папок.
(спасибо Jkey, дал пинка, что бы исправить "баг")
Интро:
Поставлена абстрактная задача по выгрузке документов из любой конфигурации 1С:Предприятие 8.2 с возможностью отбора по типу, дате и состоянию документа (Проведен, Удален), в xml файл.
Файл должен содержать две основные секции: «Справочники» и «Документы». Каждый выгружаемый в файл объект (элемент справочника или документ) должен иметь уникальный во всем файле идентификатор (id). Во время всех выгрузок объект должен иметь один и тот же идентификатор.
В секции «Справочники» должны располагаться вложенные секции, названия которых совпадают с названием «Вида» справочника, как он задан в конфигурации.
Если элемент справочника является группой, тогда он располагается в элементе файла, имеющем название «Группа». Если элемент справочника не является группой, тогда он располагается в элементе с названием «Элемент».
Каждый элемент справочника необходимо развернуть по структуре, т.е поместить в файл все реквизиты справочника. Значение реквизитов справочника помещаются в элементы секции файла, имеющие названия, совпадающие с названиями реквизитов справочника, как они заданы в конфигураторе.
Если реквизит справочника имеет тип «Справочник» или «Документ», тогда он должен быть помещен в соответствующую секцию файла выгрузки согласно правилам выгрузки элементов справочников, а использование данного значение реквизита должно быть заменено значением id данного объекта. Если реквизит справочника имеет примитивный тип (строка, число, булево) или «Перечисление», тогда значение реквизита сразу помещается в файл.
Обязательные поля для Справочников:
- Id – уникальный идентификатор элемента.
- Код – код элемента справочника.
- Наименование – наименование элемента справочника.
- Родитель – элемент справочника, который расположен на уровень выше по отношению к данному элементу.
- Владелец - элемент справочника или документ, которому подчинен данный элемент справочника.
- Состояние – состояние элемента справочника, которое может принимать значение «записан» или «удален».
- Id – уникальный идентификатор документа
- Номер – номер документа
- Дата – дата документа
- Состояние – состояние документа (может принимать значение «проведен», «записан» или «удален»).
Такое вот задание я получил в ответ на свой отклик на вакансию, хех. До этого я ничего особого про XML не знал, (только что можно выполнять обмен с помощью этого формата и еще что его можно подредактировать в нотепаде). Я считаю это нормально (мою непросвещенность), потому как XML к 1С имеет косвенное отношение, но чтобы быть специалистом на всю голову, необходимо знать и это тоже, ничего не поделаешь, задача интересная, новая. Надо решать.
В данной статье не будут разбираться правила выгрузки в xml, приведу как пример один интересный курс "Средства интеграции и обмена данными в системе 1С:Предприятие 8".
Можно выделить пару методов решения.
- 1й - самый популярный и широко рассматриваемый - это создание в конфигурации собственной схемы XDTO. Её необходимо создать (да-да, т.е внести изменения в конфигурацию, но её потом можно экспортировать и используя её загружать в куда-нибудь, например на сайт), определить в ней все интересующие нас объекты, атрибуты объектов, описать типы используемые объектами и далее, используя так называемую "Объектную модель XML", выгружать данные.
- 2й - самый тривиальный, ему мало уделяют времени, потому что он очень простой, его можно даже не заметить (его-то я и использовал). Мы просто последовательно рекурсивным (или просто циклом) обходом выполняем запись в файл XML. Это не очень хороший метод с точки зрения загрузки данных (если мы выгружаем данные, значит это кому-нибудь нужно (с) ).
- чуть наврал, есть и 3й... в 1С 82 есть встроенные методы выгрузки объектов в xml, на основе собственных схем XDTO, которые уже включают все описания, но этот метод подходит только для выгрузки/загрузки в идентичные конфигурации, что встречается крайне редко... его я не стал использовать, потому как все элементы и атрибуты выгружаемого объекта будут иметь уже заложенные имена, и они не совпадают с именами реквизитов объекта(они вообще в английском представлении), а нам ведь нужно использовать "свои собственные" имена как в конфигураторе.
Приступим...
Решение задачи выполнено с использованием, так сказать, "базовых понятий" о записи XML, с выполнением последовательной записи. Объектная модель XML использоваться не будет.
Основной объект - это ЗаписьXML. Создаем новый объект и используем методы ЗаписатьНачалоЭлемента() и ЗаписатьКонецЭлемента(), так и будет. Все!
Так как будет выгружаться 2 раздела, то необходимо их объединить одним общим корневым элементом (у меня это "Корень"). После идет описание Справочником, и потом Документов.
На форме расположены основные элементы управления:
- Тип объекта (При открытии формы получаем список всех типов документов и загружаем в СписокЗначений)
- НачалоПериод и КонецПериода
- Булевские флаги "Проведен", "Удален", для возможности отбора по состоянию документа
- и Каталог выгрузки,
В поле Каталог выбирается именно каталог, файл формируется с именем
ИмяФайла = Каталог+Формат(ТекущаяДата(),"ДФ=ddMMMM")+".xml";
Краткое описание алгоритма:
- Запросом выбираем документы .
- Рекурсивно получаем все типы Справочников и Документов(при выгрузке остальные типы преобразуются в строку) всех реквизитов из образовавшегося "дерева" и заполняем ими списки значений, для справочников и документов свои списки значений.
- Рекурсивно получаем все ссылочные Значения всех реквизитов.
- Далее проводим последовательную иерархическую запись сначала Справочников(снова рекурсия, ну а как иначе), предварительно сформировав один большой запрос, для того что бы в цикле не обращаться к базе, а использовать пакеты.
- И после производим запись документов.
Я считаю интересным моментом, получение имен реквизитов и табличных частей и реквизитов ТЧ, с последующей обработкой.
После записи выводится сообщение.
Внешнюю обработку я создавал с Обычной неуправляемой формой, для обычного толстого клиента, на платформе 8.2.15.
Тестировал на Демо конфигурации УТ 10.3.
Это моя первая публикация, надеюсь кому нибудь пригодится. Принимаю любую критику. Удачи.