Пообъектный разбор разметки
Разработка - Инструментарий разработчика
UPD
Конфигурацию можно потрогать на github
Суть
Когда смотришь на очередной xml файл, который тебе прислали для загрузки заказов/прайс-листа/номенклатуры/еще чего-нибудь, в глаза бросается очевидная объектная сущность xml. Почему же нельзя каким-нибудь хитрым образом загрузить это дело так, чтобы просто обращаться к свойствам через точки, не заморачиваясь с предварительным описанием ожидаемой структуры и не выкуривая мануалы по XDTO (что, кстати, советую сделать вне зависимости от)? Можно, конечно, загрузить все в структуры и массивы, но имена тэгов не всегда возможны для ключей структуры, да и загружать файл целиком в оперативную память может быть черевато уже при достижении им 10 Мбайт. 1С не разрешает нам создавать свои объекты, но кое-чего можно добиться и с помощью стандартных. Данная обработка как раз об этом.
Cразу к делу
Пример xml:
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="myfile.xsl" ?>
<bookstore specialty="novel">
<book style="autobiography">
<author>
<first-name>Joe</first-name>
<last-name>Bob</last-name>
<award>Trenton Literary Review Honorable Mention</award>
</author>
<price>12</price>
</book>
<book style="textbook">
<author>
<first-name>Mary</first-name>
<last-name>Bob</last-name>
<publication>Selected Short Stories of
<first-name>Mary</first-name>
<last-name>Bob</last-name>
</publication>
</author>
<editor>
<first-name>Britney</first-name>
<last-name>Bob</last-name>
</editor>
<price>55</price>
</book>
<magazine style="glossy" frequency="monthly">
<price>2.50</price>
<subscription price="24" per="year"/>
</magazine>
<book style="novel" id="myfave">
<author>
<first-name>Toni</first-name>
<last-name>Bob</last-name>
<degree from="Trenton U">B.A.</degree>
<degree from="Harvard">Ph.D.</degree>
<award>Pulitzer</award>
<publication>Still in Trenton</publication>
<publication>Trenton Forever</publication>
</author>
<price intl="Canada" exchange="0.7">6.50</price>
<excerpt>
<p>It was a dark and stormy night.</p>
<p>But then all nights in Trenton seem dark and
stormy to someone who has gone through what
<emph>I</emph> have.</p>
<definition-list>
<term>Trenton</term>
<definition>misery</definition>
</definition-list>
</excerpt>
</book>
<my:book xmlns:my="uri:mynamespace" style="novel" price="29.50">
<my:title>Who's Who in Trenton</my:title>
<my:author>Robert Bob
<my:first-name>Robert</my:first-name>
<my:last-name>Bob</my:last-name>
</my:author>
</my:book>
</bookstore>
Пример разбора:
Разбор = Обработки.РазборРазметки.ИнициализироватьПоиск("book", ПутьКФайлу, Истина, "book.style", "novel");
Пока Разбор.Следующий() Цикл
ИмяАвтора = Разбор.ЗначениеТэга("book.author.first-name", Истина);
ФамилияАвтора = Разбор.ЗначениеТэга("book.author.last-name", Истина);
Если Разбор.ЕстьТэг("book.author.degree") Тогда
СтепениАвтора = Разбор.Тэги("book.author.degree");
Сообщить(ИмяАвтора + " " + ФамилияАвтора + " - обладатель следующих степеней:");
Для Каждого СтепеньАвтора Из СтепениАвтора Цикл
Университет = СтепеньАвтора.ЗначениеАтрибута("degree.from");
Степень = СтепеньАвтора.ЗначениеТэга("degree");
Сообщить(" Университет: " + Университет + "; Степень: " + Степень);
КонецЦикла;
Иначе
Сообщить(ИмяАвтора + " " + ФамилияАвтора + " не имеет степеней.");
КонецЕсли;
КонецЦикла;
Результат:
Toni Bob - обладатель следующих степеней:
Университет: Trenton U; Степень: B.A.
Университет: Harvard; Степень: Ph.D.
Robert Bob не имеет степеней.
Как это и что под капотом
Чаще всего разбираемый файл состоит из кучи однотипных объектов. Загружать в оперативную память весь файл целиком - плохая идея, но вот каждый из этих объектов по отдельности без проблем в ней поместится в 1368 случаях из 1369. Обработка сканирует файл (читает по узлам с помощью штатного ЧтениеXML) и, когда находит нужный нам объект загружает его целиком и предоставляет интерфейс доступа к значениям и атрибутам вложенных тэгов. В общем, ведет себя практически как выборка или то же ЧтениеXML.
API
Обработки.РазборРазметки.ИнициализироватьПоиск("book", ПутьКФайлу, Истина, "book.style", "novel");
Создает новую обработку и задает, что, где и как будем искать. В данном случае будем искать тэги "book" в файле по адресу ПутьКФайлу. Искать будем по локальным именам (в примере последний "book" имеет префикс и его полное имя будет "my:book"). При этом мы хотим читать только те узлы, у которых свойство "book.style" равно "novel". При чем, в данном случае не важно, значение это вложенного тэга или атрибута.
Разбор.Следующий()
Начинает (или продолжает) читать файл в поисках того, что мы попросили. Как находит, читает нужный тэг целиком и говорит, что готов. Если доходит до конца файла, говорит, что все.
ЗначениеТэга("book.author.first-name", Истина);
ЗначениеАтрибута("degree.from");
Получает значение тэга (текст между открывающим и закрывающим тэгом) или значение атрибута соответственно. Второй реквизит отвечает за то, будет ли поиск по локальным именам, или по полным. В случае атрибута адрес задается как адрес тэга и в конце через точку имя атрибута. Вообще была мысль не разделять тэги и атрибуты и сделать просто "ЗначениеСвойства". Пока не попался xml с атрибутом и вложенным тэгом с одинаковыми именами и разными значениями.
Тэги("book.author.degree");
Для загрузки табличных частей и других дублирующихся тэгов. Ищет заданные тэги внутри текущего, возвращает массив таких же объектов РазборРазметки, как и исходный, только каждый с содержанием, соответствующего тэга из множества найденных. В них тот же API доступа к содержанию но без возможности делать Следующий().
ЕстьТэг("book.author.degree")
а также
ЕстьАтрибут(ПутьКАтрибуту, ПоЛокальнымИменам=Ложь)
ЕстьСвойство(ПутьКСвойству, ПоЛокальнымИменам=Ложь)
Просто возвращают, есть ли вложенный тэг, атрибут или (тэг или атрибут).
Еще на данном этапе есть экспериментальный
Текст(ПутьКТэгу, ПоЛокальнымИменам=Ложь)
По задумке должен возвращать текст, очищеный от тэгов. Например, <p>Paragraph <h1>III</h></p> должен превратиться в "Paragraph III". В простых случаях работает, но тупит в случаях, подобных <p>Paragraph <h1>III</h> и какой-то еще текст в конце</p>. Но для такого парсинга есть другие инструменты, да и в практике 1С редко встречаются такие задачи.
Что еще
В модуле менеджера пример использования и простой набор тестов. На форме обработки интерфейс для запуска примера и тестов. Особой оптимизации и рефакторинга пока не было, но те задачи, для выполнения которых этот велосипед сооружался, выполняет вполне достойно. Хоть в некоторых случаях и медленнее, чем было бы какое-то менее универсальное решение. Но в случаях, когда скорость разработки важнее скорости исполнения (отчетный период там, или вторник, например) самое оно. В планах добавить кое-какие свистелки и оптимизмровать. Если уважаемое сообщество заинтересуется, можно и JSON запилить.
Специальные предложения
См. также
Перенос данных БП 3.0 => УТ 11 / КА 2 / ERP 2 (ЕРП) (перенос остатков, документов и справочной информации из "1С:Бухгалтерия предприятия 8", ред.3.0). Обновлено до БП 3.0.73.х, УТ 11.4.10.х, КА 2.4.10.х., ERP 2.4.10.х! Промо
Переносятся документы за выбранный период, справочная информация и остатки по счетам бух. учета в программу УТ 11 / КА 2 / ЕРП 2 (ERP). Переносятся все возможные виды операций ввода остатков на нужную дату. Есть отбор по периоду переноса документов и фильтр по организации, доступен выбор даты ввода остатков. Если нужно переносить что-то дополнительно, то обычно бесплатно добавляем это в перенос . Смотрите видеодемонстрацию со звуком - советами по переносу и рекомендациями настройки программ.
29700 руб.
Просмотр и анализ структуры базы данных (отчет на СКД) 121
5 стартмани
24.07.2019 8679 93 YPermitin 25
Перенос данных БП 2.0 => УТ 11 / КА 2 / ERP 2 (перенос остатков, документов и справочников из "1С:Бухгалтерия предприятия 8", ред. 2.0 в "1С:Управление торговлей 8", ред.11 / КА 2 / ERP 2). Обновлено до УТ 11.4.10.х, КА 2.4.10.х, ERP 2.4.10.х! Промо
Перенос позволяет загрузить в УТ 11 / КА 2 / ERP 2 документы за выбранный период, справочную информацию и остатки по счетам бух. учета. Переносятся остатки денежных средств, взаиморасчетов, остатки товаров и материалов на складах. Переносятся девятнадцать основных видов документов за выбранный период и вся нормативно-справочная информация. Есть фильтр по организации. Если нужно переносить что-то дополнительно, то обычно бесплатно дорабатываю правила (перед покупкой согласуйте необходимые доработки).
29700 руб.
Переводим рутину ручного тестирования 1C на рельсы Jenkins-а и ADD 142
1 стартмани
03.06.2019 11740 1 ripreal1 86
С 2020 года сервис «Продление поддержки конфигурации 1С:УПП» подорожает вдвое Промо
Успейте продлить поддержку УПП до повышения цен! Фирма «1С» предупредила об изменении цен на сервис «Продление поддержки конфигурации "1С:Управление производственным предприятием"». С 1 января 2020 года сервис подорожает в два раза.
Универсальный HTTP-сервис на платформе 1С, аля HTTP-сервер с примером 197
1 стартмани
13.05.2019 18337 93 Diversus 38
Перенос данных КА 1.1 => ERP 2 (ЕРП) (обработка переноса документов, остатков и справочной информации из "1С:Комплексная автоматизация, ред. 1.1" в "1С:ERP Управление предприятием, ред 2"). Обновлен до КА 1.1.115.х и ERP 2.4.10.х Промо
Обработка позволяет переносить из КА 1.1 в ERP 2 документы за выбранный период и остатки. Типовая обработка от фирмы 1С документы не переносит. Также исправлены ошибки типовой обработки. При выходе новых релизов обновление высылается бесплатно в течение года. Разработка будет полезна фирмам-франчайзи, которые периодически выполняют такой перенос данных для заказчиков. Вы можете один раз приобрести обработку переноса, и потом бесплатно получать обновления в случае выхода новых релизов конфигураций 1С.
29700 руб.
1C + Python + Django Rest Framework + Vue.js. Опыт несложной full-stack разработки 123
1 стартмани
22.04.2019 18444 18 riposte 63
Программы для исполнения 54-ФЗ Промо
С 01.02.2017 контрольно-кассовая техника должна отправлять электронные версии чеков оператору фискальных данных - правила установлены в 54-ФЗ ст.2 п.2. Инфостарт предлагает подборку программ, связанных с применением 54-ФЗ, ККТ и электронных чеков.
Конструктор мобильного клиента Simple WMS Client: способ создать полноценный ТСД без мобильной разработки. Теперь новая версия - Simple UI (обновлено 14.11.2019) 178
5 стартмани
09.01.2019 24653 225 informa1555 174
Новый раздел на Инфостарте - Electronic Software Distribution Промо
Инфостарт напоминает: на нашем сайте можно купить не только ПО, связанное с 1С. В нашем арсенале – ESD-лицензии на ПО от ведущих вендоров: Microsoft, Kaspersky, ESET, Dr.Web, Аскон и другие.
- Низкие цены, без скрытых платежей и наценок
- Оперативная отгрузка
- Возможность оплаты с личного счета (кешбек, обмен стартмани на рубли и т.п.)
- Покупки идут в накопления для получения скидочных карт лояльности Silver (5%) и Gold (10%)
Правила обмена данными из Бухгалтерии предприятия ред. 3.0 в Управление производственным предприятием ред. 1.3 2
3 стартмани
06.11.2018 5826 байт 0
Программы для исполнения 488-ФЗ: Маркировка товаров Промо
1 января 2019 года вступил в силу ФЗ от 25.12.2018 № 488-ФЗ о единой информационной системе маркировки товаров с использованием контрольных (идентификационных) знаков, который позволяет проследить движение товара от производителя до конечного потребителя. Инфостарт предлагает подборку программ, связанных с применением 488-ФЗ и маркировкой товаров.
Перенос данных УПП 1.3 => ERP 2 (ЕРП) / УТ 11 / КА 2.х (обработка переноса документов, остатков и справочников из "1С:Управление производственным предприятием, ред. 1.3" в ERP / УТ 11 / КА 2). Обновлен до УПП 1.3.127.х, КА 2.4.10.х и ERP 2.4.10.х! Промо
Обработка позволяет переносить из УПП 1.3 в ERP 2 документы за выбранный период и остатки. Типовая обработка от фирмы 1С документы не переносит. Также исправлены ошибки типовой обработки. При выходе новых релизов обновление высылается бесплатно в течение года. Разработка будет полезна фирмам-франчайзи, которые периодически выполняют такой перенос данных для заказчиков. Вы можете один раз приобрести обработку переноса, и потом бесплатно получать обновления при выходе новых релизов конфигураций 1С.
29700 руб.
Подборка решений для взаимодействия со ФГИС «Меркурий» Промо
С 1 июля 2019 года все компании, участвующие в обороте товаров животного происхождения, должны перейти на электронную ветеринарную сертификацию (ЭВС) через ФГИС «Меркурий». Инфостарт предлагает подборку программ, связанных с этим изменением.
Позиционирование в помещении с помощью нейросети по сигналу Wi-Fi. Интерактивная карта склада в 1С с показом позиции 65
5 стартмани
09.08.2018 17230 23 informa1555 26
Перенос документов и справочников ERP 2 / КА 2 / УТ 11 => БП 3.0 Промо
Перенос позволяет настроить собственный обмен данными между указанными программами, альтернативный предлагаемому фирмой 1С. Предоставляем техподдержку по всем вопросам данного обмена. Можем подключиться к вам удаленно для разбора ситуаций. Оперативно обновляем при выходе новых релизов 1С. Бесплатные обновления в течение полугода.
19700 руб.
Подборка программ для взаимодействия с ЕГАИС Промо
ЕГАИС (Единая государственная автоматизированная информационная система) - автоматизированная система, предназначенная для государственного контроля за объёмом производства и оборота этилового спирта, алкогольной и спиртосодержащей продукции. Инфостарт рекомендует подборку проверенных решений для взаимодействия с системой.
Правила конвертации документов ЗУП 2.5 - ЗУП 3.1 44
10 стартмани
06.03.2018 27183 123 kostya_whiskas 23
1С:Предприятие через Интернет. 1С:Fresh Промо
Ведение бухгалтерского и налогового учет, сдача отчетности, управление бизнесом из любой точки мира. Привычные программы «1С» через Интернет без приобретения коробочных программ.
Пример заполнения/создания файла XML из XSD схемы, используя XDTO 130
1 стартмани
21.12.2017 31424 50 sandybaev 23
Программное формирование форматированной строки в стиле html+inline CSS 53
1 стартмани
18.11.2017 21093 25 bonv 6