XDTO-пакеты, xml, xml schema
Интеграция - Файловый обмен (TXT, XML, DBF), FTP
Файлы
ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.
Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний
Оформите подписку на компанию для решения рабочих задач
Оформить подписку и скачать решение со скидкойВы можете заказать платную доработку или адаптацию этой разработки под вашу конфигурацию на «Бирже заказов».
- 0% комиссии — оплата напрямую исполнителю;
- Исполнители любого масштаба — от отдельных специалистов до команд под проект;
- Прямой обмен контактами между заказчиком и исполнителем;
- Безопасная сделка — при необходимости;
- Рейтинги, кейсы и прозрачная система откликов.
«Глокая куздра штеко будланула бокра и курдячит бокрёнка»
(первая ассоциация, пришедшая в голову
после прочтения "мана" о XDTO-пакетах)
Приветствую, многоуважаемый all!
После долгого молчания, вызванного тем, что я сейчас больше читаю, чем пишу (чукча читатель, а не писатель), я решил поделиться с вами небольшим обзором, в котором хочу рассказать о том, что я узнал о XDTO-пакетах и обо всем, что с ними связано. Сразу скажу, что в интернете есть документация на эту тему и вообще гугл никто не отменял, но, на мой взгляд, ее как-то маловато. Пусть будет еще. Итак.
С чего начинается?..
С чего начинаются XDTO-пакеты для неискушенного разработчика? Для меня они начались с вопроса: "А что это еще за хренотень в дереве метаданных?" И еще я знал, что это что-то про xml. Но мы начнем не с этого. А с объекта ФабрикаXDTO. Как можно догадаться из названия, это фабрика объектов (XDTO расшифровывается как XML Data Transfer Objects).
Небольшое лирическое отступление. Лучше понять, что такое "фабрика объектов", можно из замечательной книги "Приемы объектно-ориентированного проектирования. Паттерны проектирования" в частности, в разделе о шаблоне "Абстрактная фабрика", или "Фабричный метод". Книга, хочу заметить, действительно стоящая, но мозголомная, скорее формата "справочник", а не "учебник". Вдобавок все, что там написано, сложно применимо к 1С. Когда-нибудь я разозлюсь и напишу здоровенную статью о шаблонах (привет, kote!), а то досадно, что некоторые 1С-программистов даже считать не собираются. Инструмент не должен стоять на пути человека к вершинам профессионализма. Но пока не об этом.
Итак, говоря простым языком, фабрика объектов - это некое "устройство", умеющее принять на входе описание объекта и сгенерировать по этому описанию объект определенного типа, "пригодный к употреблению". Или несколько. То есть это в прямом смысле фабрика: загрузили "чертеж", и она пошла штамповать "продукцию" по "чертежу" (для дотошных: "сырье" в этом случае ваше процессорное время, электричество и т.д.).

Тут я просто вынужден послать вас ознакомиться с хорошей статьёй о простых типах в XDTO с диска ИТС. Если бы это было целесообразно, я бы всю ее скопипастил сюда, но зачем? И все же один пример я оттуда возьму. Для наглядности.
Вот так в статье описывается работа с объектом "Структура":
структурныйТип = ФабрикаXDTO.Тип("http://www.1c.ru/demos/products", "Номенклатура");
номенклатура = ФабрикаXDTO.Создать(структурныйТип);
номенклатура.Наименование = "Ботинки женские";
номенклатура.ЗакупочнаяЦена = 1000;
Для этого примера я бы нарисовал такую диаграмму:

Обратите внимание, что объект "структурныйТип" (т.н. "чертеж") тоже был создан фабрикой, на основании "загадочных" строчек. Рассмотрим, что же это за строчки. Про метод "Тип" объекта "ФабрикаXDTO" синтакс-помощник пишет:
Синтаксис: Тип(< URIПространстваИмен>, < Имя>) Возвращаемое значение: Тип: ТипЗначенияXDTO; ТипОбъектаXDTO; Неопределено. Описание: Получение типа XDTO.
Не слишком информативно. Тем не менее понятно, что на основании какого-то пространства имен и имени типа метод "Тип" создает нам необходимый "чертёж". Про пространства имен можно почитать, например, в статье "Коротко о пространствах имен (XML Namespaces)", или терзайте жужл запросом "xmlns". Вкратце же скажу, что это некая область, в которой вы можете определить свои xml-теги, и они будут означать именно то, что вы в них закладывали при определении. Например, тег < table> в пространстве имен, определяющем HTML-документ, означает описание таблицы, а в вашем собственном он может означать, например, блок описания стола. Чтобы их не путать и нужны пространства имен.
Тут есть очень важный момент, который сначала вводит в заблуждение. Название пространства имен напоминает адрес страницы в интернете, и сразу же хочется посмотреть, что там такое по этому адресу. Так вот. Технически название может быть любым, но разработчики договорились, что все будут использовать в качестве названия пространства имен URL, по которому в интернете находится страница с описанием этого пространства имен, понятным человеку. К тому же так обеспечивается уникальность названий пространств имен, поскольку в интернете не может быть двух страниц с одинаковым адресом. И "ФабрикаXDTO" при генерации типа XDTO, конечно же, не лезет в интернет ни за какими данными. К сожалению, не все соблюдают правило о публикации человеческих описаний (сволочи!), и уж тем более нехорошо использовать адреса на чужих доменах (как в примере). Мало ли какую информацию фирма 1С воткнет со временем на страницу http://www.1c.ru/demos/products. Это может вводить в заблуждение, поэтому в production-коде я настойчиво рекомендую использовать собственные домены и писать описания. Коллеги разработчики, давайте заботиться друг о друге.
Все же XDTO-пакеты
Поскольку мы выяснили, что данные о пространстве имен берутся не из интернета, возникает вполне резонный вопрос: откуда же тогда, черт побери?! И вот тут мы подходим к тому самому разделу "XDTO-пакеты" в дереве метаданных в конфигураторе. Внимательный читатель, наверное, заметил (если еще не забыл после моих лирических отступлений), что в примере мы использовали объект "ФабрикаXDTO", нигде его не создавая. Все верно, в глобальном контексте 1С есть такой объект (я бы сказал "синглтон"), который знает о куче разных пространств имен, уже описанных в конфигураторе и вообще в платформе. То есть для того, чтобы наш пример заработал, нам необходимо создать примерно такой XDTO-пакет:

То есть мы создали тип объекта "Номенклатура", в который добавили два свойства: "Наименование" и "ЗакупочнаяЦена". Обратите внимание, что при создании пакета мы задали ему то пространство имен, которое в дальнейшем будем использовать при создании объекта "структурныйТип". Если вы посмотрите конструктор свойств, то можете увидеть там много интересного. Например, для моего свойства "Наименование" я использовал тип "string (http://www.w3.org/2001/XMLSchema)". Запомните это пространство имен. В нем описаны все базовые типы, которые вы можете использовать в своих объектах, такие как "string", "int" и так далее. После того как мы добавили пакет, объект "ФабрикаXDTO" знает о нашем пространстве имен и описанных в нем типах.
Нужно помнить, что пространства имен, описанные в разделе дерева метаданных "XDTO-пакеты", доступны только на сервере. При попытке обратиться к ним из клиентского кода (так же как и при других ошибках) метод "Тип" вернет "Неопределено". Этот момент несколько раздражает при отладке, мне кажется, что лучше бы оно ругалось чем-нибудь вроде "Тип не найден", но "маємо те, що маємо".
В своих объектах вы можете использовать и собственные типы из вашего пространства имен. Например, давайте добавим единицы измерения:

В качестве типа для свойства "ЕдИзм" я установил тип "ЕдиницаИзмерения (http://www.1c.ru/demos/products1)", просто выбрав его из дерева определенных в конфигурации типов.
А вот код, который создает этот объект:
структурныйТип = ФабрикаXDTO.Тип("http://www.1c.ru/demos/products1", "Номенклатура1");
номенклатура = ФабрикаXDTO.Создать(структурныйТип);
номенклатура.Наименование = "Ботинки женские";
номенклатура.ЗакупочнаяЦена = 1000;
единицаТип = ФабрикаXDTO.Тип("http://www.1c.ru/demos/products1", "ЕдиницаИзмерения");
единица = ФабрикаXDTO.Создать(единицаТип); единица.Наименование = "шт.";
единица.Коэффициент = 1.5;
номенклатура.ЕдИзм = единица;
Надеюсь, принцип понятен. Можете самостоятельно поиграться со свойствами, типами, объектами и прочим. Там есть куда "потыкать пальцем" и чего попробовать. А я тем временем продолжу.
Сериализировали-сериализировали
Что полезного мы уже можем извлечь из того, что знаем? Во-первых, объекты XDTO прекрасно сериализуются (XML же, как вы помните).
Дополним код вот таким фрагментом:
ИмяФайла = "D:\Temp\struct.xml";
МойXML = Новый ЗаписьXML;
ПараметрыЗаписиXML = Новый ПараметрыЗаписиXML("UTF-8", "1.0", Ложь);
МойXML.ОткрытьФайл(ИмяФайла, ПараметрыЗаписиXML);
МойXML.ЗаписатьОбъявлениеXML();
ФабрикаXDTO.ЗаписатьXML(МойXML, номенклатура);
МойXML.Закрыть();
На выходе мы получим вот такой файл:
< Номенклатура1 xmlns="http://www.1c.ru/demos/products1"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
< Наименование>Ботинки женские< Наименование>
< ЗакупочнаяЦена>1000< ЗакупочнаяЦена>
< ЕдИзм>
< Наименование>шт.< Наименование>
< Коэффициент>1.5< Коэффициент>
< ЕдИзм>
< Номенклатура1>
Теперь вы можете послать его друзьям по электронной почте, если, конечно, их интересуют женские ботинки. =)
Но поскольку объекты сериализуются, то они так же замечательно и десериализуются.
Давайте попробуем:
структурныйТип = ФабрикаXDTO.Тип("http://www.1c.ru/demos/products1", "Номенклатура1");
ИмяФайла = "D:\Temp\struct.xml";
МойXML = Новый ЧтениеXML;
МойXML.ОткрытьФайл(ИмяФайла);
номенклатура = ФабрикаXDTO.ПрочитатьXML(МойXML, структурныйТип);
МойXML.Закрыть();
Сообщить(номенклатура.ЕдИзм.Наименование);
Вы когда-нибудь разбирали xml-файлы построчно, вылавливая значки "больше"-"меньше" бесконечными "Найти" и "Сред/Лев/Прав"? А пользовались ли вы замечательным объектом "ЧтениеXML" для разбора файла по тегам, которые потом приходилось разгребать вручную в какую-нибудь структуру? Теперь, если у вас правильно описаны XDTO-пакеты и типы в них, вы можете загружать xml сразу в объект и дальше работать с ним как с объектом. На мой взгляд, это замечательно и удобно.
К тому же при загрузке xml-файла происходит его валидация на соответствие типу, и в случае ошибки метод вызывает исключение. Поэтому, конечно же, правильный код по загрузке xml будет такой:
Попытка номенклатура = ФабрикаXDTO.ПрочитатьXML(МойXML, структурныйТип);
Исключение Сообщить(ОписаниеОшибки()); // еще какая-нибудь обработка исключения
Возврат;
КонецПопытки;
Что еще полезного можно получить из XDTO-пакетов? А вот что! Также мы можем очень просто выгружать объекты метаданных. В конфигурации есть пространство имен, в котором есть все типы XDTO присутствующих в конфигурации метаданных.
Добавим справочник "Клиенты", создадим в нем один элемент и напишем такой код:
// Получим объект СпрКлиенты = Справочники.Клиенты;
Выборка = СпрКлиенты.Выбрать();
Пока Выборка.Следующий() Цикл
КлиентОбъект = Выборка.ПолучитьОбъект();
Прервать;
КонецЦикла;
// Создадим ОбъектXDTO
клиентыТип = ФабрикаXDTO.Тип("http://v8.1c.ru/8.1/data/enterprise/current-config", "CatalogObject.Клиенты");
клиент = ФабрикаXDTO.Создать(клиентыТип);
// Заполним ОбъектXDTO и сохраним его
ЗаполнитьЗначенияСвойств(клиент,КлиентОбъект);
ИмяФайла = "D:\Temp\сlient.xml";
МойXML = Новый ЗаписьXML;
ПараметрыЗаписиXML = Новый ПараметрыЗаписиXML("UTF-8", "1.0", Ложь);
МойXML.ОткрытьФайл(ИмяФайла, ПараметрыЗаписиXML);
МойXML.ЗаписатьОбъявлениеXML();
ФабрикаXDTO.ЗаписатьXML(МойXML, клиент);
МойXML.Закрыть();
В первой части кода, там, где мы получаем объект, ничего интересного не происходит, мы просто получаем объект (весьма коряво, надо отметить, но для примера пойдёт).
Зато обратите внимание на пространство имен и имя объекта в строчке, где создается объект "клиентыТип". В пространстве имен "http://v8.1c.ru/8.1/data/enterprise/current-config" должны быть описаны все объекты метаданных конфигурации, в чем вы можете убедиться, если посмотрите его в конструкторе XDTO-пакетов. Дальше уже знакомая процедура - сохранение объекта в XML.
Вот что получилось у меня:
< ?xml version="1.0" encoding="UTF-8" ?>
< CatalogObject.Клиенты
xmlns="http://v8.1c.ru/8.1/data/enterprise/current-config"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
< Ref>b0fc4df2-0a54-11e1-8797-ac728931524e< /Ref>
< DeletionMark>false< /DeletionMark>
< Code>000000001< /Code>
< Description>Тестовый клиент 1< /Description>
< ТипКлиента>непоняно< /ТипКлиента>
< /CatalogObject.Клиенты>
Как видите, тут есть все реквизиты, включая стандартные ("Наименование", "Код"), а также ссылка ("Ref") и пометка на удаление ("DeletionMark").
Естественно, этот файл также можно загрузить обратно в объект. Код, надеюсь, вы уже можете написать сами.
В помощь юному падавану-сериализатору в 1С есть объект "СериализаторXDTO". Он также представлен как "синглтон", доступный в глобальном контексте, и как отдельный тип. В принципе, строки:
// Создадим ОбъектXDTO
клиентыТип = ФабрикаXDTO.Тип("http://v8.1c.ru/8.1/data/enterprise/current-config", "CatalogObject.Клиенты");
клиент = ФабрикаXDTO.Создать(клиентыТип);
// Заполним ОбъектXDTO
ЗаполнитьЗначенияСвойств(клиент,КлиентОбъект);
можно смело заменить на:
// Создадим ОбъектXDTO и заполним его
клиент = СериализаторXDTO.ЗаписатьXDTO(КлиентОбъект);
Код получился короче и работает более корректно. Например, если в справочнике "Клиенты" определены табличные части, то "ЗаполнитьЗначенияСвойств" с их заполнением не справится. А сериализатор - запросто. Теперь, когда (я надеюсь) вы понимаете основные принципы работы XDTO-пакетов, вы запросто разберетесь с тем, что еще можно делать с сериализатором. Да пребудет с вами сила синтакс-помощника. А я продолжу.
XDTO-пакет? Не нужен!
К этому моменту вы, наверное, задаете себе (а заодно и мне) вопрос: "Хорошо, ну вот у меня есть описанный в конфигурации тип в XDTO-пакете, есть xml, и все вроде бы хорошо. А что делать, если мне пришел какой-то новый xml, в другом формате, а я хочу работать с ним как с объектом? Опять конфигуратор открывать и описывать там тип?"
Конечно, без описания типа вам не обойтись. Но конфигуратор для этого не нужен. И тут нужно рассмотреть такую замечательную вещь, как xml schemа. XML-cхема - это как раз и есть описание типа, представленное (внимание!) в формате xml.
Давайте сделаем какой-нибудь небольшой XDTO-пакет, что-нибудь вроде этого:

А теперь нажмите на кнопку "Экспорт XML-схемы..." (выглядит как ящик с листиком бумаги и стрелочкой) и сохраните схему в файл address.xsd
У меня получилось вот что:
< xs:schema xmlns:tns="http://www.1c.ru/demos/products2"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.1c.ru/demos/products2"
attributeFormDefault="unqualified" elementFormDefault="qualified">
< xs:complexType name="КлассификаторАдреса">
< xs:sequence>
< xs:element name="Город" type="xs:string"/>
< xs:element name="Улица" type="xs:string"/>
< xs:element name="НомерДома" type="xs:int"/>
< xs:element name="НомерКвартиры" type="xs:int"/>
< /xs:sequence>
< /xs:complexType>
< /xs:schema>
Теперь удалите этот пакет из конфигурации, будто его и не было. Попробуем прочитать схему и создать по ней объект.
Вот код, который это делает:
ФайлыXSD = Новый Массив();
ФайлыXSD.Добавить("D:\Temp\adderss.xsd");
МояФабрикаXDTO = СоздатьФабрикуXDTO(ФайлыXSD);
адресТип = МояФабрикаXDTO.Тип("http://www.1c.ru/demos/products2", "КлассификаторАдреса");
адрес = МояФабрикаXDTO.Создать(адресТип);
адрес.Город = "Ленинград";
адрес.Улица = "3-я улица Строителей";
адрес.НомерДома = 25;
адрес.НомерКвартиры = 12;
ИмяФайла = "D:\Temp\address.xml";
МойXML = Новый ЗаписьXML;
ПараметрыЗаписиXML = Новый ПараметрыЗаписиXML("UTF-8", "1.0", Ложь);
МойXML.ОткрытьФайл(ИмяФайла, ПараметрыЗаписиXML);
МойXML.ЗаписатьОбъявлениеXML();
МояФабрикаXDTO.ЗаписатьXML(МойXML, адрес);
МойXML.Закрыть();
Здесь мы для разнообразия не стали использовать глобальный объект "ФабрикаXDTO", а создали собственный функцией "СоздатьФабрикуXDTO". Если вы посмотрите в отладчике на нашу фабрику ("МояФабрикаXDTO"), то увидите, что в коллекции пакетов у нее всего два пакета: "http://www.w3.org/2001/XMLSchema" и "http://www.1c.ru/demos/products2", в отличие от "синглтона" "ФабрикаXDTO", где их существенно больше. В качестве бонуса мы получили то, что этот код может быть полностью исполнен на клиенте, так как не зависит от метаданных конфигурации.
На выходе я получил xml-файл, в который был сериализован мой объект:
< ?xml version="1.0" encoding="UTF-8" ?>
< КлассификаторАдреса
xmlns="http://www.1c.ru/demos/products2"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
< Город>Ленинград< /Город>
< Улица>3-я улица Строителей< /Улица>
< НомерДома>25< /НомерДома>
< НомерКвартиры>12< /НомерКвартиры>
< /КлассификаторАдреса>
Как вы видите, я поработал с объектом и сериализовал его без участия метаданных конфигурации. Таким образом, передавая вместе с xml-файлом также и XML-схему, вы можете быть уверенным, что тот, кто должен его получить, сможет разобраться, что с ним делать, а главное, как.
Пример десериализации приводить не буду, оставляю вам как самостоятельное упражнение.
Напоследок скажу, что можно выгрузить XML-схему всей вашей конфигурации, кликнув правой кнопкой по узлу "XDTO-пакеты". Результат получается поучительный, посмотрите.
Еще: если у вас есть xml-файл, с ним хочется поработать как с объектом, а XML-схему прислать никто не удосужился, вы можете воспользоваться замечательным инструментом xsd.exe из .NET Framework. (У себя я нашел его в папке "C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\".) Пользоваться им очень просто: даете ему на вход xml, на выходе получаете xsd. Вообще-то этот xsd не всегда (или вообще никогда?) является файлом сразу же "готовым к употреблению" в 1С, но все равно это существенная помощь в создании XML-схемы.
Как видите, все оказалось достаточно просто.
На этом всё
Несмотря на то что статья оказалась неожиданно длинной, нельзя сказать, что все, что здесь описано, претендует на полноту. Пытливый исследователь XML-мира с легкостью напишет целую книгу по каждому абзацу этого небольшого обзора и еще ворох по тому, о чем здесь не сказано. Например, о том, что "вся эта кухня" тесно связана с web-сервисами. Тема обширна, так что дерзайте. Также я могу в чем-то заблуждаться, поэтому пишите комментарии - буду исправлять. Давайте учиться вместе.
А я желаю вам хорошего дня и хорошего кода. До новых встреч.
Прилагаю к статье dt-шник с примерами.
UPD.: Добавлено небольшое дополнение "XDTO-пакеты. Неименованные типы".
UPD.2: На инфостарте появились еще две прекрасные статьи об XDTO, так что если что-то не понятно из моей, обязательно посмотрите их: XDTO - это просто и XDTO - это просто, часть 2
Вступайте в нашу телеграмм-группу Инфостарт
См. также
Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Разработчик 1С:Предприятие 8 1С:Комплексная автоматизация 1.х 1С:Управление производственным предприятием 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Платные (руб)
Перенос данных из 1С:Управление производственным предприятием 1.3 в 1С:Бухгалтерия предприятия 3.0 с помощью правил обмена | Можно выполнить переход с УПП на БП 3 или запускать выгрузку данных за выбранный период времени | Переносятся документы, начальные остатки и вся справочная информация | Есть фильтр по организации и множество других параметров выгрузки | Поддерживается несколько сценариев работы: как первичный полный перенос, так и перенос только новых документов | Перенос данных возможен в "1С: Бухгалтерия 3.0" версии ПРОФ, КОРП или базовую | Переход с "1С: УПП1.3" / "1С:КА 1.1" на "1С:БП3.0" с помощью правил конвертации будет максимально комфортным! | Можно бесплатно проверить перенос на вашем сервере!
50050 руб.
25.02.2015 192615 384 296
SALE! 10%
Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Разработчик 1С:Предприятие 8 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Россия Платные (руб)
Правила в универсальном формате обмена для ERP 2.5, ERP 2.6, КА 2.5, КА 2.6, УТ 11.5, УТ 11.6, БП 3.0, Розница, УНФ, для последних версий конфигураций. Ссылки на другие конфигурации в описании публикации. Правила совместимы со всеми другими версиями конфигураций новыми и старыми, поддерживающими обмен и синхронизацию в формате EnterpriseData. Не требуется синхронного обновления правил после обновления другой конфигурации, участвующей в обмене. Типовой обмен через планы обмена кнопкой Синхронизация вручную или автоматически по расписанию, или вручную обработкой.
27633 руб.
12.06.2017 165167 1009 329
Перенос данных 1C Взаиморасчеты Оптовая торговля Логистика, склад и ТМЦ Файловый обмен (TXT, XML, DBF), FTP Системный администратор Разработчик 1С:Предприятие 8 1С:Управление торговлей 10 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Управленческий учет Платные (руб)
Можно проверить до покупки, оставьте заявку! Воспользовались более 268 компаний! Перенос данных из УТ 10.3 в УТ 11 | из УТ 10.3 в КА 2 | из УТ 10.3 в ERP. Решение для перехода с УТ 10.3. Можно перенести начальные остатки, нормативно-справочную информацию и все возможные документы. При выгрузке можно установить отбор по периоду, организациям и складам.
50200 руб.
24.04.2015 211499 186 254
SALE! 10%
Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Разработчик 1С:Предприятие 8 1С:Управление производственным предприятием 1С:ERP Управление предприятием 2 Бухгалтерский учет Управленческий учет Платные (руб)
Переносите справочную информацию, остатки и документы из УПП 1.3 в ERP 2.6 и КА 2.6 с помощью готовых правил. Переносится более 60 видов документов. Простой интерфейс и понятные настройки.
42000
37800 руб.
24.06.2020 73252 108 35
SALE! 10%
Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Разработчик 1С:Предприятие 8 1С:Управление производственным предприятием 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Управленческий учет Платные (руб)
Переносите справочную информацию, остатки и документы из УПП 1.3 в Бухгалтерию 3.0 с помощью готовых правил. Переносится более 50 видов документов. Простой интерфейс и понятные настройки.
42000
37800 руб.
15.12.2021 37179 269 68
Операции по ВЭД Файловый обмен (TXT, XML, DBF), FTP Разработчик Бухгалтер 1С:Предприятие 8 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 Россия Бухгалтерский учет Платные (руб)
Федеральная таможенная служба России давно поддерживает унифицированный формат электронных документов для обмена с информационными системами предприятий. xmlns="urn:customs.ru:Information:ExchangeDocuments:". Структура, утвержденная комиссией Таможенного союза. Осталось только сделать загрузку в 1С из этого формата. На выходе - два документа ГТД по импорту и Поступление (акты, накладные) Обработка актуализирована на начало 2026 года (ставка НДС 22%)
24400 руб.
09.08.2016 97906 381 379
Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Разработчик 1С:Предприятие 8 1С:Комплексная автоматизация 1.х 1С:Управление торговлей 10 1С:Управление производственным предприятием Россия Платные (руб)
Регулярный обмен, выгрузка, перенос из КА 1.1, УПП 1.3, УТ 10.3 для обмена с любыми конфигурациями, поддерживающими обмен в формате EnterpriseData (КД3) - БП 3.0, ERP, КА 2, УТ 11, Розница 3, УНФ 3 и другими. Правила для старых и доработанных конфигураций не требуют синхронного обновления и совместимы с новыми и будущими конфигурациями. Обмен по расписанию, через папку, FTP, почту.
27572 руб.
18.02.2016 209366 686 559
Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Разработчик 1С:Предприятие 8 1С:Комплексная автоматизация 1.х 1С:Управление производственным предприятием 1С:Зарплата и Управление Персоналом 3.x Россия Бухгалтерский учет Платные (руб)
Правила переноса кадровых и расчетных данных и справочной информации из "1С:УПП1.3" или "1С:КА 1.1" в "1С:ЗУП 3.1 | Разработан в формате КД 2 (правила конвертации данных) | При выгрузке есть фильтр по организациям | Обновляется при выходе новых релизов 1С | Развитие алгоритмов | Расчетные документы переносятся в документ "Перенос данных" | Создаются документы "Начальная штатная расстановка" и "Начальная задолженность по зарплате", переносятся кадровые документы
58000 руб.
29.10.2018 64510 86 137
(4) К сожалению, вот так сразу я не отвечу на этот вопрос. Самый очевидный ответ - разбирать на части, но может быть там есть какие-то хитрости или готовые объекты/шаблоны к разбору? Не знаю. У меня в планах есть (тс-с, никому ни слова!) написать продолжение к этой статье, с углублением в подробности, может быть ответ сам "всплывет" там? Вообщем, следите за обновлениями.
(7) Всему свое время. Может быть и до них дойдет. А, с другой стороны, почему бы вам самому не сделать этого? А мы с удовольствием почитаем. =)
p.s.
Новичкам начинать разбираться с шаблонами проектирования рекомендую не с "Приемы объектно-ориентированного проектирования. Паттерны проектирования", а с отличной .
А не используют их в большей степени из-за того, что многим проще
Благодаря автору статьи, очень надеюсь, таких будет еще немного меньше.
Не понимаю почему сама 1С не использует эту технологию для обмена. Сериализация больших объектов (например документы с десятками тысяч строк) происходит практически мгновенно, десериализация тоже очень быстрая.
Так когда же стоит браться за XDTO, а когда не стоит?
Что же касается самого вопроса - "Так когда же стоит браться за XDTO, а когда не стоит?"
Я бы сказал так. Если вы имеете дело с xml или с необходимостью передавать объекты как текст (сериализовывать их) то следует попробовать или хотя бы вдумчиво оценить возможность использовать XDTO. Это может существенно облегчить работу с вашими данными и объектами.
Но не стоит выключать голову, так как, возможно, именно ваша задача не имеет простого решения на XDTO-XML из-за ограниченности функционала XDTO или, собственно принципов XML. Все нужно критически оценивать.
Увы, вопрос "хорош ли XML вообще и в каких случаях" существенно шире рамок этой статьи. Лично я считаю, что в некоторых случаях применение xml исключительно вредно (например в сериализации простых табличных данных или массивов), но есть и другие мнения. И целые холивары.
И тем более холивары про блеск и нищету XML заводить ;-] ( их уже было...)
Однако! Не согласен я с мыслью "какой именно механизм применять для ... - не важно". По-моему, так важно: один механизм легче, другой гибче, а третий я хорошо знаю и вообще к нему привык. И опять приходится включать голову - и выбирать.
Большое спасибо за описание этого механизма; видно, придётся действительно пробовать его использовать; тогда только и станет ясен вкус и цвет граблей...
Что касается справки, думаю там пропущено слово "возможно": "Для типа записываемого значения должно быть возможно преобразование в XDTO".
Для объектов конфигурации во встроенной фабрике "ФабрикаXDTO" оно всегда возможно, потому как в конфигурации всегда есть схема описания объектов метаданных в XDTO.
Использовать очень просто - создается объект "Msxml2.DOMDocument.4.0", создается объект "Msxml2.XMLSchemaCache.4.0", загружается схема, связывается с объектом, загружается xml в объект и делается валидация. Вот тут очень хороший пример:
var xmlDoc = new ActiveXObject("Msxml2.DOMDocument.4.0");
var xsdCache = new ActiveXObject("Msxml2.XMLSchemaCache.4.0");
xsdCache.add("", "example.xsd");
xmlDoc.async = false;
xmlDoc.schemas = xsdCache;
xmlDoc.load("example.xml");
var err = xmlDoc.validate();
if (err.errorCode == 0){
WScript.Echo("Document is valid");
}else{
WScript.Echo("Validation error:" + err.reason);
} ПоказатьЧто же касается 1С-объектов, вроде ФабрикаXDTO, вот так с первого взгляда я отдельно метода "validate" не нашел. Можно попробовать загрузить xml в заранее подготовленную ФабрикуXDTO (с загруженной в нее схемой) при помощи "ФабрикаXDTO.ПрочитатьXML". При загрузке оно его валидирует и выдаст исключение, если что не так (об этом есть в статье).
Если можно еще проще, поделитесь, с удовольствием пополню свою коллекцию методов.
Вот и меня интересует подробный, да и ряд других вопросов.
ФайлыXSD = Новый Массив();
ФайлыXSD.Добавить("D:\Temp\adderss.xsd");
МояФабрикаXDTO = СоздатьФабрикуXDTO(ФайлыXSD);
Создание на основании схемы из файла. Откуда взять схему или пакет, если есть только xml, вопрос риторический. Попробовать создать самому вручную или с помощью xsd.exe, опять-таки. Или стребовать оттуда, где вы взяли xml.
---------------------------------------------------------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<ED_Container xmlns="urn:customs.ru:Information:ExchangeDocuments:ED_Container:5.0.3" xmlns:CategoryCust="urn:customs.ru:Categories:3.0.0" xmlns:cat_ru="urn:customs.ru:CommonAggregateTypes:5.0.3" xmlns:clt_ru="urn:customs.ru:CommonLeafTypes:5.0.3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" DocumentModeID="1006058E">
---------------------------------------------------------------------------------
Сразу хочу сказать, что это сделано из сторонней программы, то есть не из 1С. У меня такое ощущение, что каким, то образом умудрились засунуть несколько пространственных имён или я что-то не понимаю?
Если я создам пакет с NS "http://www.1c.ru/demos/products2" в котором опишу тип "ЕдиницаИзмерения", а из пакета "http://www.1c.ru/demos/products1" его удалю, то смогу получить тип "ЕдиницаИзмерения" из другого NS, если использую директиву импорта.
На выходе у меня получится вот такой XML:
<?xml version="1.0" encoding="UTF-8" ?>
<Номенклатура1 xmlns="http://www.1c.ru/demos/products1" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Наименование>Ботинки женские</Наименование>
<ЗакупочнаяЦена>1000</ЗакупочнаяЦена>
<ЕдИзм xmlns:d2p1="http://www.1c.ru/demos/products2">
<d2p1:Наименование>шт.</d2p1:Наименование>
<d2p1:Коэффициент>1.5</d2p1:Коэффициент>
</ЕдИзм>
</Номенклатура1> ПоказатьПри вот такой XML-схеме:
<xs:schema xmlns:ns1="http://www.1c.ru/demos/products2" xmlns:tns="http://www.1c.ru/demos/products1" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.1c.ru/demos/products1" attributeFormDefault="unqualified" elementFormDefault="qualified">
<xs:import namespace="http://www.1c.ru/demos/products2"/>
<xs:complexType name="Номенклатура1">
<xs:sequence>
<xs:element name="Наименование" type="xs:string"/>
<xs:element name="ЗакупочнаяЦена" type="xs:int"/>
<xs:element name="ЕдИзм" type="ns1:ЕдиницаИзмерения"/>
</xs:sequence>
</xs:complexType>
</xs:schema> ПоказатьНу, и в начале описания схемы видно, что подключаются несколько пространств имен: tns как основное, xs с базовыми типами и ns1 с нашим типом "ЕдиницаИзмерения".
Во общем, думаю, что стоит поискать в этом направлении. Но сразу скажу - другие программы могут гораздо свободнее обращаться с XML и 1С не всегда позволяет такую же гибкость.
Я не призываю к извращениям, но у меня были случаи, когда работа с XML начиналась с кое-какой "резни" XML как обычного текста, и только после этого он скармливался ФабрикеXDTO и так дальше. То же верно и в обратную сторону. XML формировался фабрикой, а потом дополнялся обычным "СтрЗаменить". Но тут нужно быть осторожным, а-то это все закончится тем, что опять будем весь XML руками педалить - вернулись к тому, от чего уходили.
Может быть, в сложном случае вам будет лучше воспользоваться сторонними объектами для работы с XML. Например, чем-нибудь из .NET. Принципы там те же, а возможностей больше. Собственно, я уже кое-что .
Т.е. все "подтипы", как вы их назвали (и что не верно) это те свойства, к которым вы можете обращаться у объекта типа item "через точку". Например, так:
типItem = ФабрикаXDTO.Тип("http://appius.ru/pdm", "item");
объектТипаItem = ФабрикаXDTO.Создать(типItem);
объектТипаItem.Items = <что-то>;
объектТипаItem.parameters = <что-то>;
и т.д.Почитайте про ООП что-нибудь, будет понятнее.
НоваяЗаписьXML.ОткрытьФайл(ДиалогСохраненияФайла.ПолноеИмяФайла);
НоваяЗаписьXML.ЗаписатьОбъявлениеXML();
НоваяЗаписьXML.ЗаписатьНачалоЭлемента("ФайлОбмена");
URI = "http://www.sample-package.org";
ТипОбъектаXDTOСоздаваемого = ФабрикаXDTO.Тип(URI, "DocumentObject.ПриходнаяНакладная");
НовыйОбъектXDTO = ФабрикаXDTO.Создать(ТипОбъектаXDTOСоздаваемого);
СсылкаДок = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(URI, "DocumentRef.ПриходнаяНакладная"), Док.УникальныйИдентификатор());
НовыйОбъектXDTO.ref = СсылкаДок;
НовыйОбъектXDTO.Date = Док.Дата;
НовыйОбъектXDTO.number = Док.Номер;
Контрагент = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(URI, "CatalogObject.Контрагенты"));
Контрагент.Ref = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(URI, "CatalogRef.Контрагенты"),Док.Контрагент.УникальныйИдентификатор());
Контрагент.Code = Док.Контрагент.Код;
Контрагент.Description = Док.Контрагент.Наименование;
ФабрикаXDTO.ЗаписатьXML(НоваяЗаписьXML, Контрагент,,,,НазначениеТипаXML.Явное);
НовыйОбъектXDTO.Контрагент = Контрагент.Ref;
ФабрикаXDTO.ЗаписатьXML(НоваяЗаписьXML, НовыйОбъектXDTO,,,,НазначениеТипаXML.Явное);
НоваяЗаписьXML.ЗаписатьКонецЭлемента();
НоваяЗаписьXML.Закрыть();
КлиентыТип = ФабрикаXDTO.Тип("", "CatalogObject.Клиенты");
Клиент = ФабрикаXDTO.Создать(КлиентыТип);
// Заполним ОбъектXDTO
ЗаполнитьЗначенияСвойств(Клиент, КлиентОбъект);
переменная Клиент не содержит строк табличной части, так, после записи (ФабрикаXDTO.ЗаписатьXML(МойXML, клиент)), содержимое файла client.xml:
<?xml version="1.0" encoding="UTF-8"?><CatalogObject.Клиенты xmlns="" xmlns:xs="" xmlns:xsi=""><Ref>b0fc4df2-0a54-11e1-8797-ac728931524e</Ref><DeletionMark>false</DeletionMark>| Код |
|---|
000000001Показать полностью |
В объекте КлиентОбъект (из приложенной демо базы) есть не пустая табличная часть.
Если вызывать СериализаторXDTO.ЗаписатьXDTO(КлиентОбъект), то табличные части появляются и в объекте XDTO и в файле.
В действительности лучше использовать СериализаторXDTO. Об этом есть в статье.
Если вам по какой-либо причине необходимо использовать именно ЗаполнитьЗначенияСвойств, табличные части придется заполнять вручную. Цикл, и все такое.
Меня лично напрягает то что как только внесеш изменения в одну из конфигураций - надо выгружать XSD схему и загружать ее в базу приемник чтобы при чтении не возникла ошибка чтения. Было бы удобнее если бы ошибку при десериализации можно было проигнорировать.
● обмен данными между конфигурациями системы «1С:Предприятие» с разными схемами данных;
● обмен данными на основе схем XML, не привязанных к той или иной конфигурации (например, обмен с информационными системами, построенными не на основе системы «1С:Предприятие»);
● организация работы с Web-сервисами. Механизм XDTO позволяет описывать типы параметров и возвращаемых значений Web-сервисов, а также манипулировать передаваемыми и возвращаемыми данными.
Механизм XDTO обладает следующими ключевыми свойствами:
● обеспечивает работу с XML,
● привычная модель работы с данными.
В настоящее время обмен данными с различными программными платформами и системами реализуется с использованием XML: XML-документы служат для представления данных, а схема XML используется для описания форматов и структур данных. Механизм XDTO позволяет создавать требуемые для обмена схемы XML и формировать XML-документы, удовлетворяющие этим схемам.
В то же время использование механизма XDTO позволяет выполнять эти действия в привычной для большинства разработчиков системы «1С:Предприятие» манере.
Разработчик имеет дело с типами и объектами данных, объекты данных содержат свойства, свойствам присваиваются значения и т. д. При манипулировании данными с помощью XDTO разработчик максимально изолирован от подробностей, связанных с тем, как эти данные представлены в XML. Конечно, совсем избавиться от этих подробностей невозможно, но важно, что они проявляются только там, где это действительно нужно.
Я эту тему просек еще в далеком 2006 когда впервые увидел этот объект метаданных. И с тех пор для меня любая интеграция 1с с каким либо сайтом делается в два счета через web-сервис.
А "невьезжание" многих в этот объект обусловлено тем, что 1С никакой документации по этому вопросу не публиковало.
А 1С документацию не публиковало, ссылаясь на то что это разработка не их (пакеты XDTO) и поэтому они не будут документировать. И что вся документация по этому вопросу уже написана.
И они абсолютно правы. Вот только "не свою" разработку не надо было называть "своим" названием XDTO.
Этот метод уже дааааааавным-давно применяется в web-мире. И называется SOAP - протокол. И пакеты соответственно
SOAP - пакетами.
Вот и смотрите документацию на эту тему.
P.S. СОВЕТ Если Вам придется интегрировать 1С с каким либо сайтом, а сайт будут разрабатывать сторонние программисты, то никогда(!) не говорите им "обмен с вашим сайтом будем производить XDTO пакетами". После такой фразы web-программист морщит лоб и пытается понять что это за зверь такой.
Изъясняйтесь проще. Скажите что обмен будет по SOAP протоколу, SOAP-пакетами через web-сервис. Вот тогда любой web-программер поймет Вас с полуслова.
P.P.S ЕЩЕ БОЛЕЕ ВАЖНЫЙ СОВЕТ В наш век интернет технологий помимо 1С нужно еще хоть чуточку интересоваться сетевыми и web-технологиями. Иначе вы так и останетесь "локальным один-эснигом", который только и может что проводки подкорректировать, да какую нибудь хитрую обработку сварганить. А сейчас намного выше ценяться специалисты которые один программный продукт могут связать с другим в онлайновом режиме.
На здоровье. хорошего совета никогда не жалко.
Но вот то, что нашел время и доступно это все описал - за это громадный респект!!!
У самого знаний куча, да вот как то не удосужился хоть одну статейку написать.
Потому как ленивый очень :) Наверно потому и пошел в программисты, что бы за меня все компьютер считал :))
P.S. Кстати в "пятом пыхе" (PHP5) есть замечательный модуль парселки этих самых пакетов (soap/xdto).
И этот модуль великолепно производить серилизацию/десерилизацию.
Помню долго, очень долго смеялись с другом (Делали проект электронной очереди с регистрацией из интернета.)
Я ваял со стороны 1С, а друг со стороны Web на "пятом-пыхе". Тогда мы первый раз решили попробовать эти пресловутые пакеты. И когда делали испытательные коннекты, друг звонил мне по телефону и страшным голосом говорил -"Оффигеть тут мне какой то странный тип данных передается!!" на мой вопрос "какой?" он ответил -"Тип данных Справочник.Клиенты !!!" Откуда ему бедняге было знать что помимо типов integer, varchar, decimal и т.д. еще бывают и такие типы "Справочник.Номенклатура", "Документ.ЧекККМ" и т.п. :)
(89) anu, Все верно, это от того, что вы создаете новый элемент и он получает в базе новый UID. Вы попробуйте СериализаторXDTO использовать. Потому что ЗаполнитьЗначенияСвойств это совсем ручная работа, для демонстрации самого механизма. Не думаю, что кто-то пользуется этим на практике, когда есть сериализатор.
Если же хочется сделать все руками придется из xml получить UID и принудительно установить его новому элементу через УстановитьСсылкуНового, потому что ЗаполнитьЗначенияСвойств этого не делает (как и, например, не заполняет табличные части).
ТекстДок = Новый ТекстовыйДокумент;
ТекстДок.Прочитать(ПутьДляTXT);
ЧтениеXML = Новый ЧтениеXML();
ЧтениеXML.УстановитьСтроку(ТекстДок.ПолучитьТекст());
Если ВозможностьЧтенияXML(ЧтениеXML) Тогда
Об = ПрочитатьXML(ЧтениеXML);
Об.Записать();
КонецЕсли;
И потом я сравнила UID шестнадцатеричный, что был в файле и что получилось при записи объекта в справочник, они получились ОДИНАКОВЫМИ!
И вот попробовала Ваш второй пример выполнить, про клиента, когда мы заполняем из справочника объект XDTO. Я решила попробовать обратную запись из файла xml в базу 1С...когда выполняю кусок кода:
КлиентыТип = ФабрикаXDTO.Тип("http://v8.1c.ru/8.1/data/enterprise/current-config","CatalogObject.Клиенты");
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл(Путь);
Клиент = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML, КлиентыТип);
ЧтениеXML.Закрыть();
Об = Справочники.Клиенты.СоздатьЭлемент();
ЗаполнитьЗначенияСвойств(Об, Клиент);
Об.Записать();
UIDы в справочнике и файле разные...я так понимаю, из-за того, что вызываю метод СоздатьЭлемент, он сразу присваивает новый UID, а как по-другому написать, чтобы были одинаковые?
Пакет размером 10 Гб. Пытался использовать XML DOM и получал краш с нехваткой памяти.
Чтение через xdto не осилил - не понял как описать схему.
Ну а если не умеешь головой, то работай руками - парсил через чтениеxml и копировал данные в записьxml.
Хотелось бы всё же узнать как у XDTO с последовательным чтением огромных узлов? типа таких:
<data>
... - тут ~10 млн объектов
</data>
<?xml version="1.0" encoding="UTF-8"?>
-<CatalogObject.Номенклатура xmlns:xsi="" xmlns:xs="" xmlns="">
<IsFolder>false</IsFolder>
<Ref>ee539b18-9cca-4b7e-8008-99c5ee4eee04</Ref>
<DeletionMark>false</DeletionMark>
<Parent>e31bfb70-aab4-11e2-b620-0022b0530332</Parent>
| Код |
|---|
00000005999Показать полностью |
Можно ли развернуто выгрузить реквизиты ссылочного типа ?, например :
<>БазоваяЕдиницаИзмерения</>
<Ид>46127fbf-16f4-11e4-93b9-08863bd4c2c6</Ид>
<Наименование>Шт.</Наименование>
<ТипЗначений>Справочник</ТипЗначений>
<>БазоваяЕдиницаИзмерения</>
Я бы написал, но в первой версии обмена через XDTO код не особо изящный получился - заплюют :-)
А переписывать смысла особо нет...
Это не опечатка, все верно.
Командой ФайлыXSD.Добавить("D:\Temp\adderss.xsd"); в массив добавляется путь к СХЕМЕ, а
это - ИмяФайла = "D:\Temp\address.xml"; просто имя СОХРАНЯЕМОГО xml-файла.
Отличная статья !
По Вашему примеру написал выгрузку данных в XML
Получатель просит к нему отдельно XSD файл.
Можете подсказать, как выгрузить XSD схему в другой файл ?
Вот мой код:
ХМЛ_данные=Новый ЗаписьXML;
ХМЛ_данные.ОткрытьФайл("C:\TEMP\Organiz.xml");
ХМЛ_данные.ЗаписатьНачалоЭлемента("Root_1С");
ВыборкаСпр=Справочники.Организации.Выбрать();
Пока ВыборкаСпр.Следующий() Цикл
Если ВыборкаСпр.ЭтоГруппа Тогда Продолжить; КонецЕсли;
ТекОбъект = ВыборкаСпр.ПолучитьОбъект();
ФабТек = СериализаторXDTO.ЗаписатьXDTO(ТекОбъект);
ФабрикаXDTO.ЗаписатьXML(ХМЛ_данные, ФабТек,,,,НазначениеТипаXML.Явное);
КонецЦикла;
ХМЛ_данные.ЗаписатьКонецЭлемента(); // Root_1С
ХМЛ_данные.Закрыть();
ПоказатьК сожалению, как сделать это программно или выгрузить xsd только для одного объекта (спр.Орагнизации) я не подскажу. Давно не занимался этим вопросом.
Я создал фабрику XDTO, создал столько объектов сколько у меня корневых свойств (с соответствующими типами), заполнил их - как их теперь собрать в один XML-файл?
<offer id="338850">
<name>а/ш 275/35*20 W TS830 P FR XL CONTINENTAL TBL</name>
<param name="Артикул">01324249</param>
<param name="Артикул производителя">0353964</param>
<param name="Ширина протектора">275</param>
<param name="Высота профиля">35</param>
<param name="Диаметр обода в дюймах">20"</param>
<param name="Индекс скорости">W</param>
<param name="Индекс нагрузки">102</param>
<param name="Тип шины">фрикционная шина</param>
<param name="Сезон">зима</param>
<param name="Бренд">CONTINENTAL</param>
<param name="Модель">TS830 P</param>
<stores>
<store id="2791f977-730d-11db-ad64-001111410f5e">1</store>
<store id="3d120f7d-ae54-11e7-897d-5cf3fc94635c">4</store>
</stores>
</offer>
читаю файлы xml с сайта ФНС. Через фабрику XDTO обхожу циклом данные.
На одном файле выдает ошибку "Итератор для значения не определен". В проблемном файле данные по одной организации.
Цикл простейший:
Для Каждого Строка Из Данные.Документ Цикл
Для Каждого Контрагент ИЗ Контрагенты Цикл
Если СокрЛП(Контрагент.ИНН) = Строка.СведНП.ИННЮЛ Тогда
Контрагент.СведенияССЧР = Строка.СведССЧР.КолРаб;
Контрагент.ГодОтчетности = Прав(Строка.ДатаСост,4);
КонецЕсли;
КонецЦикла;
КонецЦикла;
Как обойти эту проблему?
P.S.: С XDTO только начал работать :)
Статья замечательная, достаточно подробно описано, но возникают более глубокие вопросы.
Я создаю xml файл используя пакеты XDTO. Файл сформировался отлично, данные в него загружены.
При открытии файла в notepad++ в нем отсутствуют переносы строк. Т.е. он в одну строку.
В принципе, при открытии через XML Explorer или Edge проблем никаких и нормально парсится, но все равно, удобнее смотреть через notepad++.
Так же выявился "косяк" с пространствами имен.
XDTO самостоятельно присваивает свои пространства имен, дублируя полный адрес в каждой записи.
Например:
<d4p1:Сумма>0.00</d4p1:Сумма>
Буду признателен за разъяснения и новые знания.
Оказывается, для того, чтобы 1С сделала файл с переносами строк необходимо прописать параметры документа.
ПараметрыЗаписиXML = Новый ПараметрыЗаписиXML("UTF-8", "1.0", Истина, Истина);
Для решения проблемы с пространствами имен, я вначале создал корневой элемент руками, прописал все пространства имен через метод ЗаписатьСоответствиеПространстваИмен, а уже потом использовал XDTO для всех остальных записей.
XDTO увидел эти псевдонимы и корректно создал файл.
Никакого XDTO, не нужно.
Вы можете заказать платную консультацию или разработку у автора. Будет создан приватный заказ на «Бирже заказов» для автора.
№ 98019
Создание 12.11.11 00:38
Обновление 13.01.13 13:13
Просмотры 194315
Загрузки 340
Рейтинг
626
Комментарии 118
Код открыт Не указано
Рубрики Файловый обмен (TXT, XML, DBF), FTP
Кому Разработчик
Тип файла Внешняя обработка (ert,epf)
Платформа 1С:Предприятие 8
Конфигурация 1C:Бухгалтерия
Операционная система Не имеет значения
Страна Не имеет значения
Отрасль Не имеет значения
Налоги Не имеет значения
Вид учета Не имеет значения
Доступ к файлу Абонемент ($m)