расскажите какие есть варианты выгрузки в формате xml формирование структуры xml файла
1С и XML — чтение и запись в примерах (8.2 и 8.3)
Рассмотрим возможности 1С 8.3 работы с XML.
XML – это расширяемый язык разметки. В 1С широко применяется для обмена данными между конфигурациями, а также между другими внешними источниками данных с помощью данного механизма.
Рассмотрим два варианта работы с XML: средствами внутреннего языка и средствами внутреннего языка с использованием XDTO пакетов.
Чтение файла XML средствами внутреннего языка 1С
Создадим новый объект: ЧтениеXML. Он позволяет читать сообщения. Далее привожу простейший код, показывающий принцип чтения и разборки XML файла. Пояснения буду приводить в виде комментариев, чтобы не разрывать код на куски и его можно было скопировать для дальнейшего использования.
Таким образом, зная структуру файла, можно его разобрать «по полочкам» в программе 1С.
Запись данных из 1C в XML
Так же создадим объект ЗаписьXML.
Таким образом мы выгрузим код и наименование всех организаций из справочника 1С «Организации».
Выгрузка из 1C в XML с помощью XDTO-пакетов
В 1С предприятии существует такой объект метаданных, как XDTO-пакеты. Они служат для обмена данными в формате XML.
XDTO-пакет позволяет создать структуру, по которой потом пойдет выгрузка данных. Покажу пример такой структуры:
Теперь, определив структуру (ее, кстати, можно загрузить из файла), мы можем смело сформировать файл:
Вот так, определив заранее схему, можно создать файл любой сложности.
Если Вы начинаете изучать 1С программирование, рекомендуем наш бесплатный курс (не забудьте подписаться на YouTube — регулярно выходят новые видео):
К сожалению, мы физически не можем проконсультировать бесплатно всех желающих, но наша команда будет рада оказать услуги по внедрению и обслуживанию 1С. Более подробно о наших услугах можно узнать на странице Услуги 1С или просто позвоните по телефону +7 (499) 350 29 00. Мы работаем в Москве и области.
Формирование файла XML. Простая выгрузка для стороннего приложения
Передача данных
В организации учет может вестить не только в решениях на платформе 1С:Предприятие, но и в других программным комплексах (Галактика, Парус, SAP и прочее). При этом появляются задачи интеграции двух приложений.
Обмен с использованием этого формата является универсальным, поскольку с ним могут работать большинство приложений. Рассмотрим как можно из 1С:Предприятия выгрузить список документов конфигурации в XML-файл.
Выгрузка в XML
И так, перейдем к главному. Нам нужно обойти список метаданных документов и сформировать список в XML-файле. На следующем скриншоте представлен алгоритм формирования XML-файла:
Каждый созданный элемент должен быть правильно завершен. После выполнения «ЗаписатьНачалоЭлемента()» обязательно должен быть выполнен метод «ЗаписатьКонецЭлемента», иначе структура XML-файла будет некорректной.
Общий шаблон создания XML-файлов предсавляет собой следующую последовательность:
С помощью этих пяти шагов создается практически любой XML-файл.
В нашем примере созданный файл переводится в двоичные данные и возвращается в место вызова функции «СоздатьXML». Далее этот файл может быть записан в файловую систему.
Пример выгруженного файла Вы могли видеть на скриншоте выше.
Стороннее приложение
Програма читает созданный файл и выводит документы в виде списка:
Можете попробовать сами, приложение доступно для загрузки по ссылке в конце статьи.
Универсальность
Формат XML используется в большинстве конфигурации обмена данными между прикладными решениями на платформе 1С:Предприятие. Другим часто используемым способом обмена является подключение через COM-соединение. XML-позволяет выполнять обмен практически с любыми приложениями, чем и заслужил называться универсальным.
Новичок новичку: как выгрузить/загрузить XML данные
Перед Вами возникла задача загрузки, выгрузки метаданных (документы, справочники, регистры. ).
Возникнуть такая задача может по разным причинам. Как правило — это бэкап и перенос из базы в базу. Сейчас нас не интересует причина, просто примем как данность: потребовалась выгрузка, а затем последующая загрузка. Ее мы и будем сегодня выполнять.
Прежде всего, сразу хочу Вас остановить бежать открывать конфигуратор. Есть прекрасный инструмент, созданный самой фирмой 1С, который называется ВыгрузкаЗагрузкаДанныхXML83.epf (есть и ВыгрузкаЗагрузкаДанныхXML82.epf). Этим инструментом можно воспользоваться, если требуется перенести вообще все записи в метаданных, например, все документы товаров и услуг или все строки в справочнике номенклатура. Однако тонкой настройки выгрузки и загрузки Вы не при этом не получите. Выгрузятся все документы, а не конкретный или за период, а при загрузке, если документ уже такой есть, вы можете получить или задвоение, или сообщение об ошибке (которую, впрочем можно игнорировать). В принципе, все решаемо, но потребует более осмысленных действий, чем просто нажатие на кнопку.
Для более тонкой настройки выгрузки/загрузки можно использовать конфигурацию «Конвертация». Выгружать /загружать тут можно что угодно и как угодно, но изучение данного продукта потребует не одной недели практики.
А у Вас ситуация: нужно срочно что-то выгрузить / загрузить и некогда разбираться c существующими инструментами, а конфигуратор открывать Вы умеете, или нужно доработать уже существующий механизм, или разработать свой для пользователя, который не хочет разбираться в Конвертации, а хочет иметь «волшебную» кнопку, которая сделает все за него.
Для начала выполнения кода по загрузке или выгрузке нам нужно 2 кнопки: по нажатии на одну будет происходить выгрузка, а по нажатии на другую будет происходить загрузка. Где они будут расположены не важно, для примера, создадим обработку, в которую добавим форму, а на форму закинем эти 2 кнопки.
Формат выгрузки выберем xml, это стандарт и будем ему следовать, да и обрабатывать такой файл легче, чем, допустим, текстовой.
Для примера, добавим возможность выгрузки за период. Так как в выгрузке у нас выгружается только то что нам нужно, то загружать будем все подряд (хотя дело Ваше, можете добавить условия и в загрузку).
В результате у Вас должна получиться форма похожая на:
Переходим в модуль формы и вставляем следующий текст:
Возвращаемся в форму. Переходим во вкладку команд формы. И указываем для команды выгрузить действие выгрузить, для команды загрузить действие загрузить:
В принципе, для моей конфигурации обработка уже рабочая. Но под Ваши задачи ее нужно переделать. А для этого разберем код.
Процедура ПриОткрытии устанавливает по умолчанию даты периода. Чтобы процедура срабатывала при открытии формы, ее следует указать в соответствующем событии формы.
Делать это не обязательно. Просто для удобства пользования.
Прежде всего, нам нужно понять, что наш персональный компьютер и сервер в большинстве случаев — это разные компьютеры. По крайней мере так рекомендовано. 1С и я вместе с ними будем исходить из того, что вы работаете за клиентским ПК, а исполняемый код и база данных находятся на другом — сервере.
Так вот 1С решила, что добавлять/читать документы или записи в справочнике можно только на сервере.
Соответственно, код по добавлению, изменению, чтению, будет выполняться на ДРУГОМ ПК. Не на Вашем!
А так как файлы сервера — это не Ваши файлы, а Ваши файлы — это не файлы сервера. То нам нужно какое-то общее и для Вас и для сервера хранилище файлов. Вот в нем и будут происходить все операции. Такое хранилище называется временным.
Разбираем код выгрузки.
Команду выгрузки я подглядел в обработке ВыгрузкаЗагрузкаДанныхXML83.epf, о которой я говорил выше. Так что выгрузка у нас будет вполне себе типовая (правда я выкинул кучу строк ненужного кода, чем облегчил Вам труд)
Первым делом на клиенте создаем общее хранилище:
АдресФайлаВоВременномХранилище, так как мы не знаем ничего про него, то присваиваем ему пустой адрес.
Затем строчкой ВыгрузитьНаСервере(АдресФайлаВоВременномХранилище); мы заполняем наше временное хранилище данными которые хотим сохранить в виде файла.
Строкой ПолучитьФайл(АдресФайлаВоВременномХранилище, «Выгрузка.xml»); мы забираем из временного хранилища на свой компьютер данные, которые можно или посмотреть или сохранить в виде файла с названием Выгрузка.xml. Это стандартная процедура. Работает везде одинаково и разбору не подлежит.
А вот процедуру ВыгрузитьНаСервере(АдресФайлаВоВременномХранилище) разберем подробнее. Именно в ней происходит создание и заполнение временного файла обмена.
На сервере еще нет нужного нам файла, а потому первыми двумя строками мы определяем временный файл на сервере. Код выполняется на сервере, а потому временный файл тоже будет на сервере. Его мы заполним и поместим во временное хранилище из которого уже заберем себе на клиента.
Далее запросом получаем данные, которые необходимо выгружать в файл. Для примера, взят абстрактый документ, который называется ФП_Месячный, у него есть реквизиты: Дата, Номер, Период и табличная часть: Статьи.
Далее идет блок заполнения временного файла данными из запроса.
Первым делом мы объявляем новую ЗаписьXML. С помощью нее будет производиться запись во временный файл: ЗаписьXML.ОткрытьФайл(ИмяВременногоФайла,»UTF-8″);
UTF-8 — это кодировка текста. Ее можно принять как стандарт для большинства случаев.
Далее запись информации идет по принципу скобок в тексте. Есть открывающая, есть закрывающая и что-то в середине. Можно вкладывать одни элементы в другие:
Открываем элемент: ЗаписьXML.ЗаписатьНачалоЭлемента(«НазваниеЭлемента»);
//что-то делаем, конкретно в нашем случае, мы делаем запись о реквизите документа либо о самом документе
Закрываем элемент: ЗаписьXML.ЗаписатьКонецЭлемента()
Во время записи активно пользуемся функцией XMLСтрока(), которая преобразует метаданные в строковой тип, понятный для записи/чтения XML.
Так как сохранять данные мы можем только простые (число, дата, строка, булево…). То ссылочный тип данных Вид (это справочник с видами статей) мы сохранить не можем. Но мы можем сохранить Код Вида из справочника видов — это строка. Когда мы будем наоборот загружать данные из ХML, то мы будем получать Код. По коду искать ссылку в справочнике. И уже эту ссылку записывать в документ.
После того как документ xml сформирован (а именно это мы и делали). Мы ЗаписьXML помещаем в файл, хотя по сути, он и так временный файл, проверяем всели у нас получилось, и если да, то помещаем данные во временное хранилище. Почему это так сделано, я не знаю, механизм типовой.
Ну и последним делом, мы удаляем на сервере временный файл. Если это не сделать, то сервер быстро переполниться временными файлами.
Вообще ситуация с временными файлами мне не нравится. Если загрузка/выгрузка будет идти постоянно, то накопитель сервера быстро выйдет из строя. Но так сделано разработчиками 1С. Этот код я подсмотрел у них в стандартной обработке.
Если можете подсказать как сделать все в оперативной памяти буду благодарен.
Разбираем код загрузки.
Тут уж я не поленился не стал брать типовой механизм, обшарил все форумы и нашел как провести загрузку без использования временных файлов.
1. Простой. Считать xml файл в переменную (массив) на клиенте. А после передав эту переменную на сервер, читая данные из массива записывать новые документы.
2. Интересный. Передать xml файл на сервер и читать строки из него в оперативной памяти, не используя файлы вообще.
Оба этих метода требуют значительного количества памяти на сервере, а потому рекомендуется делать проверку на количество передаваемой информации. И если ее много, то всеже использовать файловый вариант и читать из файла блоками.
Рассмотрим вариант 2.
Помещать файл выгрузки на сервер во временное хранилище мы будем стандартной процедурой НачатьПомещениеФайла(). Так как механизм типовой, я просто скопировал код из примера 1С.
Для всех он будет одинаков. Единственно что я поменял, это фильтр (сделал xml). Стоит еще обратить внимание на размер. В моем случае он равен 4Гб. В Вашем, можете сделать меньше (больше нельзя).
Процедуру ПоместитьФайлКомандаЗавершение() переписал полностью. В ней я смотрю был ли выбран файл. Если файл был выбран, если он удовлетворяет размеру и расширению, тогда будет происходить чтение из данных указного файла в процедуре ОбработатьНаСервере(Адрес), где Адрес — это адрес временного хранилища. Ну а после того, как мы добавим данные, следует попросить систему перечитать базу, так как данные изменились. Это мы делаем процедурой ОповеститьОбИзменении(Тип(«ДокументСсылка.ФП_Месячный»)). Делать это не обязательно, но тогда чтобы увидеть результат нам придется закрыть и снова открыть список документов ФП_Месячный.
Рассмотрим процедуру ОбработатьНаСервере(Адрес)
Первым делом на сервере из временного хранилища нужно получить то, что мы помещали на клиенте: Данные = ПолучитьИзВременногоХранилища(Адрес);
Объявляем новую переменную с типом ЧтениеXML. В ней будет храниться весь документ XML.
Хитрая строка Парсер.УстановитьСтроку(ПолучитьСтрокуИзДвоичныхДанных(Данные,КодировкаТекста.UTF8)) преобразует двоичные данные в строку xml, которую затем записывает в объявленную ранее переменную с типом ЧтениеXML.
А далее читаем каждую строчку из XML и, в зависимости от данных, заполняем документ.
Ссылочные данные документа заполняются через их поиск по коду из xml.
Да возможность передачи ссылки имеется. Но я не рекомендую ее использовать, дабы данные не задвоились. То есть Документы с одинаковыми Кодами по сути будут разные так как у них разные ссылки (GUID). А если вести запись по коду документа, то документов с одинаковыми кодами Вы не получите. Будет сформировано исключительное событие и перенос данных в базу будет приостановлен. Поэтому я использую оператор попытка при записи документа. Если документ с таким кодом и датой уже есть, то запись произведена не будет, а будет переход к следующей записи.
PS. Благодаря подсказке Сергея, код преобразования данных в XML можно серьезно сократить. Просто замените функцию и процедуру. Будет менее понятно, что такое XML, как он должен заполняться и читаться, но ведь и не всем это надо:
Заметки из Зазеркалья
Реализовано в версиях 8.3.7.1759 и 8.3.8.1652.
Иерархическая выгрузка в файлы XML
. новый формат выгрузки, иерархический, формирует структуру каталогов с файлами:
Иерархическая выгрузка позволяет избавиться от проблем, связанных с очень длинными именами файлов. Такие проблемы могли возникать раньше как при выгрузке, так и при переносе файлов между разными файловыми системами (FAT, NTFS, EXT).
Сам по себе иерархический формат выгрузки не гарантирует того, что в выгрузке не появится очень длинных имён, или очень длинных путей. Поэтому мы ввели ряд ограничений и рекомендаций. Например, в конфигураторе нельзя создавать имена объектов длиннее 80 символов, не рекомендуется использовать подсистемы большой вложенности, каталог выгрузки следует располагать как можно ближе к корню устройства и так далее.
Вы можете управлять форматом выгрузки при запуске конфигуратора в пакетном режиме. Для этого прежнему параметру DumpConfigToFiles мы добавили новую опцию Format. Если вы хотите выгрузить в старом, линейном формате, это нужно указать в явном виде:
Без указания этой опции выгрузка выполняется в иерархическом формате. А при загрузке формат определяется автоматически, и никаких дополнительных опций не требуется.
Частичная загрузка конфигурации из файлов XML
Однако вы можете использовать эту возможность и независимо от Development Tools. Потому что для загрузки отдельных файлов конфигурации используется запуск конфигуратора из командной строки в пакетном режиме. А значит, используя частичную загрузку, вы можете:
Мы сразу хотим обратить ваше внимание на то, что мы реализовали только частичную загрузку, и только из командной строки. Частичной выгрузки нет так же, как нет интерактивных команд конфигуратора, позволяющих загружать часть конфигурации.
Поэтому загрузить только модуль справочника Номенклатура вы можете, например, следующей командой:
Для частичной загрузки используется прежний параметр LoadConfigFromFiles, и две новых опции: Files и ListFiles. Files позволяет вам перечислить через запятую те файлы, которые нужно загрузить, если таких файлов немного. А если их много, тогда вы можете использовать опцию ListFiles. Она указывает на файл, в котором перечислены XML файлы, которые нужно загрузить.
Кроме этого, для повышения удобства работы, мы разрешили совместное использование в одной строке параметров LoadConfigFromFiles и UpdateDBCfg. Таким образом, теперь за один вызов вы можете загрузить изменения и принять их (обновить конфигурацию базы данных).
Выгрузка/загрузка внешних отчётов и обработок в/из XML
В версии 8.3.8 мы добавили возможность выгружать в XML и загружать внешние отчёты и обработки:
Также мы добавили возможность сравнить внешний отчёт или обработку с XML выгрузкой. Все эти изменения мы сделали в первую очередь для того, чтобы в новой среде разработки 1C:Enterprise Development Tools обеспечить полноценную работу с внешними отчётами и обработками. Однако и отдельно от Development Tools эти возможности могут быть вам полезны для любых автоматизированных изменений выгруженных XML файлов.
Выгрузить/загрузить внешние отчёты/обработки вы можете не только интерактивно, но и автоматически, запуская конфигуратор в пакетном режиме. Для этого мы добавили два новых параметра: DumpExternalDataProcessorOrReportToFiles и LoadExternalDataProcessorOrReportFromFiles.
XML в 1С 8.3
Формат XML
Общее описание
XML (eXtensible Markup Language) — это расширяемый язык разметки. Он называется расширяемым, потому что разработчик сам определяет структуру тегов и атрибутов внутри XML-документа. XML определяет лишь синтаксис языка.
Как правило XML используется для обмена данными или для хранения данных.
XML-документ состоит из следующих элементов:
XML-документ состоит из элементов (также называют узлами). В свою очередь элемент состоит из тегов.
В XML может быть 2 вида тегов:
Значения
Между открывающим и закрывающим тегом находится значение:
Если у элемента нет значения, то его можно отразить одним тегом:
Данный элемент аналогичен следующему элементу:
Значение может принимать следующие типы:
Элементы могут быть сколько угодно раз вложены друг в друга. У одного элемента может быть сколько угодно вложенных элементов, но только один владелец. Из этого следует, что на самом верху всегда должен быть только один элемент, который называется корневым элементом. Только у корневого элемента нет владельца.
Атрибуты
Каждый элемент может иметь произвольное количество атрибутов. Атрибуты указываются в открывающем теге в виде пары имя = «значение». Имя указывается обычной строкой, значение всегда помещается в кавычки:
Объявление XML
В начале XML-документа может быть следующая строка:
Такая строка называется объявлением XML (другое название XML пролог). В ней указывается версия XML и кодировка. Данная строка не обязательна, если ее нет, то кодировкой по умолчанию считается UTF-8.
Проверка корректности XML
XML-документ должен удовлетворять следующим условиям:
Комментарии в XML
Пространства имен
В XML можно использовать пространства имен. Они позволяют внутри одного документа использовать элементы с одинаковым именем, но принадлежащие разным пространствам имен.
Например, есть следующий XML файл:
Для этого можно объявить пространства имен и указать свое пространство для каждого тега:
Пространство имен может быть объявлено в любом теге в атрибуте xmlns. Сначала указывается префикс, а потом само пространство:
Имя пространства имен должно быть уникальным. Как правило используется URL сайта, хотя можно использовать произвольные идентификаторы.
Теперь перед именем элементов можно указывать префикс, чтобы указать к какому пространству имен он принадлежит. Префикс можно использовать только внутри того элемента (включая все вложенные в него элементы), в котором было объявлено пространство имен:
Можно указать пространство имен без префикса:
В этом случае все теги без префикса автоматически будут принадлежать этому пространству.
Запись XML
Для записи XML файла в 1С используется объект ЗаписьXML. Для создания данного объекта используется следующий конструктор:
Данный объект реализует последовательную запись. Это означает, что документ не загружается полностью в память, а также нельзя перепрыгивать на другие узлы внутри XML документа.
Чтобы указать файл, в который будет записан XML нужно вызвать метод ОткрытьФайл. Первым параметром указывается путь к файлу, вторым кодировка (по умолчанию UTF-8), третьим признак использования BOM (по умолчанию Истина):
Чтобы записать в файл строку с объявлением XML нужно вызвать метод ЗаписатьОбъявлениеXML:
Записывать объявление XML нужно перед записью других элементов, иначе будет выброшено исключение «Ошибочный порядок записи XML».
Для записи тегов используются методы ЗаписатьНачалоЭлемента и ЗаписатьКонецЭлемента. В методе ЗаписатьНачалоЭлемента нужно параметром указать имя тега. В методе ЗаписатьКонецЭлемента ничего не указывается, будет записан закрывающий тег последнего открытого тега:
Для записи значения нужно вызвать метод ЗаписатьТекст, передав параметром записываемое значение. Так как значение записывается между открывающим и закрывающим тегами, то его нужно вызывать до метода ЗаписатьКонецЭлемента:
Для записи атрибутов используются методы ЗаписатьНачалоАтрибута и ЗаписатьКонецАтрибута. В метод ЗаписатьНачалоАтрибута нужно параметром передать имя атрибута. Метод ЗаписатьКонецАтрибута закончит запись последнего начатого атрибута. Между двумя этими методами нужно вызвать метод ЗаписатьТекст для записи значения атрибута. Запись атрибутов должна выполняться сразу после вызова метода ЗаписатьНачалоЭлемента, иначе не будет понятно к какому тегу относятся атрибуты:
Также есть метод ЗаписатьАтрибут, которому параметрами нужно передать имя и значение атрибута. Его можно использовать вместо трех методов: ЗаписатьНачалоАтрибута, ЗаписатьТекст и ЗаписатьКонецАтрибута:
Для записи комментария используется метод ЗаписатьКомментарий. Его можно вызвать в любой момент, комментарий не влияет на структура XML-документа:
При записи элементов XML выполняется контроль правильной последовательности вызовов методов. И если последовательность будет нарушено, то будет выброшено исключение «Ошибочный порядок записи XML».
С помощью метода ЗаписатьБезОбработки можно записать в XML-файл произвольное значение без проверки порядка записи. Параметром можно передать произвольную строку, в том числе уже сформированная часть XML-файла:
В этом случае нужно учитывать, что после записи XML-файл может быть не валидным.
После окончания записи нужно вызвать метод Закрыть, который закроет записываемый файл:
Пример записи XML-файла:
В результате будет получен следующий файл:
Запись XML в строку
Если нужно записать XML не в файл, а в строку, например для передачи через веб-сервис, то нужно вместо метода ОткрытьФайл, вызвать метод УстановитьСтроку. Параметром можно указать кодировку.
При вызове метода Закрыть будет получена строка с XML:
Запись пространства имен
Для записи соответствия префикса и пространства имен используется метод ЗаписатьСоответствиеПространстваИмен. Первым параметром указывается префикс, вторым пространство имен:
Чтобы указать принадлежность элемента определенному пространству имен нужно просто указать его префикс в имени элемента:
Пример записи XML файла с пространством имен:
В результате будет получен следующий XML:
Чтение XML
Для чтения XML файла предназначен объект ЧтениеXML. Для создания данного объекта используется следующий конструктор:
Данный объект реализует последовательное чтение. Это означает, что документ не загружается полностью в память, что позволяет читать даже очень большие файлы. А также это означает, что нельзя перепрыгивать на другие узлы внутри XML-документа, чтение выполняется только последовательно.
Алгоритм чтения XML файла выглядит следующим образом: