Как выгрузить из 1с файл в формате xml
В основе работы с XML-файлами лежит технология доступа SAX, которая осуществляет считывание по одному тегу. Для этого существует два типа данных – ЗаписьXML и ЧтениеXML.
Запись данных справочника в XML-файл:
Код 1C v 8.х
Чтение данных из XML-файла в справочник:
Код 1C v 8.х
Создадим обработку в типовой конфигурации для экспорта плана счетов. Структура xml-файла должна быть такой. Корневой элемент xml-документа соответствует плану счетов в целом. В нем располагаются подчиненные элементы с именем Счет, содержащие информацию о счетах. В качестве содержимого элементов указывается наименование счета. Остальные данные записываются в качестве атрибутов (код, признаки валютного, количественного учета и пр.). В качестве подчиненных элементов для элемента Счет задаются элементы, обозначающие его субсчета с теми же атрибутами. Приведем код процедуры экспорта плана счетов.
Код 1C v 7.x
В результате будет получен файл, вот его фрагмент:
Код
<?xml version="1.0" encoding="windows-12Sl" ?> - <ПланСчетов>
<Счет Код="00" Валютный="0" Количественный="0" Забалансовый="0" вид="активно-пассивный">Вспомогательный</Счет>
- <Счет Код="01" Валютный="0" Количественный="0" Забалансовый="0" вид="активный">
Основные средства
<Субсчет Код="01.1" Валютный="0" Количественный="0" Забалансовый="0"
вид="активный">ОС в организации</Субсчет> <Субсчет Код="01.2" Валютный="0" Количественный="0" Забалансовый="0"
вид="активный">Выбытие ОС</Субсчет> </Счет>
- <Счет Код="02" Валютный="0" Количественный="0" Забалансовый="0" вид="пассивный">
Амортизация ОС
А теперь приведем код для импорта плана счетов из xml-файла в новую конфигурацию. Код модуля соответствующей обработки должен содержать процедуру Выполнить(), которая имеет такой вид.
Перед Вами возникла задача загрузки, выгрузки метаданных (документы, справочники, регистры. ).
Возникнуть такая задача может по разным причинам. Как правило — это бэкап и перенос из базы в базу. Сейчас нас не интересует причина, просто примем как данность: потребовалась выгрузка, а затем последующая загрузка. Ее мы и будем сегодня выполнять.
Для более тонкой настройки выгрузки/загрузки можно использовать конфигурацию «Конвертация». Выгружать /загружать тут можно что угодно и как угодно, но изучение данного продукта потребует не одной недели практики.
А у Вас ситуация: нужно срочно что-то выгрузить / загрузить и некогда разбираться c существующими инструментами, а конфигуратор открывать Вы умеете, или нужно доработать уже существующий механизм, или разработать свой для пользователя, который не хочет разбираться в Конвертации, а хочет иметь «волшебную» кнопку, которая сделает все за него.
Для начала выполнения кода по загрузке или выгрузке нам нужно 2 кнопки: по нажатии на одну будет происходить выгрузка, а по нажатии на другую будет происходить загрузка. Где они будут расположены не важно, для примера, создадим обработку, в которую добавим форму, а на форму закинем эти 2 кнопки.
Формат выгрузки выберем xml, это стандарт и будем ему следовать, да и обрабатывать такой файл легче, чем, допустим, текстовой.
Для примера, добавим возможность выгрузки за период. Так как в выгрузке у нас выгружается только то что нам нужно, то загружать будем все подряд (хотя дело Ваше, можете добавить условия и в загрузку).
В результате у Вас должна получиться форма похожая на:
Переходим в модуль формы и вставляем следующий текст:
Возвращаемся в форму. Переходим во вкладку команд формы. И указываем для команды выгрузить действие выгрузить, для команды загрузить действие загрузить:
В принципе, для моей конфигурации обработка уже рабочая. Но под Ваши задачи ее нужно переделать. А для этого разберем код.
Процедура ПриОткрытии устанавливает по умолчанию даты периода. Чтобы процедура срабатывала при открытии формы, ее следует указать в соответствующем событии формы.
Делать это не обязательно. Просто для удобства пользования.
Небольшое отступление.
Прежде всего, нам нужно понять, что наш персональный компьютер и сервер в большинстве случаев — это разные компьютеры. По крайней мере так рекомендовано. 1С и я вместе с ними будем исходить из того, что вы работаете за клиентским ПК, а исполняемый код и база данных находятся на другом — сервере.
Продолжаем исходить из того, что сервер — это отдельный компьютер (даже если это не так, но для универсальности кода придется так считать - Ваш ПК будет сервером для самого себя).
Так вот 1С решила, что добавлять/читать документы или записи в справочнике можно только на сервере.
Соответственно, код по добавлению, изменению, чтению, будет выполняться на ДРУГОМ ПК. Не на Вашем!
А так как файлы сервера — это не Ваши файлы, а Ваши файлы — это не файлы сервера. То нам нужно какое-то общее и для Вас и для сервера хранилище файлов. Вот в нем и будут происходить все операции. Такое хранилище называется временным.
Разбираем код выгрузки.
Команду выгрузки я подглядел в обработке ВыгрузкаЗагрузкаДанныхXML83.epf, о которой я говорил выше. Так что выгрузка у нас будет вполне себе типовая (правда я выкинул кучу строк ненужного кода, чем облегчил Вам труд)
Первым делом на клиенте создаем общее хранилище:
АдресФайлаВоВременномХранилище, так как мы не знаем ничего про него, то присваиваем ему пустой адрес.
Затем строчкой ВыгрузитьНаСервере(АдресФайлаВоВременномХранилище); мы заполняем наше временное хранилище данными которые хотим сохранить в виде файла.
Строкой ПолучитьФайл(АдресФайлаВоВременномХранилище, "Выгрузка.xml"); мы забираем из временного хранилища на свой компьютер данные, которые можно или посмотреть или сохранить в виде файла с названием Выгрузка.xml. Это стандартная процедура. Работает везде одинаково и разбору не подлежит.
А вот процедуру ВыгрузитьНаСервере(АдресФайлаВоВременномХранилище) разберем подробнее. Именно в ней происходит создание и заполнение временного файла обмена.
На сервере еще нет нужного нам файла, а потому первыми двумя строками мы определяем временный файл на сервере. Код выполняется на сервере, а потому временный файл тоже будет на сервере. Его мы заполним и поместим во временное хранилище из которого уже заберем себе на клиента.
Далее запросом получаем данные, которые необходимо выгружать в файл. Для примера, взят абстрактый документ, который называется ФП_Месячный, у него есть реквизиты: Дата, Номер, Период и табличная часть: Статьи.
Далее идет блок заполнения временного файла данными из запроса.
Первым делом мы объявляем новую ЗаписьXML. С помощью нее будет производиться запись во временный файл: ЗаписьXML.ОткрытьФайл(ИмяВременногоФайла,"UTF-8");
UTF-8 — это кодировка текста. Ее можно принять как стандарт для большинства случаев.
ЗаписьXML.ЗаписатьОбъявлениеXML() - записываем во временный файл служебную информацию, например, информацию о кодировке. Тут думать не надо. Метод стандартный, все что нужно сделает сам.
Далее запись информации идет по принципу скобок в тексте. Есть открывающая, есть закрывающая и что-то в середине. Можно вкладывать одни элементы в другие:
Открываем элемент: ЗаписьXML.ЗаписатьНачалоЭлемента("НазваниеЭлемента");
//что-то делаем, конкретно в нашем случае, мы делаем запись о реквизите документа либо о самом документе
Закрываем элемент: ЗаписьXML.ЗаписатьКонецЭлемента()
Во время записи активно пользуемся функцией XMLСтрока(), которая преобразует метаданные в строковой тип, понятный для записи/чтения XML.
Так как сохранять данные мы можем только простые (число, дата, строка, булево…). То ссылочный тип данных Вид (это справочник с видами статей) мы сохранить не можем. Но мы можем сохранить Код Вида из справочника видов — это строка. Когда мы будем наоборот загружать данные из ХML, то мы будем получать Код. По коду искать ссылку в справочнике. И уже эту ссылку записывать в документ.
После того как документ xml сформирован (а именно это мы и делали). Мы ЗаписьXML помещаем в файл, хотя по сути, он и так временный файл, проверяем всели у нас получилось, и если да, то помещаем данные во временное хранилище. Почему это так сделано, я не знаю, механизм типовой.
Ну и последним делом, мы удаляем на сервере временный файл. Если это не сделать, то сервер быстро переполниться временными файлами.
Вообще ситуация с временными файлами мне не нравится. Если загрузка/выгрузка будет идти постоянно, то накопитель сервера быстро выйдет из строя. Но так сделано разработчиками 1С. Этот код я подсмотрел у них в стандартной обработке.
Если можете подсказать как сделать все в оперативной памяти буду благодарен.
Разбираем код загрузки.
Тут уж я не поленился не стал брать типовой механизм, обшарил все форумы и нашел как провести загрузку без использования временных файлов.
Вообще варианта 2:
1. Простой. Считать xml файл в переменную (массив) на клиенте. А после передав эту переменную на сервер, читая данные из массива записывать новые документы.
2. Интересный. Передать xml файл на сервер и читать строки из него в оперативной памяти, не используя файлы вообще.
Оба этих метода требуют значительного количества памяти на сервере, а потому рекомендуется делать проверку на количество передаваемой информации. И если ее много, то всеже использовать файловый вариант и читать из файла блоками.
Рассмотрим вариант 2.
Помещать файл выгрузки на сервер во временное хранилище мы будем стандартной процедурой НачатьПомещениеФайла(). Так как механизм типовой, я просто скопировал код из примера 1С.
Для всех он будет одинаков. Единственно что я поменял, это фильтр (сделал xml). Стоит еще обратить внимание на размер. В моем случае он равен 4Гб. В Вашем, можете сделать меньше (больше нельзя).
Процедуру ПоместитьФайлКомандаЗавершение() переписал полностью. В ней я смотрю был ли выбран файл. Если файл был выбран, если он удовлетворяет размеру и расширению, тогда будет происходить чтение из данных указного файла в процедуре ОбработатьНаСервере(Адрес), где Адрес — это адрес временного хранилища. Ну а после того, как мы добавим данные, следует попросить систему перечитать базу, так как данные изменились. Это мы делаем процедурой ОповеститьОбИзменении(Тип("ДокументСсылка.ФП_Месячный")). Делать это не обязательно, но тогда чтобы увидеть результат нам придется закрыть и снова открыть список документов ФП_Месячный.
Рассмотрим процедуру ОбработатьНаСервере(Адрес)
Первым делом на сервере из временного хранилища нужно получить то, что мы помещали на клиенте: Данные = ПолучитьИзВременногоХранилища(Адрес);
Объявляем новую переменную с типом ЧтениеXML. В ней будет храниться весь документ XML.
Хитрая строка Парсер.УстановитьСтроку(ПолучитьСтрокуИзДвоичныхДанных(Данные,КодировкаТекста.UTF8)) преобразует двоичные данные в строку xml, которую затем записывает в объявленную ранее переменную с типом ЧтениеXML.
А далее читаем каждую строчку из XML и, в зависимости от данных, заполняем документ.
Ссылочные данные документа заполняются через их поиск по коду из xml.
Отступление.
Да возможность передачи ссылки имеется. Но я не рекомендую ее использовать, дабы данные не задвоились. То есть Документы с одинаковыми Кодами по сути будут разные так как у них разные ссылки (GUID). А если вести запись по коду документа, то документов с одинаковыми кодами Вы не получите. Будет сформировано исключительное событие и перенос данных в базу будет приостановлен. Поэтому я использую оператор попытка при записи документа. Если документ с таким кодом и датой уже есть, то запись произведена не будет, а будет переход к следующей записи.
PS. Благодаря подсказке Сергея, код преобразования данных в XML можно серьезно сократить. Просто замените функцию и процедуру. Будет менее понятно, что такое XML, как он должен заполняться и читаться, но ведь и не всем это надо:
Выгрузить счет из 1С в формате xml можно при помощи специальной обработки «Выгрузка и загрузка данных XML», которая расположена в 1С: Предприятии версии 8.3 и находится в каталоге EXE/EXTREPS/UNIREPS83/UploadToXML. Так же ее можно скачать здесь .
После скачивания обработки ее необходимо запустить. Для этого воспользуемся командой Открыть
Указываем место, куда была сохранена обработка и нажимаем Открыть
В окне обработки во вкладке Выгрузка указываем:
Данные для выгрузки
Куда будут выгружены данные
Если не выбран период выгрузки, то будут выгружены все данные указанного типа.
На вкладке Дополнительные объекты для выгрузки можно отобрать один или несколько объектов для выгрузки
По кнопке Выгрузить данные происходит выгрузка в файл на сервере или клиентский компьютер (в зависимости от режима работы 1С Предприятие – файловый или клиент-серверный). Перед выгрузкой необходимо установить переключатель в соответствующее положение
Данная обработка позволяет также загрузить данные из файла в другую информационную базу при условии абсолютной идентичности информационных баз (одинаковые версии конфигурации)
Перенос информации между базами данных является одной из задач их поддержки и администрирования. Для его эффективного выполнения в автоматизированных комплексах 1С создаются обработки. Они значительно облегчают рутинную работу, ускоряют процессы выгрузки-загрузки информации и одновременно реализуют контроль ее корректности. Выгрузка из 1с в xml позволяет создавать файл с содержимым любого объекта настроенной конфигурации, и использовать его, когда необходима выгрузка данных в идентичную конфигурацию.
Инструменты для создания выгрузки
Для экспорта информации, содержащейся в базах данных, главным образом используется формат xml. Для 1С разработано множество обработок (например, ВыгрузкаЗагрузкаДанныхxml82 epf), при помощи которых возможно выводить в файл и загружать данные. При этом пользователь должен получать файл определенной структуры, который позволяет загружать хранящуюся в нем информацию в родную базу данных или переносить ее в другое место. При создании выгрузки следует соблюдать следующие правила:
- Сохранить созданные файлы до момента полного восстановления и окончания процедур проверки корректности перенесенной информации;
- В случае использования обработки как инструмента резервного копирования создавать для копий данных отдельные подпапки и вести журнал их учета для быстрого поиска.
Поставляемая в программе поддержки пользователей 1С универсальная обработка «Выгрузка и загрузка данных XML», которую можно найти на сайте или дисках ИТС, является великолепным средством для экспорта и импорта информации. Пользователь компьютера может выгрузить как всю базу, так и ее отдельные объекты, при этом кроме собственно экспорта производятся различные операции по проверке информации, помогающие избавиться от критических ошибок в данных.Обработка 1с выгрузка в xml работает в двух режимах:
- Выгрузка. Создает файл, содержащий выгружаемые объекты, определяемые пользователем;
- Загрузка. Производит чтение экспортируемого ранее файла и записывает находящиеся в нем сведения в информационную базу.
Обработка позволяет произвести контроль объектов на недопустимые символы, а также включает в себя функцию экспорта информации с ограничениями.
Выгрузка может использоваться не только при обмене информацией между базами 1С. С ее помощью можно обеспечить интеграцию различных комплексов, например, 1С и системы Парус. Универсальность формата XML позволяет создавать программы для переноса информации практически для любых информационных банков. Обработка выгрузка и загрузка данных xml – важнейший инструмент обмена информацией.
Процесс выгрузки данных в xml
Рассмотрим, как выгрузить из 1с в xml в обычном режиме. После закачки обработки ВыгрузкаЗагрузкаДанныхxml.epf и ее открытия необходимо выполнить следующие шаги:
- Отобрать объекты для экспорта;
- Настроить необходимые фильтры, например, по периоду;
- Определить месторасположение файла с информацией на дисковой подсистеме;
- Запустить выгрузку объектов.
Необходимо помнить, что заголовочная часть формата файла выгрузки отличается от формата файла, используемого при выгрузке по планам обмена.
Загрузка данных в формате xml
Загрузка xml в 1с производится в базу-приемник с конфигурацией, идентичной базе-источнику. До того, как загрузить в 1с xml 1с необходимо открыть обработку в базе-приемнике. Затем нужно указать путь до выгруженного ранее файла и осуществить загрузку данных нажатием на кнопку «Загрузить данные».
При необходимости активируются флажки для загрузки данных в режиме обмена в распределенной информационной базе и игнорирования возникающих ошибок при загрузке объектов.
После этого необходимо проверить базы и убедиться, что все элементы загружены корректно, чтобы не получить их потери, например, если произошла ошибка в обработчике события после загрузки объекта.
Читайте также: