Сохранить в 1с в xml
Во всех типовых конфигурациях 1С предусмотрена выгрузка документов в файл формата xml ЭДО ФНС России.
Это функционал библиотеки стандартных подсистем.
Но не у всех этот пункт выведен в меню, пример: счета-фактуры.
Решение:
Внешняя обработка в 1С, которой можно выбрать документ и сформировать документ ЭДО формата ФНС.
По сути, это обертка, над стандартным функционалом БСП.
То есть, если для документа предусмотрена выгрузка в формат ЭДО, он выгрузится, если нет - то нет.
Внимание!
Электронный документооборот предполагает для начала аккуратное заполнение всех необходимых документов в 1С.
Возможно вам придется доработать обработку под себя, код открыт и вам придется сделать это самостоятельно или заплатив программисту.
Порядок работы:
Подключаем обработку в 1С как внешнюю обработку - рекомендуемый вариант действий.
В принципе можно и как Файл - Открыть .
Требования к запуску обработки:
Обработка предназначена для использования с актуальными типовыми конфигурациями, или нетиповыми, но включающими в себя библиотеку стандартных подсистем:
для России конфигурации для управляемых форм:
- Бухгалтерия предприятия, редакция 3.0 (проверено на редакции 3.0.111.16)
- Бухгалтерия предприятия КОРП, редакция 3.0 (проверена в редакции (3.0.111.16))
- Управление торговлей, редакция 11 (проверена в редакции (11.4.7.114))
- 1С:ERP Управление предприятием 2
- Управление нашей фирмой, редакция 1.6 (1.6.19.183)
для России конфигурации для обычных форм:
- Бухгалтерия предприятия, редакция 2.0 (проверено на редакции 2.0.66.128)
- Управление торговлей, редакция 10 (проверена в редакции (10.3.67.2))
работа на редакциях отличающихся вторым октетом (после первой точки) или выпущенных ранее 6 месяцев от указанных, не гарантируется и возврат стартмани по этой причине не производится
Также возможна адаптация под любую имеющуюся у пользователя типовую или нетиповую конфигурацию.
Установка и использование обработки:
- Обработка выполнена с использованием управляемых форм, соответственно, для конфигураций с обычным интерфейсом требует для работы включения в конфигурацию либо запуска в управляемом интерфейсе.
- Может использоваться платформа 8.3.12.х и старше
Поддержка отчета, лицензирование:
Не верю, что мне приходится писать для пользователей этого сайта, но как оказалось нужно.
Инфостарт это профессиональное сообщество объединяющее специалистов, которые настраивают и ведут учет в 1С.
Это подразумевает наличие некоторого интеллекта.
Как минимум понимание русского печатного текста.
Но это к сожалению не подразумевает наличия совести.
Поэтому периодически появляются люди "улучшающие" чужие обработки
Да что там люди, технический отдел компании ОЗОН этим занимался.
То, что вы заменили дефис на подчеркивание, не делает вас автором обработки
Вы можете раздавать ее друзьям и знакомым и как написано в публикации - использовать на неограниченном количестве баз.
Но продавать ее от своего имени или даже раздавать бесплатно как это сделал ОЗОН вы не можете по причине существования авторского права.
Пробуйте зарабатывать своим умом
Если читали правила публикаций, там сказано буквами по белому:
2.2.3. Запрещается размещать несколько версий ПО в виде разных Публикаций. Обновление ПО производится путем добавления нового файла или замены существующего в Публикации. Решение об идентичности версий ПО остается за Администрацией.
И да. Если вы даже раздаете обработку бесплатно или дешевле оригинала (непонятно с какой стати)
2.1.18. В случае получения убытков из-за претензий третьих лиц в отношении использования ПО с нарушением интеллектуальных прав Администрация оставляет за собой право требовать с Автора возмещения документально подтвержденных убытков в полном объеме в течение 15 (пятнадцати) рабочих дней с момента получения соответствующего требования, а также уплаты штрафа в размере 100 000 (ста тысяч) рублей сверх суммы возмещения понесенных убытков за каждый факт нарушения авторских прав третьих лиц.
Мне очень не хотелось бы заменять код обработок на абракадабу, чтобы нормальные вменяемые люди могли их и дальше дорабатывать для себя.
"Герой" это обработки onec.developer
Если ее код будет закрыт, все благодарности к нему.
Гарантия возврата денег
ООО "Инфостарт" гарантирует Вам 100% возврат оплаты, если программа не соответствует заявленному функционалу из описания. Деньги можно вернуть в полном объеме, если вы заявите об этом в течение 14-ти дней со дня поступления денег на наш счет.
Программа настолько проверена в работе, что мы с полной уверенностью можем дать такую гарантию. Мы хотим, чтобы все наши покупатели оставались довольны покупкой.
Рассказываю на примере, как с помощью 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-файла, к тому же процедуры малы, просты и легко "допиливаются" под специфические задачи.
Сохранение производится процедурой СохранитьРеквизитыИТабличныеЧасти . В качестве параметров она принимает сохраняемый объект и имя файла. Ссылочные реквизиты сохраняются в виде GUID.
Процедура СохранитьРеквизитыИТабличныеЧасти ( Объект , ИмяФайлаXML =Неопределено) Экспорт
ФайлXML = Новый ЗаписьXML ;
ФайлXML . ОткрытьФайл ( ИмяФайлаXML );
ФайлXML . ЗаписатьОбъявлениеXML ();
ФайлXML . ЗаписатьНачалоЭлемента ( "Root" );
ФайлXML . ЗаписатьАтрибут ( "Объект" , Объект . Метаданные (). Имя );
//Сохраняем реквизиты
Для Каждого Реквизит Из Объект . Метаданные (). Реквизиты Цикл
ФайлXML . ЗаписатьНачалоЭлемента ( "Реквизит" );
ФайлXML . ЗаписатьАтрибут ( "Имя" , Реквизит . Имя );
ТипЗначения = ТипЗнч ( Объект [ Реквизит . Имя ]);
Если Не ТипЗначения = Тип ( "Неопределено" ) Тогда
ФайлXML . ЗаписатьАтрибут ( "ИмяТипа" , XMLТип ( ТипЗначения ). ИмяТипа );
ФайлXML . ЗаписатьАтрибут ( "URI" , XMLТип ( ТипЗначения ). URIПространстваИмен );
КонецЕсли;
ФайлXML . ЗаписатьТекст ( XMLСтрока ( Объект [ Реквизит . Имя ]));
ФайлXML . ЗаписатьКонецЭлемента ();
КонецЦикла;
//Сохраняем табличные части
Для Каждого ТЧ из Объект . Метаданные (). ТабличныеЧасти Цикл
ФайлXML . ЗаписатьНачалоЭлемента ( "ТабличнаяЧасть" );
ФайлXML . ЗаписатьАтрибут ( "Имя" , ТЧ . Имя );
Для Каждого СтрокаТЧ из Объект [ ТЧ . Имя ] Цикл
ФайлXML . ЗаписатьНачалоЭлемента ( "ЭлементКоллекции" );
Для Каждого РеквизитТЧ Из ТЧ . Реквизиты Цикл
ФайлXML . ЗаписатьНачалоЭлемента ( "Реквизит" );
ФайлXML . ЗаписатьАтрибут ( "Имя" , РеквизитТЧ . Имя );
ТипЗначения = ТипЗнч ( СтрокаТЧ [ РеквизитТЧ . Имя ]);
Если Не ТипЗначения = Тип ( "Неопределено" ) Тогда
ФайлXML . ЗаписатьАтрибут ( "ИмяТипа" , XMLТип ( ТипЗначения ). ИмяТипа );
ФайлXML . ЗаписатьАтрибут ( "URI" , XMLТип ( ТипЗначения ). URIПространстваИмен );
КонецЕсли;
ФайлXML . ЗаписатьТекст ( XMLСтрока ( СтрокаТЧ [ РеквизитТЧ . Имя ]));
ФайлXML . ЗаписатьКонецЭлемента ();
КонецЦикла;
ФайлXML . ЗаписатьКонецЭлемента ();
КонецЦикла;
ФайлXML . ЗаписатьКонецЭлемента ();
КонецЦикла;
Если Не ФайлXML =Null Тогда
ФайлXML . ЗаписатьКонецЭлемента ();
ФайлXML . Закрыть ();
КонецЕсли;
КонецПроцедуры
За чтение объекта отвечают процедуры ЗагрузитьРеквизитыИТабличныеЧасти и ЗагрузитьОбъектРекурсивно . Чтобы прочитать объект вызывается первая, ей передаются объект, который необходимо заполнить, и имя файла. Вторая является вспомогательной.
Процедура ЗагрузитьРеквизитыИТабличныеЧасти ( Объект , ИмяФайлаXML =Неопределено) Экспорт
Если Не ИмяФайлаXML = Неопределено Тогда
ФайлXML = Новый ЧтениеXML ;
ФайлXML . ОткрытьФайл ( ИмяФайлаXML );
Пока ФайлXML . Прочитать () Цикл
Если ФайлXML . ТипУзла = ТипУзлаXML . НачалоЭлемента Тогда
ЗагрузитьОбъектРекурсивно ( ФайлXML , Объект , ФайлXML . Имя );
КонецЕсли
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Процедура ЗагрузитьОбъектРекурсивно ( ФайлXML , Объект , знач ИмяУзла )
ИмяТипа = "" ;
ПространствоИмен = "" ;
Пока ФайлXML . ПрочитатьАтрибут () Цикл
Если ФайлXML . Имя = "ИмяТипа" Тогда
ИмяТипа = ФайлXML . Значение ;
ИначеЕсли ФайлXML . Имя = "URI" Тогда
ПространствоИмен = ФайлXML . Значение ;
КонецЕсли;
КонецЦикла;
Пока ФайлXML . Прочитать () Цикл
Если ФайлXML . ТипУзла = ТипУзлаXML . КонецЭлемента И ФайлXML . Имя = ИмяУзла Тогда
Возврат;
ИначеЕсли ФайлXML . ТипУзла = ТипУзлаXML . Текст Тогда
ТипОбъекта = ИзXMLТипа ( ИмяТипа , ПространствоИмен );
Если НЕ ТипОбъекта = Неопределено тогда
Объект = XMLЗначение ( ТипОбъекта , ФайлXML . Значение );
КонецЕсли;
ИначеЕсли ФайлXML . ТипУзла = ТипУзлаXML . НачалоЭлемента Тогда
ИмяТекУзла = ФайлXML . Имя ;
Если ФайлXML . Имя = "ЭлементКоллекции" Тогда
ЗагрузитьОбъектРекурсивно ( ФайлXML , Объект . Добавить (), ИмяТекУзла );
Иначе
Если ФайлXML . ПрочитатьАтрибут () Тогда
ЗагрузитьОбъектРекурсивно ( ФайлXML , Объект [ ФайлXML . Значение ], ИмяТекУзла );
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
В приложенном файле демонстрационная обработка, позволяющая сохранить ссылочный объект БД в файл и заполнить объект из файла. Заполняемый объект должен быть того же типа, что и сохраненный, а также он должен быть предварительно создан, сохранен в ИБ и выбран в поле "Ссылка".
Выгрузить счет из 1С в формате xml можно при помощи специальной обработки «Выгрузка и загрузка данных XML», которая расположена в 1С: Предприятии версии 8.3 и находится в каталоге EXE/EXTREPS/UNIREPS83/UploadToXML. Так же ее можно скачать здесь .
После скачивания обработки ее необходимо запустить. Для этого воспользуемся командой Открыть
Указываем место, куда была сохранена обработка и нажимаем Открыть
В окне обработки во вкладке Выгрузка указываем:
Данные для выгрузки
Куда будут выгружены данные
Если не выбран период выгрузки, то будут выгружены все данные указанного типа.
На вкладке Дополнительные объекты для выгрузки можно отобрать один или несколько объектов для выгрузки
По кнопке Выгрузить данные происходит выгрузка в файл на сервере или клиентский компьютер (в зависимости от режима работы 1С Предприятие – файловый или клиент-серверный). Перед выгрузкой необходимо установить переключатель в соответствующее положение
Данная обработка позволяет также загрузить данные из файла в другую информационную базу при условии абсолютной идентичности информационных баз (одинаковые версии конфигурации)
Выгрузить счет-фактуру из 1С в формате xml можно при помощи специальной обработки «Выгрузка и загрузка данных XML», которая расположена в 1С: Предприятии версии 8.3 и находится в каталоге EXE/EXTREPS/UNIREPS83/UploadToXML. Так же ее можно скачать здесь .
После скачивания обработки ее необходимо запустить. Для этого воспользуемся командой Открыть
Указываем место, куда была сохранена обработка и нажимаем Открыть
В окне обработки во вкладке Выгрузка указываем:
Данные для выгрузки
Куда будут выгружены данные
Если не выбран период выгрузки, то будут выгружены все данные указанного типа.
На вкладке Дополнительные объекты для выгрузки можно отобрать один или несколько объектов для выгрузки
По кнопке Выгрузить данные происходит выгрузка в файл на сервере или клиентский компьютер (в зависимости от режима работы 1С Предприятие – файловый или клиент-серверный). Перед выгрузкой необходимо установить переключатель в соответствующее положение
Данная обработка позволяет также загрузить данные из файла в другую информационную базу при условии абсолютной идентичности информационных баз (одинаковые версии конфигурации)
Читайте также: