Похожая публикация: Парсер YAML
Небольшой парсер для чтения примитивных YML файлов.
Важно! Строки с символом ":" должны экранироваться кавычками, пример:
Ссылки:
- "Авансовый отчет 0000-000001 от 01.08.2023 16:21:36"
Код для копирования:
&НаКлиентеНаСервереБезКонтекста
Функция ДесериализоватьYML(Текст)
ТекущийОбъект = Неопределено;
ТекущийТекст = "";
Отступ = "";
Для Каждого Строка Из СтрРазделить(Текст, Символы.ПС) Цикл
Если СтрНачинаетсяС(СокрЛ(Строка), "#") Тогда
Продолжить;
КонецЕсли;
СтрокаБезОтступа = СокрЛ(Строка);
ТекущийОтступ = Сред(Строка, 0, СтрДлина(Строка) - СтрДлина(СтрокаБезОтступа));
Если Отступ = ТекущийОтступ И ЗначениеЗаполнено(ТекущийТекст) Тогда
Обработать(ТекущийОбъект, ТекущийТекст);
ТекущийТекст = Строка;
Иначе
ТекущийТекст = ТекущийТекст + ?(ЗначениеЗаполнено(ТекущийТекст), Символы.ПС, "") + Строка;
КонецЕсли;
КонецЦикла;
Если ЗначениеЗаполнено(ТекущийТекст) Тогда
Обработать(ТекущийОбъект, ТекущийТекст);
КонецЕсли;
Возврат ТекущийОбъект;
КонецФункции
&НаКлиентеНаСервереБезКонтекста
Процедура Обработать(ТекущийОбъект, ТекущийТекст)
Если ТекущийОбъект = Неопределено Тогда
НачинаетсяСДефиса = СтрНачинаетсяС(СокрЛ(ТекущийТекст), "-");
ТекущийОбъект = ?(НачинаетсяСДефиса, Новый Массив, Новый Соответствие);
КонецЕсли;
Если ТипЗнч(ТекущийОбъект) = Тип("Массив") Тогда
ПозицияЭлементаМассива = СтрНайти(ТекущийТекст, "-");
ЗначениеЭлементаМассива = Лев(ТекущийТекст, ПозицияЭлементаМассива - 1) + " " + Сред(ТекущийТекст, ПозицияЭлементаМассива + 1);
ЗначениеЭлементаМассива = УбратьОбщийОтступ(ЗначениеЭлементаМассива);
Если СтрНайти(ЗначениеЭлементаМассива, Символы.ПС) = 0 И (СтрНайти(ЗначениеЭлементаМассива, ":") = 0 ИЛИ СтрНачинаетсяС(СокрЛ(ЗначениеЭлементаМассива), """")) Тогда
ТекущийОбъект.Добавить(ЗначениеЭлементаМассива);
Иначе
ТекущийОбъект.Добавить(ДесериализоватьYML(ЗначениеЭлементаМассива));
КонецЕсли;
Иначе
ПозицияРазделителя = СтрНайти(ТекущийТекст, ":");
ПозицияПереводаСтроки = СтрНайти(ТекущийТекст, Символы.ПС);
КлючСтруктуры = Сред(ТекущийТекст, 0, ПозицияРазделителя - 1);
Если ПозицияПереводаСтроки = 0 Тогда
ТекущийОбъект.Вставить(КлючСтруктуры, Сред(ТекущийТекст, ПозицияРазделителя + 2));
Иначе
ТекстБезОтступа = УбратьОбщийОтступ(Сред(ТекущийТекст, ПозицияПереводаСтроки + 1));
ТекущийОбъект.Вставить(КлючСтруктуры, ДесериализоватьYML(ТекстБезОтступа));
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
Функция УбратьОбщийОтступ(Текст)
Отступ = СтрДлина(Текст);
МассивСтрок = СтрРазделить(Текст, Символы.ПС);
Для Каждого Строка Из МассивСтрок Цикл
СтрокаБезОтступа = СокрЛ(Строка);
Отступ = Мин(Отступ, СтрДлина(Строка) - СтрДлина(СтрокаБезОтступа))
КонецЦикла;
Для Счетчик = 0 По МассивСтрок.ВГраница() Цикл
МассивСтрок[Счетчик] = Сред(МассивСтрок[Счетчик], Отступ + 1);
КонецЦикла;
Возврат СтрСоединить(МассивСтрок, Символы.ПС);
КонецФункции
Проверено на следующих конфигурациях и релизах:
- 1С:ERP Управление предприятием 2, релизы 2.5.16.78