Похожая публикация: Парсер YAML
Небольшой парсер для чтения примитивных YML файлов.
Важно! Строки с символом ":" должны экранироваться кавычками, пример:
Ссылки:
- "Авансовый отчет 0000-000001 от 01.08.2023 16:21:36"
ArraysOfArrays:
- trade1:
- док1
- док2
- trade3:
- док3
- док4
Код для преобразования строки yml в соответствие:
&НаКлиентеНаСервереБезКонтекста
Функция ДесериализоватьYML(Текст)
ТекущийОбъект = Неопределено;
ТекущийТекст = "";
Отступ = "";
Для Каждого Строка Из СтрРазделить(Текст, Символы.ПС) Цикл
Если СтрНачинаетсяС(СокрЛ(Строка), "#") Тогда
Продолжить;
КонецЕсли;
СтрокаБезОтступа = СокрЛ(Строка);
ТекущийОтступ = Сред(Строка, 0, СтрДлина(Строка) - СтрДлина(СтрокаБезОтступа));
Если Отступ = ТекущийОтступ И ЗначениеЗаполнено(ТекущийТекст) Тогда
Обработать(ТекущийОбъект, ТекущийТекст);
ТекущийТекст = Строка;
Иначе
ТекущийТекст = ТекущийТекст + ?(ЗначениеЗаполнено(ТекущийТекст), Символы.ПС, "") + Строка;
КонецЕсли;
КонецЦикла;
Если ЗначениеЗаполнено(ТекущийТекст) Тогда
Обработать(ТекущийОбъект, ТекущийТекст);
КонецЕсли;
Возврат ТекущийОбъект;
КонецФункции
&НаКлиентеНаСервереБезКонтекста
Процедура Обработать(ТекущийОбъект, ТекущийТекст)
Если ТекущийОбъект = Неопределено Тогда
НачинаетсяСДефиса = СтрНачинаетсяС(СокрЛ(ТекущийТекст), "-");
ТекущийОбъект = ?(НачинаетсяСДефиса, Новый Массив, Новый Соответствие);
КонецЕсли;
Если ТипЗнч(ТекущийОбъект) = Тип("Массив") Тогда
ПозицияЭлементаМассива = СтрНайти(ТекущийТекст, "-");
ЗначениеЭлементаМассива = Лев(ТекущийТекст, ПозицияЭлементаМассива - 1) + " " + Сред(ТекущийТекст, ПозицияЭлементаМассива + 1);
ЗначениеЭлементаМассива = УбратьОбщийОтступ(ЗначениеЭлементаМассива);
Если СтрНайти(ЗначениеЭлементаМассива, Символы.ПС) = 0 И (СтрНайти(ЗначениеЭлементаМассива, ":") = 0 ИЛИ СтрНачинаетсяС(СокрЛ(ЗначениеЭлементаМассива), """")) Тогда
ТекущийОбъект.Добавить(ЗначениеЭлементаМассива);
Иначе
ТекущийОбъект.Добавить(ДесериализоватьYML(ЗначениеЭлементаМассива));
КонецЕсли;
Иначе
ПозицияРазделителя = СтрНайти(ТекущийТекст, ":");
ПозицияПереводаСтроки = СтрНайти(ТекущийТекст, Символы.ПС);
КлючСтруктуры = Сред(ТекущийТекст, 0, ПозицияРазделителя - 1);
Если ПозицияПереводаСтроки = 0 Тогда
ТекущийОбъект.Вставить(КлючСтруктуры, Сред(ТекущийТекст, ПозицияРазделителя + 2));
Иначе
ТекстБезОтступа = УбратьОбщийОтступ(Сред(ТекущийТекст, ПозицияПереводаСтроки + 1));
ТекущийОбъект.Вставить(КлючСтруктуры, ДесериализоватьYML(ТекстБезОтступа));
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
Функция УбратьОбщийОтступ(Текст)
Отступ = СтрДлина(Текст);
МассивСтрок = СтрРазделить(Текст, Символы.ПС);
Для Каждого Строка Из МассивСтрок Цикл
СтрокаБезОтступа = СокрЛ(Строка);
Отступ = Мин(Отступ, СтрДлина(Строка) - СтрДлина(СтрокаБезОтступа))
КонецЦикла;
Для Счетчик = 0 По МассивСтрок.ВГраница() Цикл
МассивСтрок[Счетчик] = Сред(МассивСтрок[Счетчик], Отступ + 1);
КонецЦикла;
Возврат СтрСоединить(МассивСтрок, Символы.ПС);
КонецФункции
Из за того что выбран парсинг в соответствие и массивы изменяется порядок следования свойств, так как платформа автоматически упорядочивает ключи соответствия по алфавиту. При дисериализации получаем совершенно другой файл. В качестве решения этой проблемы предлагается использовать список значений вместо соответствия
Регистры:
- РегистрНакопления.АвансовыеПлатежиИностранцевПоНДФЛ
Ссылки:
- "(56d0d36f-306e-11ee-841a-e16e604b2373) Авансовый отчет 0000-000001 от 01.08.2023 16:21:36"
doe: "a deer, a female deer"
ray: "a drop of golden sun"
pi: 3.14159
xmas: true
french-hens: 3
calling-birds:
- huey
- dewey
- louie
- fred
xmas-fifth-day:
calling-birds: four
french-hens: 3
golden-rings: 5
partridges:
count: 1
location: "a pear tree"
turtle-doves: two
foo: bar
pleh: help
stuff:
foo: bar
bar: foo
name: AWS-CD
on:
push:
branches:
- master
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
- name: Install Node packages
run: npm install
- name: Build the project
run: npm run build
- name: Deploy to S3
run: AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY}
# This is a comment
title: This is some YAML
publisher: ConvertSimple Books
pages: 250
chapters: 21
time_to_read: 12 hours
descriptors:
- fun
- entertaining
- exciting
contributors:
author: Mark Templeton
editor: Cindy Johnson
Если на каких-то данных не работает - предлагайте ваш вариант решения проблемы...
Исходный код: https://github.com/kuzyara/1c-yaml-parser
Проверено на следующих конфигурациях и релизах:
- 1С:ERP Управление предприятием 2, релизы 2.5.16.78