├── .gitignore
├── ЧтениеYAML.epf
├── 2024-02-29_09-19-30.png
├── 2024-08-07_13-21-42.png
├── README.md
└── src
├── ЧтениеYAML
└── Forms
│ ├── Форма.xml
│ └── Форма
│ └── Ext
│ ├── Form
│ └── Module.bsl
│ └── Form.xml
└── ЧтениеYAML.xml
/.gitignore:
--------------------------------------------------------------------------------
1 | /build/
2 | /bin/
--------------------------------------------------------------------------------
/ЧтениеYAML.epf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kuzyara/1c-yaml-parser/HEAD/ЧтениеYAML.epf
--------------------------------------------------------------------------------
/2024-02-29_09-19-30.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kuzyara/1c-yaml-parser/HEAD/2024-02-29_09-19-30.png
--------------------------------------------------------------------------------
/2024-08-07_13-21-42.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kuzyara/1c-yaml-parser/HEAD/2024-08-07_13-21-42.png
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Чтение yml 1с
2 |
3 | Примитивный парсер yml файлов на языке 1С
4 |
5 | Умеет читать YML в соответствие (или структуру если пропишете)
6 |
7 | Умеет записывать соответствие/структуру/массив в строку YML
8 |
9 | __[Скачать](https://github.com/kuzyara/1c-yaml-parser/releases/latest/download/YAML.epf)__
10 |
11 | Выражаю благодарность [AllexAllex](https://github.com/AllexAllex) за посильную помощь в [исправлении ошибок](https://github.com/kuzyara/1c-yaml-parser/pull/2) парсера
12 |
13 | ```bsl
14 | // todo: добавить выбор типа
15 | &НаСервере
16 | // Текст - "Строка" - конвертируемый текст в формате YAML
17 | // Тип - "Строка" - тип данных для загрузки, возможные варианты:
18 | // - "Структура" - для обращения через точку
19 | // - "Соответствие" - для обращения через [""] если есть пробелы/спецсимволы
20 | // - "СписокЗначений" - для сохранения порядка следования, так как для предыдущих вариантов при дисериализации получаем совершенно другой файл
21 | //
22 | Функция ДесериализоватьYML(Текст, Тип = "Структура")
23 | ```
24 |
25 | 
26 |
27 | Статья на инфостарте https://infostart.ru/1c/tools/2053702/
28 |
--------------------------------------------------------------------------------
/src/ЧтениеYAML/Forms/Форма.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
22 |
--------------------------------------------------------------------------------
/src/ЧтениеYAML.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | c3831ec8-d8d5-4f93-8a22-f9bfae07327f
7 | 73fc5157-201a-4c4d-a308-cf1d180784b9
8 |
9 |
10 | 2c4bcf74-5e77-4bdf-b078-1b014032016c
11 | cde1df3a-882e-4f6d-99e0-fb9be0a471db
12 |
13 |
14 |
15 | ЧтениеЗаписьYML
16 |
17 |
18 | ru
19 | Чтение запись YML
20 |
21 |
22 |
23 | ExternalDataProcessor.ЧтениеЗаписьYML.Form.Форма
24 |
25 |
26 |
27 |
28 |
29 |
30 |
--------------------------------------------------------------------------------
/src/ЧтениеYAML/Forms/Форма/Ext/Form/Module.bsl:
--------------------------------------------------------------------------------
1 | &НаКлиенте
2 | Процедура ПриОткрытии(Отказ)
3 | ИсходныйТекст = НСтр("ru = 'jobs:
4 | | build:
5 | | runs-on: ubuntu-latest
6 | | steps:
7 | | - uses: actions/checkout@v1
8 | | - name: Install Node packages
9 | | run: npm install'");
10 | КонецПроцедуры
11 |
12 | &НаСервере
13 | Процедура ПреобразоватьНаСервере()
14 | Результат = ДесериализоватьYML(ИсходныйТекст);
15 |
16 | РезультатСоответствие = ПоместитьВоВременноеХранилище(Результат, ЭтаФорма.УникальныйИдентификатор);
17 |
18 | ДеревоЗначений = Новый ДеревоЗначений;
19 | ДеревоЗначений.Колонки.Добавить("Ключ");
20 | ДеревоЗначений.Колонки.Добавить("Значение");
21 |
22 | РезультатВДерево(Результат, ДеревоЗначений);
23 |
24 | ЗначениеВРеквизитФормы(ДеревоЗначений, "РезультатДерево");
25 | КонецПроцедуры
26 |
27 | &НаСервере
28 | Процедура РезультатВДерево(Результат, РодительскаяСтрокаДерева)
29 |
30 | Если Тип("СписокЗначений") = ТипЗнч(Результат) Тогда
31 |
32 | Для Каждого ЭлементСписка Из Результат Цикл
33 | ТекущаяСтрокаДерева = РодительскаяСтрокаДерева.Строки.Добавить();
34 | ТекущаяСтрокаДерева.Ключ = ЭлементСписка.Представление;
35 | Если ТипЗнч(ЭлементСписка.Значение) = Тип("Строка") Тогда
36 | ТекущаяСтрокаДерева.Значение = ЭлементСписка.Значение;
37 | Иначе
38 | РезультатВДерево(ЭлементСписка.Значение, ТекущаяСтрокаДерева)
39 | КонецЕсли;
40 | КонецЦикла;
41 |
42 | ИначеЕсли Тип("Массив") = ТипЗнч(Результат) Тогда
43 |
44 | Для Индекс = 0 По Результат.ВГраница() Цикл
45 | ТекущаяСтрокаДерева = РодительскаяСтрокаДерева.Строки.Добавить();
46 | ТекущаяСтрокаДерева.Ключ = "ЭлементМассива[" + Индекс + "]";
47 | Если ТипЗнч(Результат[Индекс]) = Тип("Строка") Тогда
48 | ТекущаяСтрокаДерева.Значение = Результат[Индекс];
49 | Иначе
50 | РезультатВДерево(Результат[Индекс], ТекущаяСтрокаДерева)
51 | КонецЕсли;
52 | КонецЦикла;
53 |
54 | КонецЕсли;
55 |
56 | КонецПроцедуры
57 |
58 | &НаКлиенте
59 | Процедура Преобразовать(Команда)
60 | ПреобразоватьНаСервере();
61 | Для Каждого ТекЭлемент Из РезультатДерево.ПолучитьЭлементы() Цикл
62 | Элементы.Результат.Развернуть(ТекЭлемент.ПолучитьИдентификатор(), Истина);
63 | КонецЦикла;
64 |
65 | КонецПроцедуры
66 |
67 | &НаСервере
68 | Функция ДесериализоватьYML(Текст)
69 | ТекущийОбъект = Неопределено;
70 |
71 | ТекущийТекст = "";
72 | Отступ = "";
73 | Для Каждого Строка Из СтрРазделить(Текст, Символы.ПС) Цикл
74 |
75 | Если СтрНачинаетсяС(СокрЛ(Строка), "#") Тогда
76 | Продолжить;
77 | КонецЕсли;
78 |
79 | СтрокаБезОтступа = СокрЛ(Строка);
80 | Если ПустаяСтрока(СтрокаБезОтступа) Тогда
81 | Продолжить;
82 | КонецЕсли;
83 | ТекущийОтступ = Сред(Строка, 0, СтрДлина(Строка) - СтрДлина(СтрокаБезОтступа));
84 |
85 | Если Отступ = ТекущийОтступ И ЗначениеЗаполнено(ТекущийТекст) Тогда
86 | Обработать(ТекущийОбъект, ТекущийТекст);
87 | ТекущийТекст = Строка;
88 | Иначе
89 | ТекущийТекст = ТекущийТекст + ?(ЗначениеЗаполнено(ТекущийТекст), Символы.ПС, "") + Строка;
90 | КонецЕсли;
91 |
92 | КонецЦикла;
93 |
94 | Если ЗначениеЗаполнено(ТекущийТекст) Тогда
95 | Обработать(ТекущийОбъект, ТекущийТекст);
96 | КонецЕсли;
97 |
98 | Возврат ТекущийОбъект;
99 |
100 | КонецФункции
101 |
102 | &НаСервере
103 | Процедура Обработать(ТекущийОбъект, ТекущийТекст)
104 |
105 | Если ТекущийОбъект = Неопределено Тогда
106 | НачинаетсяСДефиса = СтрНачинаетсяС(СокрЛ(ТекущийТекст), "-");
107 | ТекущийОбъект = ?(НачинаетсяСДефиса, Новый Массив, Новый СписокЗначений);
108 | КонецЕсли;
109 |
110 | Если ТипЗнч(ТекущийОбъект) = Тип("Массив") Тогда
111 |
112 | ПозицияЭлементаМассива = СтрНайти(ТекущийТекст, "-");
113 | ЗначениеЭлементаМассива = Лев(ТекущийТекст, ПозицияЭлементаМассива - 1) + " " + Сред(ТекущийТекст, ПозицияЭлементаМассива + 1);
114 | ЗначениеЭлементаМассива = УбратьОбщийОтступ(ЗначениеЭлементаМассива);
115 |
116 | Если СтрНайти(ЗначениеЭлементаМассива, Символы.ПС) = 0 И (СтрНайти(ЗначениеЭлементаМассива, ":") = 0 ИЛИ СтрНачинаетсяС(СокрЛ(ЗначениеЭлементаМассива), """")) Тогда
117 | ТекущийОбъект.Добавить(ЗначениеЭлементаМассива);
118 | Иначе
119 | ТекущийОбъект.Добавить(ДесериализоватьYML(ЗначениеЭлементаМассива));
120 | КонецЕсли;
121 |
122 | Иначе
123 |
124 | ПозицияРазделителя = СтрНайти(ТекущийТекст, ":");
125 | ПозицияПереводаСтроки = СтрНайти(ТекущийТекст, Символы.ПС);
126 | КлючСтруктуры = Сред(ТекущийТекст, 0, ПозицияРазделителя - 1);
127 |
128 | Если ПозицияПереводаСтроки = 0 Тогда
129 | ТекущийОбъект.Добавить(Сред(ТекущийТекст, ПозицияРазделителя + 2), КлючСтруктуры);
130 | Иначе
131 | ТекстБезОтступа = УбратьОбщийОтступ(Сред(ТекущийТекст, ПозицияПереводаСтроки + 1));
132 | ТекущийОбъект.Добавить(ДесериализоватьYML(ТекстБезОтступа), КлючСтруктуры);
133 | КонецЕсли;
134 |
135 | КонецЕсли;
136 |
137 | КонецПроцедуры
138 |
139 | &НаКлиентеНаСервереБезКонтекста
140 | Функция УбратьОбщийОтступ(Текст)
141 |
142 | Отступ = СтрДлина(Текст);
143 | МассивСтрок = СтрРазделить(Текст, Символы.ПС);
144 | Для Каждого Строка Из МассивСтрок Цикл
145 | СтрокаБезОтступа = СокрЛ(Строка);
146 | Отступ = Мин(Отступ, СтрДлина(Строка) - СтрДлина(СтрокаБезОтступа))
147 | КонецЦикла;
148 |
149 | Для Счетчик = 0 По МассивСтрок.ВГраница() Цикл
150 | МассивСтрок[Счетчик] = Сред(МассивСтрок[Счетчик], Отступ + 1);
151 | КонецЦикла;
152 |
153 | Возврат СтрСоединить(МассивСтрок, Символы.ПС);
154 |
155 | КонецФункции
156 |
157 | &НаКлиентеНаСервереБезКонтекста
158 | Функция YMLСериализатор(Структура, Знач КоличествоОтступов = 0)
159 |
160 | Ответ = "";
161 | Разд = " ";
162 |
163 | Для Каждого Элемент Из Структура Цикл
164 |
165 | ТипЗначения = ТипЗнч(Элемент.Значение);
166 | Для Итератор = 1 По КоличествоОтступов Цикл
167 | Ответ = Ответ + Разд;
168 | КонецЦикла;
169 |
170 | Если ТипЗначения = Тип("Структура") ИЛИ ТипЗначения = Тип("СписокЗначений") Тогда
171 |
172 | Ответ = Ответ + СтрШаблон("%1:
173 | |%2",
174 | Элемент.Представление,
175 | YMLСериализатор(Элемент.Значение, КоличествоОтступов + 1));
176 | ИначеЕсли ТипЗначения = Тип("Массив") Тогда
177 | Ответ = Ответ +
178 | СтрШаблон("%1:
179 | |", Элемент.Представление);
180 | //КоличествоОтступов = КоличествоОтступов + 1;
181 | Для Каждого ЭлементМассива Из Элемент.Значение Цикл
182 | Для Итератор = 1 По КоличествоОтступов Цикл
183 | Ответ = Ответ + Разд;
184 | КонецЦикла;
185 | Если ТипЗнч(ЭлементМассива) = Тип("Структура")
186 | ИЛИ ТипЗнч(ЭлементМассива) = Тип("СписокЗначений")
187 | ИЛИ ТипЗнч(ЭлементМассива) = Тип("Массив") Тогда
188 | Ответ = Ответ + СтрШаблон(Разд + "- %1",
189 | СокрЛ(YMLСериализатор(ЭлементМассива, КоличествоОтступов + 2)));
190 | Иначе
191 | Ответ = Ответ + Разд +
192 | СтрШаблон("- %1
193 | |", ЭлементМассива);
194 | КонецЕсли;
195 | КонецЦикла;
196 | Иначе
197 |
198 | СтроковоеПредставление = Строка(Элемент.Значение);
199 |
200 | Ответ = Ответ +
201 | СтрШаблон("%1: %2
202 | |", Элемент.Представление, СтроковоеПредставление);
203 | КонецЕсли;
204 |
205 | КонецЦикла;
206 |
207 | Возврат Ответ;
208 |
209 | КонецФункции
210 |
211 | &НаКлиенте
212 | Процедура ПреобразоватьСоотвВТекст(Команда)
213 | Соответствие = ПолучитьИзВременногоХранилища(РезультатСоответствие);
214 |
215 | ИсходныйТекст = YMLСериализатор(Соответствие);
216 | КонецПроцедуры
217 |
--------------------------------------------------------------------------------
/src/ЧтениеYAML/Forms/Форма/Ext/Form.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------