├── .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 | ![alt text](2024-08-07_13-21-42.png) 26 | 27 | Статья на инфостарте https://infostart.ru/1c/tools/2053702/ 28 | -------------------------------------------------------------------------------- /src/ЧтениеYAML/Forms/Форма.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 | 5 | Форма 6 | 7 | 8 | ru 9 | Форма 10 | 11 | 12 | 13 | Managed 14 | false 15 | 16 | PlatformApplication 17 | MobilePlatformApplication 18 | 19 | 20 | 21 |
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 |
3 | Compact 4 | 5 | 6 | ПриОткрытии 7 | 8 | 9 | 10 | Usual 11 | None 12 | false 13 | 14 | 15 | 16 | ИсходныйТекст 17 | 40 18 | 19 | 20 | 21 | 22 | Center 23 | Vertical 24 | None 25 | false 26 | 27 | 28 | 35 | 46 | 47 | 48 | 49 | Tree 50 | Top 51 | None 52 | true 53 |
false
54 | true 55 | true 56 | true 57 | РезультатДерево 58 | 59 | <v8:item> 60 | <v8:lang>ru</v8:lang> 61 | <v8:content>Результат</v8:content> 62 | </v8:item> 63 | 64 | 65 | 66 | 67 | 68 | 69 | Результат 70 | SearchStringRepresentation 71 | 72 | 73 | 74 | 75 | 76 | 77 | Результат 78 | ViewStatusRepresentation 79 | 80 | 81 | 82 | 83 | 84 | 85 | Результат 86 | SearchControl 87 | 88 | 89 | 90 | 91 | 92 | 93 | РезультатДерево.Ключ 94 | true 95 | EnterOnInput 96 | 97 | 98 | 99 | 100 | РезультатДерево.Значение 101 | true 102 | EnterOnInput 103 | 104 | 105 | 106 | 107 |
108 |
109 |
110 |
111 | 112 | 113 | 114 | cfg:ExternalDataProcessorObject.ЧтениеЗаписьYML 115 | 116 | true 117 | 118 | 119 | 120 | <v8:item> 121 | <v8:lang>ru</v8:lang> 122 | <v8:content>Исходный текст</v8:content> 123 | </v8:item> 124 | 125 | 126 | xs:string 127 | 128 | 0 129 | Variable 130 | 131 | 132 | 133 | 134 | 135 | <v8:item> 136 | <v8:lang>ru</v8:lang> 137 | <v8:content>Результат дерево</v8:content> 138 | </v8:item> 139 | 140 | 141 | v8:ValueTree 142 | 143 | 144 | 145 | 146 | <v8:item> 147 | <v8:lang>ru</v8:lang> 148 | <v8:content>Ключ</v8:content> 149 | </v8:item> 150 | 151 | 152 | xs:string 153 | 154 | 0 155 | Variable 156 | 157 | 158 | 159 | 160 | 161 | <v8:item> 162 | <v8:lang>ru</v8:lang> 163 | <v8:content>Значение</v8:content> 164 | </v8:item> 165 | 166 | 167 | xs:string 168 | 169 | 0 170 | Variable 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | <v8:item> 179 | <v8:lang>ru</v8:lang> 180 | <v8:content>Результат соответствие</v8:content> 181 | </v8:item> 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | <v8:item> 190 | <v8:lang>ru</v8:lang> 191 | <v8:content>-></v8:content> 192 | </v8:item> 193 | 194 | 195 | 196 | ru 197 | Преобразовать текст в соотв 198 | 199 | 200 | Преобразовать 201 | 202 | 203 | 204 | <v8:item> 205 | <v8:lang>ru</v8:lang> 206 | <v8:content>Преобразовать соотв в текст</v8:content> 207 | </v8:item> 208 | 209 | 210 | 211 | ru 212 | Преобразовать соотв в текст 213 | 214 | 215 | ПреобразоватьСоотвВТекст 216 | 217 | 218 | --------------------------------------------------------------------------------