├── 1Cv8.cf
├── README.md
└── src
├── CommonModule.git_JSON.Module.txt
├── CommonModule.git_JSON.xml
├── CommonModule.git_Slack.Module.txt
├── CommonModule.git_Slack.xml
├── Configuration.xml
└── Language.Русский.xml
/1Cv8.cf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pbazeliuk/1C-Slack/83216215d5a0c4ab32d793622dd709aedfb91774/1Cv8.cf
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | Интеграция «1С:Предприятия 8.3» с сервисом Slack
2 | ========
3 | Краткое описание - что, зачем и почему
4 | https://pbazeliuk.com/2014/09/14/1c-slack-integration/
5 |
--------------------------------------------------------------------------------
/src/CommonModule.git_JSON.Module.txt:
--------------------------------------------------------------------------------
1 |
2 | // 1С:JSON. JavaScript Object Notation парсер и сериализатор.
3 |
4 | // Copyright © 2010-2013 Александр Переверзев
5 |
6 | // Данная лицензия разрешает лицам, получившим копию данного программного
7 | // обеспечения и сопутствующей документации (в дальнейшем именуемыми «Программное
8 | // Обеспечение»), безвозмездно использовать Программное Обеспечение без ограничений,
9 | // включая неограниченное право на использование, копирование, изменение,
10 | // добавление, публикацию, распространение, сублицензирование и/или продажу копий
11 | // Программного Обеспечения, также как и лицам, которым предоставляется данное
12 | // Программное Обеспечение, при соблюдении следующих условий:
13 |
14 | // Указанное выше уведомление об авторском праве и данные условия должны быть
15 | // включены во все копии или значимые части данного Программного Обеспечения.
16 |
17 | // ДАННОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ «КАК ЕСТЬ», БЕЗ КАКИХ-ЛИБО
18 | // ГАРАНТИЙ, ЯВНО ВЫРАЖЕННЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ
19 | // ГАРАНТИЯМИ ТОВАРНОЙ ПРИГОДНОСТИ, СООТВЕТСТВИЯ ПО ЕГО КОНКРЕТНОМУ НАЗНАЧЕНИЮ И
20 | // ОТСУТСТВИЯ НАРУШЕНИЙ ПРАВ. НИ В КАКОМ СЛУЧАЕ АВТОРЫ ИЛИ ПРАВООБЛАДАТЕЛИ НЕ НЕСУТ
21 | // ОТВЕТСТВЕННОСТИ ПО ИСКАМ О ВОЗМЕЩЕНИИ УЩЕРБА, УБЫТКОВ ИЛИ ДРУГИХ ТРЕБОВАНИЙ ПО
22 | // ДЕЙСТВУЮЩИМ КОНТРАКТАМ, ДЕЛИКТАМ ИЛИ ИНОМУ, ВОЗНИКШИМ ИЗ, ИМЕЮЩИМ ПРИЧИНОЙ ИЛИ
23 | // СВЯЗАННЫМ С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ ИЛИ ИСПОЛЬЗОВАНИЕМ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ
24 | // ИЛИ ИНЫМИ ДЕЙСТВИЯМИ С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ.
25 |
26 |
27 | // Александр Переверзев
28 | // e-mail: a.v.pereverzev@gmail.com
29 | // Версия: 2.0.0.17
30 |
31 |
32 | // Особенности:
33 | // Парсер и сериализатор поддерживают два режима (формата) работы:
34 | // - Стандартный – полная поддержка стандарта JSON (подробнее см. и
35 | // );
36 | // - Альтернативный – направлен на применение в проектах подразумевающих постоянный двусторонний
37 | // обмен данными, по каналам связи Интернет, и требующих повышенную скорость обработки данных,
38 | // минимизацию пересылаемых пакетов данных и однозначную идентификацию ссылочных типов во входящих данных.
39 | //
40 | // Независимо от режима работы сериализатор, по требованию (см. Настройки), позволяет автоматически передавать
41 | // не только уникальный идентификатор ссылки, но и ее представление, а парсер в свою очередь,
42 | // анализируя входные данные, опускает представления ссылок, не включая их в результирующий набор данных.
43 | //
44 | // При работе с проектами, в исходящих строковых данных которых не гарантируется отсутствие символов из диапазонов:
45 | // [0x007f, 0x009f], 0x00ad, [0x0600, 0x0604], 0x070f, [0x17b4, 0x17b5],
46 | // [0x200c, 0x200f], [0x2028, 0x202f] [0x2060, 0x206f], 0xfeff, [0xfff0, 0xffff],
47 | // рекомендуется не отключать настройку (см. Настройки) полного маскирования символов
48 | // (подробнее см. и ).
49 | //
50 | // Независимо от режима работы сериализатор, по требованию (см. Настройки), может маскировать кириллические символы
51 | // современных алфавитов славянских языков "АБВГҐДЂЃЕЀЁЄЖЗЅИЍІЇЙЈКЛЉМНЊОПРСТЋЌУЎФХЦЧЏШЩЪЫЬЭЮЯ" (включая нижний регистр)
52 | // (подробнее см. и ).
53 | //
54 | // Поддерживаются все среды исполнения с ограничением сериализуемых типов. Используется кроссплатформенный код.
55 |
56 |
57 |
58 | // Методы:
59 | // ПрочитатьJSON – парсер;
60 | // ЗаписатьJSON – сериализатор.
61 |
62 | // Настройки и параметры:
63 | //
64 | // Параметры функций:
65 | // Стандарт – определяет режим работы парсера и сериализатора:
66 | // - Истина – стандартный режим (значение по умолчанию);
67 | // - Ложь – альтернативный режим;
68 | // - Неопределено – автоматическое определение режима входящих данных
69 | // (только парсер, не рекомендуется – влияет на производительность).
70 | //
71 | // ПредставленияСсылок – позволяет автоматически передавать не только значение ссылки, но и ее представление:
72 | // - Истина - ссылка парсится и сериализуется как объект с двумя свойствами "Ссылка" и "Представление";
73 | // - Ложь - ссылка парсится и сериализуется как уникальный идентификатор ссылки (значение по умолчанию);
74 | // - Неопределено – автоматическое определение формата ссылок во входящих данных
75 | // (только парсер, не рекомендуется – влияет на производительность).
76 | //
77 | // Настройки:
78 | // АвтоматическоеПриведениеОбъектаКСтруктуре – автоматическое приведение объекта к структуре, а не к соответствию.
79 | // Настройка изменяется в функции "АвтоматическоеПриведениеОбъектаКСтруктуре" (по умолчанию отключена).
80 | // Автоматическое приведение к структуре выполняется только для объектов имена свойств, которых могут быть
81 | // использованы как ключи структуры, все остальные объекты преобразуются в соответствие.
82 | //
83 | // ПолноеМаскированиеСимволов – маскирование символов некорректно обрабатываемых JavaScript-ом.
84 | // Настройка изменяется в функции "НастройкаПолноеМаскированиеСимволов" (по умолчанию включена).
85 | // Не рекомендуется к использованию, так как влияет на производительность, но гарантирует безопасную передачу данных.
86 | // Маскирование специальных символов из диапазона [0x0000, 0x001f] выполняется в не зависимости от настройки.
87 | //
88 | // МаскированиеКириллицы – маскирование кириллических символов современных алфавитов славянских языков.
89 | // Настройка изменяется в функции "НастройкаМаскированиеКириллицы" (по умолчанию отключена).
90 | // Не рекомендуется к использованию, так как влияет на производительность.
91 | // Маскирование специальных символов из диапазона [0x0000, 0x001f] выполняется в не зависимости от настройки.
92 | //
93 | // НеявноеПриведениеПримитивныхЗначенийКлюча – неявное приведение примитивных значений ключей соответствий к строке.
94 | // Настройка изменяется в функции "НеявноеПриведениеПримитивныхЗначенийКлюча" (по умолчанию отключена).
95 |
96 |
97 | // Альтернативный режим:
98 | // - Не поддерживается форматирование, как во входящих, так и в исходящих данных;
99 | // - Сериализация ссылочных типов в строковое служебное представление.
100 |
101 |
102 | // Приятности:
103 | // Парсер:
104 | // - Устойчивость к некорректным данным и не подверженность injection атакам;
105 | // - Продвинутый синтаксический анализатор (указывает место и тип ошибки в данных);
106 | // - Поддержка форматирования во входящих данных (только стандартный режим);
107 | // - Безопасный разбор форматирования - незамаскированные символы форматирования в строковых значениях не будут утеряны;
108 | // - Поддержка строк в одинарных и в двойных кавычках;
109 | // - Автоматическое приведение объекта к структуре или соответствию в зависимости от имен свойств¹;
110 | // - Автоматическое преобразование к типу Дата строки вида "9999-99-99T99:99:99Z";
111 | // - Автоматическое преобразование к типу УникальныйИдентификатор строки вида "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX";
112 | // - Автоматического определение режима (стандартного или альтернативного) входящих данных;
113 | // - Автоматического определение необходимости отсечения представления ссылок;
114 | // - Однозначная идентификация ссылок (только альтернативный режим).
115 | // Сериализатор:
116 | // - Поддержка форматирования исходящих данных (только стандартный режим);
117 | // - Широкий состав сериализуемых типов данных, в том числе ссылок;
118 | // - Автоматическое приведение значений ключей соответствий к строковому представлению в формате 1С²;
119 | // - Автоматическое преобразование неподдерживаемых типов к строке;
120 | // - Маскирование кириллических символов современных алфавитов славянских языков;
121 | // - Нечувствительность к локализации³.
122 | // ----
123 | // ¹ Если все имена свойства входящего объекта могут быть использованы как ключи структуры,
124 | // то такой объект будет автоматически приведен к структуре, а не к соответствию. Управляется настройкой.
125 | // ² Управляется настройкой.
126 | // ³ При сериализации некоторых типов, исходящие объекты которых имеют обязательные свойства,
127 | // такие представления и имена таких свойств всегда имеют русскую локализацию.
128 |
129 |
130 | // Неприятности:
131 | // - Нестандартно форматированный код (Alt+Shift+F в помощь) на гране читаемости;
132 | // - Сериализатор ориентирован, на средние-крупные пакеты данных.
133 |
134 | // Сериализуемые типы:
135 | // Сервер, толстый клиент, тонкий клиент, веб-клиент:
136 | // - Неопределено;
137 | // - Null;
138 | // - Примитивные типы (все);
139 | // - Универсальные коллекции значений (клиентские);
140 | // - УникальныйИдентификатор;
141 | // - ДвоичныеДанные;
142 | // - Картинка.
143 | // Сервер, толстый клиент:
144 | // - Универсальные коллекции значений (серверные);
145 | // - ЛюбаяСсылка;
146 | // - Запрос;
147 | // - РезультатЗапроса;
148 | // - ВыборкаИзРезультатаЗапроса;
149 | // - ПостроительЗапроса;
150 | // - ПостроительОтчета;
151 | // - ХранилищеЗначения.
152 | // Сервер:
153 | // - ДанныеФормыКоллекция;
154 | // - ДанныеФормыСтруктураСКоллекцией;
155 | // - ДанныеФормыДерево.
156 |
157 | // Порядок сериализации типов:
158 | // - Неопределено - сериализуется как Null;
159 | // - Null - согласно стандарту;
160 | // - Примитивные типы - согласно стандарту;
161 | // - Массивы и COMSafeArray - массив, согласно стандарту:
162 | // [ Значение, ... ]
163 | //
164 | // - Структуры и соответствия – объект, согласно стандарту;
165 | // { Ключ:Значение, ... }
166 | //
167 | // - СписокЗначений - массив объектов с тремя свойствами "Значение", "Представление" и "Пометка";
168 | // [ { "Значение":Значение, "Представление":Представление, "Пометка":Пометка }, ... ]
169 | //
170 | // - КлючИЗначение - объект с двумя свойствами "Ключ" и "Значени";
171 | // { "Ключ":Ключ, "Значение":Значение }
172 | //
173 | // - ТаблицаЗначений - массив объектов:
174 | // [ { Колонка:Значение, ... }, ... ]
175 | //
176 | // - ДеревоЗначений - массив объектов с обязательным свойством "Строки":
177 | // [ { Колонка:Значение, ... , "Строки":[ { Колонка:Значение, ... , "Строки":[ ... ] } , ... ] }, ... ]
178 | //
179 | // - УникальныйИдентификатор - приведение к строке вида "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX";
180 | //
181 | // - ЛюбаяСсылка:
182 | // - Стандартный режим - получение уникального идентификатора ссылки (в том числе и для перечислений) и его сериализация;
183 | // - Альтернативный режим - приведение к строке служебного вида "¦ref¦ ... ¦";
184 | //
185 | // При сериализации ссылок в режиме автоматически передачи не только сериализованного значения ссылки,
186 | // но и ее представления. Каждая ссылка передается как объект с двумя свойствами "Ссылка" и "Представление";
187 | // { "Ссылка":Ссылка, "Представление":Представление }
188 | //
189 | // - Запрос - автоматически выполняется и сериализуется как таблица значений;
190 | // - РезультатЗапроса - сериализуется как таблица значений;
191 | // - ВыборкаИзРезультатаЗапроса - сериализуется как структура значений текущей запись результата запроса;
192 | // - ПостроительЗапроса - автоматически выполняется и сериализуется как таблица значений;
193 | // - ПостроительОтчета - автоматически выполняется и сериализуется как таблица значений;
194 | // - ДанныеФормыКоллекция - сериализуется как таблица значений;
195 | // - ДанныеФормыСтруктураСКоллекцией - сериализуется как таблица значений;
196 | // - ДанныеФормыДерево - сериализуется как дерево значений;
197 | // - ДвоичныеДанные - кодируется по алгоритму base64¹ и сериализуется как строка;
198 | // - Картинка - автоматически преобразуется и сериализуется как двоичные данные;
199 | // - ХранилищеЗначения - автоматически извлекается сохраненное значение и сериализуется в зависимости от типа извлеченного значения.
200 | // ----
201 | // ¹ Следуя рекомендациям стандарта, сериализатор при кодировании по алгоритму base64, не добавляет переводы строк
202 | // в результирующие данные (подробнее см. ).
203 |
204 | // Производительность:
205 | // Производительность парсера исключительно зависит от набора входящих данных, а также от наличия форматирования.
206 | // Наихудшим вариантом является форматированный массив чисел, наилучшим - неформатированный массив строк.
207 | //
208 | // Intel Core 2 Duo T5870 @ 2GHz - форматированный массив со всеми приблизительно равномерно встречающимися типами данных:
209 | // Парсер: 35 Кбайт/с.
210 | // Сериализатор: 165 Кбайт/с.
211 |
212 | // Примечание:
213 | // Мало комментариев - без комментариев.
214 |
215 | // Всем удачного программирования :)
216 |
217 |
218 | // ─────────────────────────────────────────────────────────────────────────────
219 | // JSON
220 |
221 | // JSON парсер.
222 | //
223 | // Параметры:
224 | // Значение - Строка. Строка данных в формате JSON для парсинга;
225 | //
226 | // Стандарт - Неопределено, Булево. Режим работы:
227 | // - Истина - стандартный режим (значение по умолчанию);
228 | // - Ложь - альтернативный режим;
229 | // - Неопределено - автоопределение режима;
230 | //
231 | // ПредставленияСсылок - Неопределено, Булево. Режим передачи ссылочных типов, с их представлением или без:
232 | // - Истина - ссылки передаются вместе со своим представлением, как объекты с двумя свойствами содержащими саму ссылку и ее представление;
233 | // - Ложь - ссылки передаются без представления (значение по умолчанию).
234 | // - Неопределено - автоопределение режима.
235 | //
236 | // Возвращаемое значение:
237 | // Набор данных согласно содержимому входящих данных.
238 | //
239 | Функция ПрочитатьJSON(Значение, Стандарт = Истина, ПредставленияСсылок = Ложь) Экспорт
240 |
241 | Возврат jsonПрочитатьИнициализация(Значение, Стандарт, ПредставленияСсылок);
242 |
243 | КонецФункции // ПрочитатьJSON()
244 |
245 | // JSON сериализатор.
246 | //
247 | // Параметры:
248 | // Значение. Набор данных сериализуемых в формат JSON;
249 | //
250 | // Стандарт - Булево. Режим работы:
251 | // - Истина - стандартный режим (значение по умолчанию);
252 | // - Ложь - альтернативный режим;
253 | //
254 | // ПредставленияСсылок - Булево. Режим передачи ссылочных типов, с их представлением или без:
255 | // - Истина - ссылки передаются вместе со своим представлением, как объекты с двумя свойствами содержащими саму ссылку и ее представление;
256 | // - Ложь - ссылки передаются без представления (значение по умолчанию).
257 | //
258 | // Возвращаемое значение:
259 | // Строка. Строка данных в формате JSON согласно содержимому входящих данных.
260 | //
261 | Функция ЗаписатьJSON(Значение, Стандарт = Истина, ПредставленияСсылок = Ложь) Экспорт
262 |
263 | Возврат jsonЗаписатьИнициализация(Значение, Стандарт, ПредставленияСсылок);
264 |
265 | КонецФункции // ЗаписатьJSON()
266 |
267 |
268 | // ─────────────────────────────────────────────────────────────────────────────
269 | // НАСТРОЙКИ
270 |
271 | // Функция управляющая настройкой "АвтоматическоеПриведениеОбъектаКСтруктуре".
272 | //
273 | // Возвращаемое значение:
274 | // Булево. Значение настройки:
275 | // - Истина - выполняется автоматическое приведение объекта к структуре;
276 | // - Ложь - автоматическое приведение объекта к структуре не выполняется, все объекты преобразуются в соответствие.
277 | //
278 | // Примечание:
279 | // Автоматическое приведение к структуре выполняется только для объектов имена свойств которых могут быть
280 | // использованы как ключи структуры, все остальные объекты преобразуются в соответствие.
281 | //
282 | Функция НастройкаАвтоматическоеПриведениеОбъектаКСтруктуре()
283 |
284 | Возврат Ложь; // Измените для использования автоматического приведения объекта к структуре.
285 |
286 | КонецФункции // НастройкаАвтоматическоеПриведениеОбъектаКСтруктуре()
287 |
288 | // Функция управляющая настройкой "ПолноеМаскированиеСимволов".
289 | //
290 | // Возвращаемое значение:
291 | // Булево. Значение настройки:
292 | // - Истина - выполняется полное маскирование символов некорректно обрабатываемых JavaScript-ом;
293 | // - Ложь - маскирование выполняется только согласно стандарту и дополнительно маскируются специальные символы.
294 | //
295 | // Примечание:
296 | // Маскирование специальных символов из диапазона [0x0000, 0x001f] выполняется в не зависимости от настройки.
297 | //
298 | Функция НастройкаПолноеМаскированиеСимволов()
299 |
300 | Возврат Истина; // Измените для неполного маскирования символов.
301 |
302 | КонецФункции // НастройкаПолноеМаскированиеСимволов()
303 |
304 | // Функция управляющая настройкой "МаскированиеКириллицы".
305 | //
306 | // Возвращаемое значение:
307 | // Булево. Значение настройки:
308 | // - Истина - выполняется маскирование кириллических символов;
309 | // - Ложь - маскирование выполняется только согласно стандарту и дополнительно маскируются специальные символы.
310 | //
311 | // Примечание:
312 | // Маскирование специальных символов из диапазона [0x0000, 0x001f] выполняется в не зависимости от настройки.
313 | //
314 | Функция НастройкаМаскированиеКириллицы()
315 |
316 | Возврат Ложь; // Измените для маскирования кириллических символов.
317 |
318 | КонецФункции // НастройкаМаскированиеКириллицы()
319 |
320 | // Функция управляющая настройкой "НеявноеПриведениеПримитивныхЗначенийКлюча".
321 | //
322 | // Возвращаемое значение:
323 | // Булево. Значение настройки:
324 | // - Истина - выполняется неявное приведение примитивных типов значений ключей соответствий к их строковому представлению в формате 1С;
325 | // - Ложь - неявное приведение примитивных типов значений ключей соответствий к строковому представлению не выполняется.
326 | //
327 | // Примечание:
328 | // Неявно приводимые типы: Null, Булево, Число, Дата, Строка, УникальныйИдентификатор.
329 | //
330 | Функция НастройкаНеявноеПриведениеПримитивныхЗначенийКлюча()
331 |
332 | Возврат Ложь; // Измените для использования неявного приведения примитивных значений ключей соответствий к строке.
333 |
334 | КонецФункции // НастройкаНеявноеПриведениеПримитивныхЗначенийКлюча()
335 |
336 |
337 | // ─────────────────────────────────────────────────────────────────────────────
338 | // ПАРСЕР
339 |
340 | Функция jsonПрочитатьИнициализация(Значение, Знач Стандарт, Знач ПредставленияСсылок)
341 |
342 | // Проверка параметров.
343 | Если (Не Стандарт = Истина) И (Не Стандарт = Ложь) И (Не Стандарт = Неопределено) Тогда ВызватьИсключение ИсключениеНекорректныйПараметр("Стандарт"); КонецЕсли;
344 | Если (Не ПредставленияСсылок = Истина) И (Не ПредставленияСсылок = Ложь) И (Не ПредставленияСсылок = Неопределено) Тогда ВызватьИсключение ИсключениеНекорректныйПараметр("ПредставленияСсылок"); КонецЕсли;
345 |
346 | // Использование более общего случая параметров.
347 | Альтернативный = (Стандарт = Неопределено) Или (Не Стандарт); Стандарт = (Стандарт = Неопределено) Или Стандарт; ПредставленияСсылок = (ПредставленияСсылок = Неопределено) Или ПредставленияСсылок;
348 |
349 | // Схема подстановок шестнадцатиричной системы.
350 | СхемаПодстановок = Новый Соответствие; ШестнадцатиричнаяСистема = "0123456789abcdef"; ДесятичноеЧисло = 0;
351 | Для ВторойРазряд = 1 По 16 Цикл Для ПервыйРазряд = 1 По 16 Цикл СхемаПодстановок.Вставить(Сред(ШестнадцатиричнаяСистема, ВторойРазряд, 1) + Сред(ШестнадцатиричнаяСистема, ПервыйРазряд, 1), ДесятичноеЧисло); ДесятичноеЧисло = ДесятичноеЧисло + 1; КонецЦикла; КонецЦикла;
352 |
353 | // Вспомогательные данные.
354 | ВспомогательныеДанные = Новый Структура("ТипСтроки,СхемаПодстановок,АвтоматическиПриводитьКСтруктуре",
355 | Тип("Строка"),
356 | СхемаПодстановок,
357 | (НастройкаАвтоматическоеПриведениеОбъектаКСтруктуре() = Истина));
358 |
359 | // Стартовые значения.
360 | Индекс = 1; Длина = СтрДлина(Значение);
361 |
362 | // Форматирование (первый шаг парсера).
363 | Если Стандарт Тогда СимволыФорматирования = " " + Символы.ВК + Символы.ПС + Символы.Таб; jsonПрочитатьПропуститьФорматирование(Значение, Стандарт, Индекс, Длина, СимволыФорматирования); КонецЕсли;
364 | Если (Индекс > Длина) Тогда ВызватьИсключение ИсключениеПустойПакетДанных(); КонецЕсли;
365 |
366 | // Парсер.
367 | Возврат jsonПрочитать(Значение, Стандарт, Альтернативный, ПредставленияСсылок, Индекс, Длина, ВспомогательныеДанные, СимволыФорматирования, Истина);
368 |
369 | КонецФункции // jsonПрочитатьИнициализация()
370 |
371 | Функция jsonПрочитать(Значение, Стандарт, Альтернативный, ПредставленияСсылок, Индекс, Длина, ВспомогательныеДанные, СимволыФорматирования, ПервыйУровень)
372 |
373 | Символ = Сред(Значение, Индекс, 1);
374 | Если (Символ = """") Или (Символ = "'") Тогда // " , '
375 |
376 | // Строка.
377 | Подстрока = Сред(Значение, Индекс + 1); Начало = Индекс; Пока Истина Цикл
378 | Позиция = Найти(Подстрока, Символ);
379 |
380 | Если (Позиция > 0) Тогда
381 | Индекс = Индекс + Позиция; Откат = Позиция - 1; Маскировка = Ложь; Пока (Сред(Подстрока, Откат, 1) = "\") И Откат Цикл Маскировка = Не Маскировка; Откат = Откат - 1; КонецЦикла;
382 | Если Маскировка Тогда Подстрока = Сред(Подстрока, Позиция + 1); Иначе Прервать; КонецЕсли;
383 | Иначе
384 | ВызватьИсключение ИсключениеНеожиданноеОкончаниеПакетаДанных();
385 | КонецЕсли;
386 |
387 | КонецЦикла;
388 |
389 | // Строка.
390 | Результат = jsonПрочитатьСтроку(Сред(Значение, Начало + 1, Индекс - Начало - 1), Стандарт, Начало, ВспомогательныеДанные.СхемаПодстановок, (Символ = "'"));
391 |
392 | Если jsonПрочитатьОпределитьДату(Результат) Тогда
393 | // Дата.
394 | Результат = jsonПрочитатьДату(Результат, Начало);
395 | ИначеЕсли jsonПрочитатьОпределитьИдентификатор(Результат) Тогда
396 | // Идентификатор.
397 | Результат = jsonПрочитатьИдентификатор(Результат, Начало);
398 | Иначе
399 | Если Альтернативный И jsonПрочитатьОпределитьВнутреннийТип(Результат) Тогда
400 | // Внутренний тип.
401 | Результат = jsonПрочитатьВнутреннийТип(Результат, Начало);
402 | КонецЕсли;
403 | КонецЕсли;
404 |
405 | // Корректировка индекса.
406 | Индекс = Индекс + 1;
407 |
408 | ИначеЕсли (Символ = "[") Тогда // [
409 |
410 | // Массив.
411 | Результат = Новый Массив;
412 |
413 | Индекс = Индекс + 1; Если Стандарт Тогда jsonПрочитатьПропуститьФорматирование(Значение, Стандарт, Индекс, Длина, СимволыФорматирования); КонецЕсли; Если (Индекс > Длина) Тогда ВызватьИсключение ИсключениеНеожиданноеОкончаниеМассива(Длина); КонецЕсли;
414 | Символ = Сред(Значение, Индекс, 1); Если (Символ = "]") Тогда // ]
415 |
416 | // Пустой массив.
417 | Индекс = Индекс + 1;
418 |
419 | Иначе
420 |
421 | Пока (Индекс <= Длина) Цикл
422 |
423 | // Значение.
424 | Результат.Добавить(jsonПрочитать(Значение, Стандарт, Альтернативный, ПредставленияСсылок, Индекс, Длина, ВспомогательныеДанные, СимволыФорматирования, Ложь));
425 |
426 | Символ = Сред(Значение, Индекс, 1);
427 | Если (Символ = "]") Тогда // ]
428 | // Окончание массива.
429 | Индекс = Индекс + 1; Прервать;
430 | Иначе
431 | // Продолжение массива.
432 | Если (Символ = ",") Тогда // ,
433 | Индекс = Индекс + 1; Если Стандарт Тогда jsonПрочитатьПропуститьФорматирование(Значение, Стандарт, Индекс, Длина, СимволыФорматирования); КонецЕсли; Если (Индекс >= Длина) Тогда ВызватьИсключение ИсключениеНеожиданноеОкончаниеМассива(Длина); КонецЕсли;
434 | Иначе
435 | ВызватьИсключение ИсключениеНедопустимыйСимвол(Индекс, ",");
436 | КонецЕсли;
437 | КонецЕсли;
438 |
439 | КонецЦикла;
440 |
441 | КонецЕсли;
442 |
443 | ИначеЕсли (Символ = "{") Тогда // {
444 |
445 | // Объект.
446 | Индекс = Индекс + 1; Если Стандарт Тогда jsonПрочитатьПропуститьФорматирование(Значение, Стандарт, Индекс, Длина, СимволыФорматирования); КонецЕсли; Если (Индекс > Длина) Тогда ВызватьИсключение ИсключениеНеожиданноеОкончаниеМассива(Длина); КонецЕсли;
447 | Символ = Сред(Значение, Индекс, 1); Если (Символ = "}") Тогда // }
448 |
449 | // Пустой объект.
450 | Индекс = Индекс + 1;
451 |
452 | // Структура или соответствие.
453 | Если ВспомогательныеДанные.АвтоматическиПриводитьКСтруктуре Тогда Результат = Новый Структура; Иначе Результат = Новый Соответствие; КонецЕсли;
454 |
455 | Иначе
456 |
457 | Результат = Новый Соответствие;
458 |
459 | ТипСтроки = ВспомогательныеДанные.ТипСтроки; Пока (Индекс <= Длина) Цикл
460 |
461 | // Ключ.
462 | Начало = Индекс; КлючЭлемента = jsonПрочитать(Значение, Стандарт, Альтернативный, ПредставленияСсылок, Индекс, Длина, ВспомогательныеДанные, СимволыФорматирования, Ложь); Если (Не ТипЗнч(КлючЭлемента) = ТипСтроки) Тогда ВызватьИсключение ИсключениеНедопустимыйТипКлюча(Начало, КлючЭлемента); КонецЕсли;
463 |
464 | Символ = Сред(Значение, Индекс, 1);
465 | Если (Символ = ":") Тогда // :
466 | Индекс = Индекс + 1; Если Стандарт Тогда jsonПрочитатьПропуститьФорматирование(Значение, Стандарт, Индекс, Длина, СимволыФорматирования); КонецЕсли; Если (Индекс >= Длина) Тогда ВызватьИсключение ИсключениеНеожиданноеОкончаниеОбъетка(Длина); КонецЕсли;
467 | Иначе
468 | ВызватьИсключение ИсключениеНедопустимыйСимвол(Индекс, ":");
469 | КонецЕсли;
470 |
471 | // Значение.
472 | ЗначениеЭлемента = jsonПрочитать(Значение, Стандарт, Альтернативный, ПредставленияСсылок, Индекс, Длина, ВспомогательныеДанные, СимволыФорматирования, Ложь);
473 |
474 | // Коллекция.
475 | Результат.Вставить(КлючЭлемента, ЗначениеЭлемента);
476 |
477 | Символ = Сред(Значение, Индекс, 1);
478 | Если (Символ = "}") Тогда // }
479 | // Окончание объекта.
480 | Индекс = Индекс + 1; Прервать;
481 | Иначе
482 | // Продолжение объекта.
483 | Если (Символ = ",") Тогда // ,
484 | Индекс = Индекс + 1; Если Стандарт Тогда jsonПрочитатьПропуститьФорматирование(Значение, Стандарт, Индекс, Длина, СимволыФорматирования); КонецЕсли; Если (Индекс >= Длина) Тогда ВызватьИсключение ИсключениеНеожиданноеОкончаниеОбъетка(Длина); КонецЕсли;
485 | Иначе
486 | ВызватьИсключение ИсключениеНедопустимыйСимвол(Индекс, ",");
487 | КонецЕсли;
488 | КонецЕсли;
489 |
490 | КонецЦикла;
491 |
492 | // Структура или соответствие.
493 | Если ВспомогательныеДанные.АвтоматическиПриводитьКСтруктуре Тогда
494 |
495 | РезультатСтруктура = Новый Структура;
496 | Для Каждого Элемент Из Результат Цикл Попытка РезультатСтруктура.Вставить(Элемент.Ключ, Элемент.Значение); Исключение РезультатСтруктура = Результат; АвтоматическоеПриведениеНеВыполнено = Истина; Прервать; КонецПопытки; КонецЦикла;
497 | Результат = РезультатСтруктура;
498 |
499 | // Ссылка.
500 | Если ПредставленияСсылок Тогда Результат = jsonПрочитатьСсылку(Результат, (АвтоматическоеПриведениеНеВыполнено = Истина)); КонецЕсли;
501 |
502 | Иначе
503 |
504 | // Ссылка.
505 | Если ПредставленияСсылок Тогда Результат = jsonПрочитатьСсылку(Результат, Истина); КонецЕсли;
506 |
507 | КонецЕсли;
508 |
509 | КонецЕсли;
510 |
511 | Иначе
512 |
513 | // Остальные примитивные типы.
514 | Если (Символ = "n") Тогда
515 |
516 | // Null.
517 | Если (Сред(Значение, Индекс, 4) = "null") Тогда Индекс = Индекс + 4; Результат = Null; Иначе ВызватьИсключение ИсключениеНекорректныйТипNull(Индекс); КонецЕсли;
518 |
519 | ИначеЕсли (Символ = "t") Тогда
520 |
521 | // Истина.
522 | Если (Сред(Значение, Индекс, 4) = "true") Тогда Индекс = Индекс + 4; Результат = Истина; Иначе ВызватьИсключение ИсключениеНекорректныйТипБулево(Индекс); КонецЕсли;
523 |
524 | ИначеЕсли (Символ = "f") Тогда
525 |
526 | // Ложь.
527 | Если (Сред(Значение, Индекс, 5) = "false") Тогда Индекс = Индекс + 5; Результат = Ложь; Иначе ВызватьИсключение ИсключениеНекорректныйТипБулево(Индекс); КонецЕсли;
528 |
529 | ИначеЕсли (Символ = "u") Тогда
530 |
531 | // Неопределено.
532 | Если (Сред(Значение, Индекс, 9) = "undefined") Тогда Индекс = Индекс + 9; Результат = Неопределено; Иначе ВызватьИсключение ИсключениеНекорректныйТипНеопределено(Индекс); КонецЕсли;
533 |
534 | Иначе
535 |
536 | // Число.
537 | Начало = Индекс; Пока Найти("-+0123456789.", Символ) И (Индекс <= Длина) Цикл Индекс = Индекс + 1; Символ = Сред(Значение, Индекс, 1); КонецЦикла;
538 |
539 | // Преобразование числа.
540 | Попытка
541 | Результат = Число(Сред(Значение, Начало, Индекс - Начало));
542 | Исключение
543 | ВызватьИсключение ИсключениеНекорректныйФорматЧисла(Начало, Сред(Значение, Начало, Индекс - Начало));
544 | КонецПопытки;
545 |
546 | // Экспоненциальная часть.
547 | Если (Символ = "E") Или (Символ = "e") Тогда
548 |
549 | // Степень.
550 | Индекс = Индекс + 1; Позиция = Индекс; Символ = Сред(Значение, Индекс, 1); Пока Найти("-+0123456789", Символ) И (Индекс <= Длина) Цикл Индекс = Индекс + 1; Символ = Сред(Значение, Индекс, 1); КонецЦикла;
551 |
552 | // Преобразование степени.
553 | Попытка
554 | Степень = Число(Сред(Значение, Позиция, Индекс - Позиция));
555 | Исключение
556 | ВызватьИсключение ИсключениеНекорректныйФорматЧисла(Начало, Сред(Значение, Начало, Индекс - Начало));
557 | КонецПопытки;
558 |
559 | // Возвидение числа в степень.
560 | Результат = Результат * Pow(10, Степень);
561 |
562 | КонецЕсли;
563 |
564 | КонецЕсли;
565 |
566 | КонецЕсли;
567 |
568 | // Форматирование.
569 | Если Стандарт Тогда jsonПрочитатьПропуститьФорматирование(Значение, Стандарт, Индекс, Длина, СимволыФорматирования); КонецЕсли; Если ПервыйУровень Тогда Если (Индекс <= Длина) Тогда ВызватьИсключение ИсключениеНекорректныйПакетДанных(Индекс); КонецЕсли; Иначе Если (Индекс > Длина) Тогда ВызватьИсключение ИсключениеНеожиданноеОкончаниеПакетаДанных(); КонецЕсли; КонецЕсли;
570 |
571 | Возврат Результат;
572 |
573 | КонецФункции // jsonПрочитать()
574 |
575 | Функция jsonПрочитатьОпределитьДату(Значение)
576 |
577 | // Проверка.
578 | Если (СтрДлина(Значение) = 20) Тогда
579 | Если (Сред(Значение, 05, 1) = "-") И // -
580 | (Сред(Значение, 08, 1) = "-") И // -
581 | (Сред(Значение, 11, 1) = "T") И // T
582 | (Сред(Значение, 14, 1) = ":") И // :
583 | (Сред(Значение, 17, 1) = ":") И // :
584 | (Сред(Значение, 20, 1) = "Z") Тогда // Z
585 | // Год.
586 | Если Найти("0123456789", Сред(Значение, 01, 1)) И
587 | Найти("0123456789", Сред(Значение, 02, 1)) И
588 | Найти("0123456789", Сред(Значение, 03, 1)) И
589 | Найти("0123456789", Сред(Значение, 04, 1)) И
590 | // Месяц.
591 | Найти("0123456789", Сред(Значение, 06, 1)) И
592 | Найти("0123456789", Сред(Значение, 07, 1)) И
593 | // День.
594 | Найти("0123456789", Сред(Значение, 09, 1)) И
595 | Найти("0123456789", Сред(Значение, 10, 1)) И
596 | // Час.
597 | Найти("0123456789", Сред(Значение, 12, 1)) И
598 | Найти("0123456789", Сред(Значение, 13, 1)) И
599 | // Минута.
600 | Найти("0123456789", Сред(Значение, 15, 1)) И
601 | Найти("0123456789", Сред(Значение, 16, 1)) И
602 | // Секунда.
603 | Найти("0123456789", Сред(Значение, 18, 1)) И
604 | Найти("0123456789", Сред(Значение, 19, 1)) Тогда
605 | Возврат Истина;
606 | КонецЕсли;
607 | КонецЕсли;
608 | КонецЕсли;
609 |
610 | Возврат Ложь;
611 |
612 | КонецФункции // jsonПрочитатьОпределитьДату()
613 |
614 | Функция jsonПрочитатьОпределитьИдентификатор(Значение)
615 |
616 | // Проверка.
617 | Если (СтрДлина(Значение) = 36) Тогда
618 | Если (Сред(Значение, 09, 1) = "-") И // -
619 | (Сред(Значение, 14, 1) = "-") И // -
620 | (Сред(Значение, 19, 1) = "-") И // -
621 | (Сред(Значение, 24, 1) = "-") Тогда // -
622 | // Первая часть.
623 | Для Индекс = 01 По 08 Цикл Если Не Найти("0123456789ABCDEFabcdef", Сред(Значение, Индекс, 1)) Тогда Возврат Ложь; КонецЕсли; КонецЦикла;
624 | // Вторая часть.
625 | Для Индекс = 10 По 13 Цикл Если Не Найти("0123456789ABCDEFabcdef", Сред(Значение, Индекс, 1)) Тогда Возврат Ложь; КонецЕсли; КонецЦикла;
626 | // Третья часть.
627 | Для Индекс = 15 По 18 Цикл Если Не Найти("0123456789ABCDEFabcdef", Сред(Значение, Индекс, 1)) Тогда Возврат Ложь; КонецЕсли; КонецЦикла;
628 | // Четвертая часть.
629 | Для Индекс = 20 По 23 Цикл Если Не Найти("0123456789ABCDEFabcdef", Сред(Значение, Индекс, 1)) Тогда Возврат Ложь; КонецЕсли; КонецЦикла;
630 | // Пятая часть.
631 | Для Индекс = 25 По 36 Цикл Если Не Найти("0123456789ABCDEFabcdef", Сред(Значение, Индекс, 1)) Тогда Возврат Ложь; КонецЕсли; КонецЦикла;
632 | Возврат Истина;
633 | КонецЕсли;
634 | КонецЕсли;
635 |
636 | Возврат Ложь;
637 |
638 | КонецФункции // jsonПрочитатьОпределитьИдентификатор()
639 |
640 | Функция jsonПрочитатьОпределитьВнутреннийТип(Значение)
641 |
642 | // Поиск.
643 | Возврат (Лев(Значение, 1) = "¦") И (Сред(Значение, 5, 1) = "¦") И (Прав(Значение, 1) = "¦"); // ¦xxx¦ ... ¦
644 |
645 | КонецФункции // jsonПрочитатьОпределитьВнутреннийТип()
646 |
647 | Функция jsonПрочитатьСтроку(Значение, Стандарт, Индекс, СхемаПодстановок, ОдинарнаяКавычка)
648 |
649 | // Последоавтельность перемаскировки.
650 | ПоследоавтельностьПеремаскировки = "\" + Символ(65535);
651 |
652 | // Демаскирование служебных символов.
653 | Результат = СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(Значение,
654 | "\\", ПоследоавтельностьПеремаскировки), // Перемаскирование последовательности.
655 | "\/", "/"), // x2f
656 | "\b", Символ(008)), // x08
657 | "\t", Символы.Таб), // x09
658 | "\n", Символы.ПС), // x0a
659 | "\f", Символы.ПФ), // x0c
660 | "\r", Символы.ВК), // x0d
661 | "\""", """"); // x22
662 |
663 | // Демаскирование Юникод символов.
664 | Позиция = Найти(Результат, "\u"); Пока Позиция Цикл
665 | СтаршийБайт = СхемаПодстановок[НРег(Сред(Результат, Позиция + 2, 2))]; МладшийБайт = СхемаПодстановок[НРег(Сред(Результат, Позиция + 4, 2))]; Если (СтаршийБайт = Неопределено) Или (МладшийБайт = Неопределено) Тогда ВызватьИсключение ИсключениеНекорректныйФорматСтроки(Индекс); КонецЕсли;
666 | Результат = СтрЗаменить(Результат, Сред(Результат, Позиция, 6), Символ(256 * СтаршийБайт + МладшийБайт)); Позиция = Найти(Результат, "\u");
667 | КонецЦикла;
668 |
669 | // Одинарная кавычка.
670 | Если ОдинарнаяКавычка Тогда Результат = СтрЗаменить(Результат, "\'", "'"); КонецЕсли;
671 |
672 | // Демаскирование перемаскированой последовательности.
673 | Возврат СтрЗаменить(Результат, ПоследоавтельностьПеремаскировки, "\");
674 |
675 | КонецФункции // jsonПрочитатьСтроку()
676 |
677 | Функция jsonПрочитатьДату(Значение, Индекс)
678 |
679 | // Поиск.
680 | Попытка
681 | Возврат Дата(Лев(Значение, 4) + Сред(Значение, 06, 2) + Сред(Значение, 09, 2) +
682 | Сред(Значение, 12, 2) + Сред(Значение, 15, 2) + Сред(Значение, 18, 2));
683 | Исключение
684 | ВызватьИсключение ИсключениеНекорректныйФорматДаты(Индекс, Значение);
685 | КонецПопытки;
686 |
687 | КонецФункции // jsonПрочитатьДату()
688 |
689 | Функция jsonПрочитатьСсылку(Значение, Соответствие)
690 |
691 | Перем Ссылка;
692 |
693 | // Ссылка.
694 | Если (Значение.Количество() = 2) Тогда
695 | Если Соответствие Тогда
696 | Ссылка = Значение.Получить("Ссылка"); Если (Не Ссылка = Неопределено) И (Не Значение.Получить("Представление") = Неопределено) Тогда Возврат Ссылка; КонецЕсли;
697 | Иначе
698 | Если Значение.Свойство("Представление") И Значение.Свойство("Ссылка", Ссылка) Тогда Возврат Ссылка; КонецЕсли;
699 | КонецЕсли;
700 | КонецЕсли;
701 |
702 | Возврат Значение;
703 |
704 | КонецФункции // jsonПрочитатьСсылку()
705 |
706 | Функция jsonПрочитатьИдентификатор(Значение, Индекс)
707 |
708 | // Поиск.
709 | Возврат Новый УникальныйИдентификатор(Значение);
710 |
711 | КонецФункции // jsonПрочитатьИдентификатор()
712 |
713 | Функция jsonПрочитатьВнутреннийТип(Значение, Индекс)
714 | #Если ВебКлиент Или ТонкийКлиент Тогда
715 | ВызватьИсключение ИсключениеНевозможноПреобразоватьЗначениеНаКлиенте(Индекс, Значение);
716 | #Иначе
717 |
718 | // Поиск.
719 | Тип = Сред(Значение, 2, 3); Данные = Сред(Значение, 6, СтрДлина(Значение) - 6);
720 |
721 | Если (Тип = "ref") Тогда
722 | Попытка
723 | Возврат ЗначениеИзСтрокиВнутр("{""#""," + СтрЗаменить(СтрЗаменить(Данные, "×", ":"), "÷", ",") + "}");
724 | Исключение
725 | ВызватьИсключение ИсключениеНевозможноПреобразоватьЗначение(Индекс, Значение);
726 | КонецПопытки;
727 | КонецЕсли;
728 |
729 | ВызватьИсключение ИсключениеНеопознанныйТип(Индекс, Тип);
730 |
731 | #КонецЕсли
732 | КонецФункции // jsonПрочитатьВнутреннийТип()
733 |
734 | Процедура jsonПрочитатьПропуститьФорматирование(Значение, Стандарт, Индекс, Длина, СимволыФорматирования)
735 |
736 | // Пропуск форматирования.
737 | Пока (Индекс <= Длина) И Найти(СимволыФорматирования, Сред(Значение, Индекс, 1)) Цикл Индекс = Индекс + 1; КонецЦикла;
738 | // Пробел его не видно, \r, \n, \t .
739 |
740 | КонецПроцедуры // jsonПрочитатьПропуститьФорматирование()
741 |
742 |
743 | // ─────────────────────────────────────────────────────────────────────────────
744 | // СЕРИАЛИЗАТОР
745 |
746 | Функция jsonЗаписатьИнициализация(Значение, Знач Стандарт, Знач ПредставленияСсылок)
747 |
748 | // Проверка параметров.
749 | Если (Не Стандарт = Истина) И (Не Стандарт = Ложь) Тогда ВызватьИсключение ИсключениеНекорректныйПараметр("Стандарт"); КонецЕсли;
750 | Если (Не ПредставленияСсылок = Истина) И (Не ПредставленияСсылок = Ложь) Тогда ВызватьИсключение ИсключениеНекорректныйПараметр("ПредставленияСсылок"); КонецЕсли;
751 |
752 | ВспомогательныеДанные = Новый Структура("ПримитивныеТипы,Массивы,Структуры,Соответсвия,Построители,КлиентскиеТипы,ТипДопустимыхКлючей",
753 | Новый ОписаниеТипов("Null,Булево,Число,Дата,УникальныйИдентификатор"), // ПримитивныеТипы.
754 | #Если ВебКлиент Или ТонкийКлиент Тогда
755 | Новый ОписаниеТипов("Массив,ФиксированныйМассив"), // Массивы.
756 | Новый ОписаниеТипов("Структура,ФиксированнаяСтруктура"), // Структуры.
757 | Новый ОписаниеТипов("Структура,ФиксированнаяСтруктура,Соответствие,ФиксированноеСоответствие"), // Соответсвия.
758 | #Иначе
759 | #Если НаСервере Тогда
760 | Новый ОписаниеТипов("Массив,ФиксированныйМассив,ФиксированнаяКоллекция"), // Массивы.
761 | Новый ОписаниеТипов("Структура,ФиксированнаяСтруктура"), // Структуры.
762 | Новый ОписаниеТипов("Структура,ФиксированнаяСтруктура,Соответствие,ФиксированноеСоответствие"), // Соответсвия.
763 | #Иначе
764 | Новый ОписаниеТипов("Массив,ФиксированныйМассив"), // Массивы.
765 | Новый ОписаниеТипов("Структура"), // Структуры.
766 | Новый ОписаниеТипов("Структура,Соответствие"), // Соответсвия.
767 | #КонецЕсли
768 | #КонецЕсли
769 | #Если ВебКлиент Или ТонкийКлиент Тогда
770 | Неопределено, // Построители.
771 | #Иначе
772 | Новый ОписаниеТипов("ПостроительЗапроса,ПостроительОтчета"), // Построители.
773 | #КонецЕсли
774 | #Если НаСервере Тогда
775 | Новый ОписаниеТипов("ДанныеФормыКоллекция,ДанныеФормыСтруктураСКоллекцией,ДанныеФормыДерево"), // КлиентскиеТипы.
776 | #Иначе
777 | Неопределено, // КлиентскиеТипы.
778 | #КонецЕсли
779 | Новый ОписаниеТипов("Строка")); // ТипДопустимыхКлючей.
780 |
781 | // Типы допустимых ключей.
782 | Если (НастройкаНеявноеПриведениеПримитивныхЗначенийКлюча() = Истина) Тогда ВспомогательныеДанные.ТипДопустимыхКлючей = Новый ОписаниеТипов("Null,Булево,Число,Дата,Строка,УникальныйИдентификатор"); КонецЕсли;
783 |
784 | // форматирование.
785 | Если Стандарт Тогда Смещение = ""; Отступ = " "; Табуляция = " "; ПереносСтроки = Символы.ПС; Иначе Смещение = ""; Отступ = ""; Табуляция = ""; ПереносСтроки = ""; КонецЕсли;
786 |
787 | // Сериализация.
788 | Возврат jsonЗаписать(Значение, Стандарт, ПредставленияСсылок, ВспомогательныеДанные, Неопределено, Смещение, Отступ, Табуляция, ПереносСтроки, (НастройкаПолноеМаскированиеСимволов() = Истина), (НастройкаМаскированиеКириллицы() = Истина));
789 |
790 | КонецФункции // jsonЗаписатьИнициализация()
791 |
792 | Функция jsonЗаписать(Значение, Стандарт, ПредставленияСсылок, ВспомогательныеДанные, Колонки, Смещение, Отступ, Табуляция, ПереносСтроки, ПолноеМаскированиеСимволов, МаскированиеКириллицы)
793 |
794 | // Определение типа.
795 | Тип = ТипЗнч(Значение);
796 |
797 | // Строка.
798 | Если (Тип = Тип("Строка")) Тогда Возврат jsonЗаписатьСтроку(Значение, ПолноеМаскированиеСимволов, МаскированиеКириллицы); КонецЕсли;
799 |
800 | // Неопределено и примитивные типы.
801 | Если ВспомогательныеДанные.ПримитивныеТипы.СодержитТип(Тип) Тогда
802 | #Если ВебКлиент Или ТонкийКлиент Тогда
803 | Если (Значение = Null) Или (Значение = Неопределено) Тогда Возврат "null"; ИначеЕсли (Тип = Тип("Дата")) Тогда Возврат """" + Формат(Значение, "ДФ=yyyy-MM-ddTHH:mm:ss; ДП=") + "Z""" ИначеЕсли (Тип = Тип("УникальныйИдентификатор")) Тогда Возврат """" + Значение + """"; Иначе Возврат Формат(Значение, "ЧРД=.; ЧН=; ЧГ=; БЛ=false; БИ=true"); КонецЕсли;
804 | #Иначе
805 | Если (Значение = Null) Или (Значение = Неопределено) Тогда Возврат "null"; ИначеЕсли (Тип = Тип("Дата")) Тогда Возврат """" + XMLСтрока(Значение) + "Z""" ИначеЕсли (Тип = Тип("УникальныйИдентификатор")) Тогда Возврат """" + XMLСтрока(Значение) + """"; Иначе Возврат XMLСтрока(Значение); КонецЕсли;
806 | #КонецЕсли
807 | КонецЕсли;
808 |
809 | // Структуры и строка дерева значений (структурой).
810 | Если ВспомогательныеДанные.Структуры.СодержитТип(Тип) Тогда
811 | Если Значение.Количество() Тогда
812 |
813 | // форматирование.
814 | СледующееСмещение = Смещение + Табуляция;
815 |
816 | Если (Колонки = Неопределено) Тогда
817 |
818 | // Структуры.
819 | Если МаскированиеКириллицы Тогда
820 |
821 | Первый = Истина; Для Каждого Элемент Из Значение Цикл
822 | Если Первый Тогда
823 | Результат = ПереносСтроки + СледующееСмещение + jsonЗаписатьСтроку(Элемент.Ключ, ПолноеМаскированиеСимволов, МаскированиеКириллицы) + ":" + Отступ + jsonЗаписать(Элемент.Значение, Стандарт, ПредставленияСсылок, ВспомогательныеДанные, Неопределено, СледующееСмещение, Отступ, Табуляция, ПереносСтроки, ПолноеМаскированиеСимволов, МаскированиеКириллицы); Первый = Ложь;
824 | Иначе
825 | Результат = Результат + "," + ПереносСтроки + СледующееСмещение + jsonЗаписатьСтроку(Элемент.Ключ, ПолноеМаскированиеСимволов, МаскированиеКириллицы) + ":" + Отступ + jsonЗаписать(Элемент.Значение, Стандарт, ПредставленияСсылок, ВспомогательныеДанные, Неопределено, СледующееСмещение, Отступ, Табуляция, ПереносСтроки, ПолноеМаскированиеСимволов, МаскированиеКириллицы);
826 | КонецЕсли;
827 | КонецЦикла;
828 |
829 | Иначе
830 |
831 | Первый = Истина; Для Каждого Элемент Из Значение Цикл
832 | Если Первый Тогда
833 | Результат = ПереносСтроки + СледующееСмещение + """" + Элемент.Ключ + """:" + Отступ + jsonЗаписать(Элемент.Значение, Стандарт, ПредставленияСсылок, ВспомогательныеДанные, Неопределено, СледующееСмещение, Отступ, Табуляция, ПереносСтроки, ПолноеМаскированиеСимволов, МаскированиеКириллицы); Первый = Ложь;
834 | Иначе
835 | Результат = Результат + "," + ПереносСтроки + СледующееСмещение + """" + Элемент.Ключ + """:" + Отступ + jsonЗаписать(Элемент.Значение, Стандарт, ПредставленияСсылок, ВспомогательныеДанные, Неопределено, СледующееСмещение, Отступ, Табуляция, ПереносСтроки, ПолноеМаскированиеСимволов, МаскированиеКириллицы);
836 | КонецЕсли;
837 | КонецЦикла;
838 |
839 | КонецЕсли;
840 |
841 | Иначе
842 |
843 | // Строка дерева значений (структурой).
844 | Если МаскированиеКириллицы Тогда
845 |
846 | Первый = Истина; Для Каждого Элемент Из Значение Цикл
847 | Если (Элемент.Ключ = "Строки") Тогда Продолжить; КонецЕсли;
848 | Если Первый Тогда
849 | Результат = ПереносСтроки + СледующееСмещение + jsonЗаписатьСтроку(Элемент.Ключ, ПолноеМаскированиеСимволов, МаскированиеКириллицы) + ":" + Отступ + jsonЗаписать(Элемент.Значение, Стандарт, ПредставленияСсылок, ВспомогательныеДанные, Неопределено, СледующееСмещение, Отступ, Табуляция, ПереносСтроки, ПолноеМаскированиеСимволов, МаскированиеКириллицы); Первый = Ложь;
850 | Иначе
851 | Результат = Результат + "," + ПереносСтроки + СледующееСмещение + jsonЗаписатьСтроку(Элемент.Ключ, ПолноеМаскированиеСимволов, МаскированиеКириллицы) + ":" + Отступ + jsonЗаписать(Элемент.Значение, Стандарт, ПредставленияСсылок, ВспомогательныеДанные, Неопределено, СледующееСмещение, Отступ, Табуляция, ПереносСтроки, ПолноеМаскированиеСимволов, МаскированиеКириллицы);
852 | КонецЕсли;
853 | КонецЦикла;
854 | Если Первый Тогда
855 | Результат = ПереносСтроки + СледующееСмещение + """\u0421\u0442\u0440\u043e\u043a\u0438"":" + Отступ + jsonЗаписать(Значение.Строки, Стандарт, ПредставленияСсылок, ВспомогательныеДанные, Колонки, СледующееСмещение, Отступ, Табуляция, ПереносСтроки, ПолноеМаскированиеСимволов, МаскированиеКириллицы);
856 | Иначе
857 | Результат = Результат + "," + ПереносСтроки + СледующееСмещение + """\u0421\u0442\u0440\u043e\u043a\u0438"":" + Отступ + jsonЗаписать(Значение.Строки, Стандарт, ПредставленияСсылок, ВспомогательныеДанные, Колонки, СледующееСмещение, Отступ, Табуляция, ПереносСтроки, ПолноеМаскированиеСимволов, МаскированиеКириллицы);
858 | КонецЕсли;
859 |
860 | Иначе
861 |
862 | Первый = Истина; Для Каждого Элемент Из Значение Цикл
863 | Если (Элемент.Ключ = "Строки") Тогда Продолжить; КонецЕсли;
864 | Если Первый Тогда
865 | Результат = ПереносСтроки + СледующееСмещение + """" + Элемент.Ключ + """:" + Отступ + jsonЗаписать(Элемент.Значение, Стандарт, ПредставленияСсылок, ВспомогательныеДанные, Неопределено, СледующееСмещение, Отступ, Табуляция, ПереносСтроки, ПолноеМаскированиеСимволов, МаскированиеКириллицы); Первый = Ложь;
866 | Иначе
867 | Результат = Результат + "," + ПереносСтроки + СледующееСмещение + """" + Элемент.Ключ + """:" + Отступ + jsonЗаписать(Элемент.Значение, Стандарт, ПредставленияСсылок, ВспомогательныеДанные, Неопределено, СледующееСмещение, Отступ, Табуляция, ПереносСтроки, ПолноеМаскированиеСимволов, МаскированиеКириллицы);
868 | КонецЕсли;
869 | КонецЦикла;
870 | Если Первый Тогда
871 | Результат = ПереносСтроки + СледующееСмещение + """Строки"":" + Отступ + jsonЗаписать(Значение.Строки, Стандарт, ПредставленияСсылок, ВспомогательныеДанные, Колонки, СледующееСмещение, Отступ, Табуляция, ПереносСтроки, ПолноеМаскированиеСимволов, МаскированиеКириллицы);
872 | Иначе
873 | Результат = Результат + "," + ПереносСтроки + СледующееСмещение + """Строки"":" + Отступ + jsonЗаписать(Значение.Строки, Стандарт, ПредставленияСсылок, ВспомогательныеДанные, Колонки, СледующееСмещение, Отступ, Табуляция, ПереносСтроки, ПолноеМаскированиеСимволов, МаскированиеКириллицы);
874 | КонецЕсли;
875 |
876 | КонецЕсли;
877 |
878 | КонецЕсли;
879 | Возврат "{" + Результат + ПереносСтроки + Смещение + "}";
880 |
881 | Иначе
882 |
883 | // Пустая структура.
884 | Возврат "{}";
885 |
886 | КонецЕсли;
887 | КонецЕсли;
888 |
889 | // Соответсвия.
890 | Если ВспомогательныеДанные.Соответсвия.СодержитТип(Тип) Тогда
891 | Если Значение.Количество() Тогда
892 |
893 | // форматирование.
894 | СледующееСмещение = Смещение + Табуляция;
895 |
896 | // Соответсвия.
897 | ТипДопустимыхКлючей = ВспомогательныеДанные.ТипДопустимыхКлючей;
898 |
899 | Если МаскированиеКириллицы Тогда
900 |
901 | Первый = Истина; Для Каждого Элемент Из Значение Цикл
902 | Ключ = Элемент.Ключ; Если ТипДопустимыхКлючей.СодержитТип(ТипЗнч(Ключ)) Тогда Ключ = jsonЗаписатьСтроку(Строка(Ключ), ПолноеМаскированиеСимволов, МаскированиеКириллицы); Иначе ВызватьИсключение ИсключениеНедопустимыйТипКлюча(Неопределено, Ключ); КонецЕсли;
903 | Если Первый Тогда
904 | Результат = ПереносСтроки + СледующееСмещение + Ключ + ":" + Отступ + jsonЗаписать(Элемент.Значение, Стандарт, ПредставленияСсылок, ВспомогательныеДанные, Неопределено, СледующееСмещение, Отступ, Табуляция, ПереносСтроки, ПолноеМаскированиеСимволов, МаскированиеКириллицы); Первый = Ложь;
905 | Иначе
906 | Результат = Результат + "," + ПереносСтроки + СледующееСмещение + Ключ + ":" + Отступ + jsonЗаписать(Элемент.Значение, Стандарт, ПредставленияСсылок, ВспомогательныеДанные, Неопределено, СледующееСмещение, Отступ, Табуляция, ПереносСтроки, ПолноеМаскированиеСимволов, МаскированиеКириллицы);
907 | КонецЕсли;
908 | КонецЦикла;
909 |
910 | Иначе
911 |
912 | Первый = Истина; Для Каждого Элемент Из Значение Цикл
913 | Ключ = Элемент.Ключ; Тип = ТипЗнч(Ключ); Если (Тип = Тип("Строка")) Тогда Ключ = jsonЗаписатьСтроку(Ключ, ПолноеМаскированиеСимволов, МаскированиеКириллицы); ИначеЕсли ТипДопустимыхКлючей.СодержитТип(Тип) Тогда Ключ = """" + Ключ + """"; Иначе ВызватьИсключение ИсключениеНедопустимыйТипКлюча(Неопределено, Ключ); КонецЕсли;
914 | Если Первый Тогда
915 | Результат = ПереносСтроки + СледующееСмещение + Ключ + ":" + Отступ + jsonЗаписать(Элемент.Значение, Стандарт, ПредставленияСсылок, ВспомогательныеДанные, Неопределено, СледующееСмещение, Отступ, Табуляция, ПереносСтроки, ПолноеМаскированиеСимволов, МаскированиеКириллицы); Первый = Ложь;
916 | Иначе
917 | Результат = Результат + "," + ПереносСтроки + СледующееСмещение + Ключ + ":" + Отступ + jsonЗаписать(Элемент.Значение, Стандарт, ПредставленияСсылок, ВспомогательныеДанные, Неопределено, СледующееСмещение, Отступ, Табуляция, ПереносСтроки, ПолноеМаскированиеСимволов, МаскированиеКириллицы);
918 | КонецЕсли;
919 | КонецЦикла;
920 |
921 | КонецЕсли;
922 | Возврат "{" + Результат + ПереносСтроки + Смещение + "}";
923 |
924 | Иначе
925 |
926 | // Пустое соответсвие.
927 | Возврат "{}";
928 |
929 | КонецЕсли;
930 | КонецЕсли;
931 |
932 | // Массивы.
933 | Если ВспомогательныеДанные.Массивы.СодержитТип(Тип) Тогда
934 | Если Значение.Количество() Тогда
935 |
936 | // форматирование.
937 | СледующееСмещение = Смещение + Табуляция;
938 |
939 | Первый = Истина; Для Каждого Элемент Из Значение Цикл
940 | Если Первый Тогда
941 | Результат = ПереносСтроки + СледующееСмещение + jsonЗаписать(Элемент, Стандарт, ПредставленияСсылок, ВспомогательныеДанные, Неопределено, СледующееСмещение, Отступ, Табуляция, ПереносСтроки, ПолноеМаскированиеСимволов, МаскированиеКириллицы); Первый = Ложь;
942 | Иначе
943 | Результат = Результат + "," + ПереносСтроки + СледующееСмещение + jsonЗаписать(Элемент, Стандарт, ПредставленияСсылок, ВспомогательныеДанные, Неопределено, СледующееСмещение, Отступ, Табуляция, ПереносСтроки, ПолноеМаскированиеСимволов, МаскированиеКириллицы);
944 | КонецЕсли;
945 | КонецЦикла;
946 |
947 | Возврат "[" + Результат + ПереносСтроки + Смещение + "]";
948 |
949 | Иначе
950 |
951 | // Пустой массив.
952 | Возврат "[]";
953 |
954 | КонецЕсли;
955 | КонецЕсли;
956 |
957 | // Список значений.
958 | Если (Тип = Тип("СписокЗначений")) Тогда
959 | Если Значение.Количество() Тогда
960 |
961 | // форматирование.
962 | СледующееСмещение = Смещение + Табуляция;
963 |
964 | Структура = Новый Структура("Значение,Представление,Пометка");
965 | Первый = Истина; Для Каждого Элемент Из Значение Цикл
966 | ЗаполнитьЗначенияСвойств(Структура, Элемент);
967 | Если Первый Тогда
968 | Результат = ПереносСтроки + СледующееСмещение + jsonЗаписать(Структура, Стандарт, ПредставленияСсылок, ВспомогательныеДанные, Неопределено, СледующееСмещение, Отступ, Табуляция, ПереносСтроки, ПолноеМаскированиеСимволов, МаскированиеКириллицы); Первый = Ложь;
969 | Иначе
970 | Результат = Результат + "," + ПереносСтроки + СледующееСмещение + jsonЗаписать(Структура, Стандарт, ПредставленияСсылок, ВспомогательныеДанные, Неопределено, СледующееСмещение, Отступ, Табуляция, ПереносСтроки, ПолноеМаскированиеСимволов, МаскированиеКириллицы);
971 | КонецЕсли;
972 | КонецЦикла;
973 |
974 | Возврат "[" + Результат + ПереносСтроки + Смещение + "]";
975 |
976 | Иначе
977 |
978 | // Пустой список значений.
979 | Возврат "[]";
980 |
981 | КонецЕсли;
982 | КонецЕсли;
983 |
984 | // Таблица значений.
985 | #Если ВебКлиент Или ТонкийКлиент Тогда
986 | #Иначе
987 | Если (Тип = Тип("ТаблицаЗначений")) Тогда
988 | Если Значение.Количество() Тогда
989 |
990 | // форматирование.
991 | СледующееСмещение = Смещение + Табуляция;
992 |
993 | Структура = Новый Структура; НаборКолонок = Значение.Колонки; Для Каждого Колонка Из НаборКолонок Цикл Структура.Вставить(Колонка.Имя); КонецЦикла;
994 |
995 | Первый = Истина; Для Каждого Элемент Из Значение Цикл
996 | ЗаполнитьЗначенияСвойств(Структура, Элемент);
997 | Если Первый Тогда
998 | Результат = ПереносСтроки + СледующееСмещение + jsonЗаписать(Структура, Стандарт, ПредставленияСсылок, ВспомогательныеДанные, Неопределено, СледующееСмещение, Отступ, Табуляция, ПереносСтроки, ПолноеМаскированиеСимволов, МаскированиеКириллицы); Первый = Ложь;
999 | Иначе
1000 | Результат = Результат + "," + ПереносСтроки + СледующееСмещение + jsonЗаписать(Структура, Стандарт, ПредставленияСсылок, ВспомогательныеДанные, Неопределено, СледующееСмещение, Отступ, Табуляция, ПереносСтроки, ПолноеМаскированиеСимволов, МаскированиеКириллицы);
1001 | КонецЕсли;
1002 | КонецЦикла;
1003 | Возврат "[" + Результат + ПереносСтроки + Смещение + "]";
1004 |
1005 | Иначе
1006 |
1007 | // Пустая таблица значений.
1008 | Возврат "[]";
1009 |
1010 | КонецЕсли;
1011 | КонецЕсли;
1012 |
1013 | // Коллекция строк дерева значений.
1014 | Если (Тип = Тип("КоллекцияСтрокДереваЗначений")) Тогда
1015 | Если Значение.Количество() Тогда
1016 |
1017 | // форматирование.
1018 | СледующееСмещение = Смещение + Табуляция;
1019 |
1020 | Структура = Колонки; Первый = Истина; Для Каждого Элемент Из Значение Цикл
1021 | ЗаполнитьЗначенияСвойств(Структура, Элемент); Структура.Строки = Элемент.Строки;
1022 | Если Первый Тогда
1023 | Результат = ПереносСтроки + СледующееСмещение + jsonЗаписать(Структура, Стандарт, ПредставленияСсылок, ВспомогательныеДанные, Колонки, СледующееСмещение, Отступ, Табуляция, ПереносСтроки, ПолноеМаскированиеСимволов, МаскированиеКириллицы); Первый = Ложь;
1024 | Иначе
1025 | Результат = Результат + "," + ПереносСтроки + СледующееСмещение + jsonЗаписать(Структура, Стандарт, ПредставленияСсылок, ВспомогательныеДанные, Колонки, СледующееСмещение, Отступ, Табуляция, ПереносСтроки, ПолноеМаскированиеСимволов, МаскированиеКириллицы);
1026 | КонецЕсли;
1027 | КонецЦикла;
1028 | Возврат "[" + Результат + ПереносСтроки + Смещение + "]";
1029 |
1030 | Иначе
1031 |
1032 | // Пустая коллекция строк.
1033 | Возврат "[]";
1034 |
1035 | КонецЕсли;
1036 | КонецЕсли;
1037 |
1038 | // Дерево значений.
1039 | Если (Тип = Тип("ДеревоЗначений")) Тогда
1040 |
1041 | Структура = Новый Структура("Строки"); НаборКолонок = Значение.Колонки; Для Каждого Колонка Из НаборКолонок Цикл Структура.Вставить(Колонка.Имя); КонецЦикла;
1042 | Возврат jsonЗаписать(Значение.Строки, Стандарт, ПредставленияСсылок, ВспомогательныеДанные, Структура, Смещение, Отступ, Табуляция, ПереносСтроки, ПолноеМаскированиеСимволов, МаскированиеКириллицы);
1043 |
1044 | КонецЕсли;
1045 |
1046 | // Запрос.
1047 | Если (Тип = Тип("Запрос")) Тогда Попытка Возврат jsonЗаписать(Значение.Выполнить().Выгрузить(), Стандарт, ПредставленияСсылок, ВспомогательныеДанные, Неопределено, Смещение, Отступ, Табуляция, ПереносСтроки, ПолноеМаскированиеСимволов, МаскированиеКириллицы); Исключение ВызватьИсключение ИсключениеНевозможноВыполнитьЗапрос(ИнформацияОбОшибке().Причина.Описание); КонецПопытки; КонецЕсли;
1048 |
1049 | // Результат запроса.
1050 | Если (Тип = Тип("РезультатЗапроса")) Тогда Возврат jsonЗаписать(Значение.Выгрузить(), Стандарт, ПредставленияСсылок, ВспомогательныеДанные, Неопределено, Смещение, Отступ, Табуляция, ПереносСтроки, ПолноеМаскированиеСимволов, МаскированиеКириллицы); КонецЕсли;
1051 |
1052 | // Выборка из результата запроса.
1053 | Если (Тип = Тип("ВыборкаИзРезультатаЗапроса")) Тогда
1054 |
1055 | Структура = Новый Структура; НаборКолонок = Значение.Владелец().Колонки; Для Каждого Колонка Из НаборКолонок Цикл Структура.Вставить(Колонка.Имя); КонецЦикла;
1056 | ЗаполнитьЗначенияСвойств(Структура, Значение);
1057 | Возврат jsonЗаписать(Структура, Стандарт, ПредставленияСсылок, ВспомогательныеДанные, Неопределено, Смещение, Отступ, Табуляция, ПереносСтроки, ПолноеМаскированиеСимволов, МаскированиеКириллицы);
1058 |
1059 | КонецЕсли;
1060 |
1061 | // Построители.
1062 | Если ВспомогательныеДанные.Построители.СодержитТип(Тип) Тогда Попытка Значение.Выполнить(); Исключение ВызватьИсключение ИсключениеНевозможноВыполнитьЗапрос(ИнформацияОбОшибке().Причина.Описание); КонецПопытки; Возврат jsonЗаписать(Значение.Результат, Стандарт, ПредставленияСсылок, ВспомогательныеДанные, Неопределено, Смещение, Отступ, Табуляция, ПереносСтроки, ПолноеМаскированиеСимволов, МаскированиеКириллицы); КонецЕсли;
1063 |
1064 | // Хранилище значения.
1065 | Если (Тип = Тип("ХранилищеЗначения")) Тогда Возврат jsonЗаписать(Значение.Получить(), Стандарт, ПредставленияСсылок, ВспомогательныеДанные, Неопределено, Смещение, Отступ, Табуляция, ПереносСтроки, ПолноеМаскированиеСимволов, МаскированиеКириллицы); КонецЕсли;
1066 | #КонецЕсли
1067 |
1068 | // Двоичные данные.
1069 | Если (Тип = Тип("ДвоичныеДанные")) Тогда
1070 | #Если ВебКлиент Или ТонкийКлиент Тогда
1071 | Возврат """" + СтрЗаменить(СтрЗаменить(СтрЗаменить(Base64Строка(Значение), Символы.ВК, ""), Символы.ПС, ""), "/", "\/") + """";
1072 | #Иначе
1073 | Возврат """" + СтрЗаменить(СтрЗаменить(СтрЗаменить(XMLСтрока(Значение), Символы.ВК, ""), Символы.ПС, ""), "/", "\/") + """";
1074 | #КонецЕсли
1075 | КонецЕсли;
1076 |
1077 | // Картинка.
1078 | Если (Тип = Тип("Картинка")) Тогда
1079 | #Если ВебКлиент Или ТонкийКлиент Тогда
1080 | Возврат """" + СтрЗаменить(СтрЗаменить(СтрЗаменить(Base64Строка(Значение.ПолучитьДвоичныеДанные()), Символы.ВК, ""), Символы.ПС, ""), "/", "\/") + """";
1081 | #Иначе
1082 | Возврат """" + СтрЗаменить(СтрЗаменить(СтрЗаменить(XMLСтрока(Значение.ПолучитьДвоичныеДанные()), Символы.ВК, ""), Символы.ПС, ""), "/", "\/") + """";
1083 | #КонецЕсли
1084 | КонецЕсли;
1085 |
1086 | // Ключ и значение.
1087 | Если (Тип = Тип("КлючИЗначение")) Тогда Возврат jsonЗаписать(Новый Структура("Ключ,Значение", Значение.Ключ, Значение.Значение), Стандарт, ПредставленияСсылок, ВспомогательныеДанные, Неопределено, Смещение, Отступ, Табуляция, ПереносСтроки, ПолноеМаскированиеСимволов, МаскированиеКириллицы); КонецЕсли;
1088 |
1089 | // Клиентские типы.
1090 | #Если НаСервере Тогда
1091 | Если ВспомогательныеДанные.КлиентскиеТипы.СодержитТип(Тип) Тогда
1092 | Если (Тип = Тип("ДанныеФормыДерево")) Тогда
1093 | Возврат jsonЗаписать(ДанныеФормыВЗначение(Значение, Тип("ДеревоЗначений")), Стандарт, ПредставленияСсылок, ВспомогательныеДанные, Неопределено, Смещение, Отступ, Табуляция, ПереносСтроки, ПолноеМаскированиеСимволов, МаскированиеКириллицы);
1094 | Иначе
1095 | Возврат jsonЗаписать(Значение.Выгрузить(), Стандарт, ПредставленияСсылок, ВспомогательныеДанные, Неопределено, Смещение, Отступ, Табуляция, ПереносСтроки, ПолноеМаскированиеСимволов, МаскированиеКириллицы);
1096 | КонецЕсли;
1097 | КонецЕсли;
1098 | #КонецЕсли
1099 |
1100 | // COMSafeArray.
1101 | #Если ВебКлиент Тогда
1102 | #Иначе
1103 | Если (Тип = Тип("COMSafeArray")) Тогда Возврат jsonЗаписать(Значение.Выгрузить(), Стандарт, ПредставленияСсылок, ВспомогательныеДанные, Неопределено, Смещение, Отступ, Табуляция, ПереносСтроки, ПолноеМаскированиеСимволов, МаскированиеКириллицы); КонецЕсли;
1104 | #КонецЕсли
1105 |
1106 | // Ссылки.
1107 | #Если ВебКлиент Или ТонкийКлиент Тогда
1108 | #Иначе
1109 | Перечисление = Перечисления.ТипВсеСсылки().СодержитТип(Тип);
1110 | Если Перечисление Или
1111 | Справочники.ТипВсеСсылки().СодержитТип(Тип) Или
1112 | Документы.ТипВсеСсылки().СодержитТип(Тип) Или
1113 | ПланыВидовХарактеристик.ТипВсеСсылки().СодержитТип(Тип) Или
1114 | ПланыСчетов.ТипВсеСсылки().СодержитТип(Тип) Или
1115 | ПланыВидовРасчета.ТипВсеСсылки().СодержитТип(Тип) Или
1116 | Задачи.ТипВсеСсылки().СодержитТип(Тип) Или
1117 | БизнесПроцессы.ТипВсеСсылки().СодержитТип(Тип) Или
1118 | БизнесПроцессы.ТипВсеСсылкиТочекМаршрутаБизнесПроцессов().СодержитТип(Тип) Или
1119 | ПланыОбмена.ТипВсеСсылки().СодержитТип(Тип) Тогда
1120 | Возврат jsonЗаписатьСсылку(Значение, Стандарт, ПредставленияСсылок, ВспомогательныеДанные, Перечисление, Смещение, Отступ, Табуляция, ПереносСтроки, ПолноеМаскированиеСимволов, МаскированиеКириллицы);
1121 | КонецЕсли;
1122 | #КонецЕсли
1123 |
1124 | // Неподдерживаемые типы.
1125 | Возврат jsonЗаписатьСтроку(Значение, ПолноеМаскированиеСимволов, МаскированиеКириллицы);
1126 |
1127 | КонецФункции // jsonЗаписать()
1128 |
1129 | Функция jsonЗаписатьСтроку(Значение, ПолноеМаскированиеСимволов, МаскированиеКириллицы)
1130 |
1131 | // Маскирование служебных символов.
1132 | Результат = СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(Значение,
1133 | "\", "\\"), // x5c
1134 | "/", "\/"), // x2f
1135 | Символ(008), "\b"), // x08
1136 | Символы.Таб, "\t"), // x09
1137 | Символы.ПС, "\n"), // x0a
1138 | Символы.ПФ, "\f"), // x0c
1139 | Символы.ВК, "\r"), // x0d
1140 | """", "\"""); // x22
1141 |
1142 | // Маскирование специальных символов.
1143 | Результат = СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(Результат,
1144 | Символ(00), "\u0000"),
1145 | Символ(01), "\u0001"),
1146 | Символ(02), "\u0002"),
1147 | Символ(03), "\u0003"),
1148 | Символ(04), "\u0004"),
1149 | Символ(05), "\u0005"),
1150 | Символ(06), "\u0006"),
1151 | Символ(07), "\u0007"),
1152 | Символ(11), "\u000b"),
1153 | Символ(14), "\u000e"),
1154 | Символ(15), "\u000f"),
1155 | Символ(16), "\u0010"),
1156 | Символ(17), "\u0011"),
1157 | Символ(18), "\u0012"),
1158 | Символ(19), "\u0013"),
1159 | Символ(20), "\u0014"),
1160 | Символ(21), "\u0015"),
1161 | Символ(22), "\u0016"),
1162 | Символ(23), "\u0017"),
1163 | Символ(24), "\u0018"),
1164 | Символ(25), "\u0019"),
1165 | Символ(26), "\u001a"),
1166 | Символ(27), "\u001b"),
1167 | Символ(28), "\u001c"),
1168 | Символ(29), "\u001d"),
1169 | Символ(30), "\u001e"),
1170 | Символ(31), "\u001f");
1171 |
1172 | Если ПолноеМаскированиеСимволов Тогда
1173 |
1174 | // Маскирование сиволов обрабатываемых JavaScript-ом не правильно.
1175 | Результат = СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(Результат,
1176 | Символ(127), "\u007f"),
1177 | Символ(128), "\u0080"),
1178 | Символ(129), "\u0081"),
1179 | Символ(130), "\u0082"),
1180 | Символ(131), "\u0083"),
1181 | Символ(132), "\u0084"),
1182 | Символ(133), "\u0085"),
1183 | Символ(134), "\u0086"),
1184 | Символ(135), "\u0087"),
1185 | Символ(136), "\u0088"),
1186 | Символ(137), "\u0089"),
1187 | Символ(138), "\u008a"),
1188 | Символ(139), "\u008b"),
1189 | Символ(140), "\u008c"),
1190 | Символ(141), "\u008d"),
1191 | Символ(142), "\u008e"),
1192 | Символ(143), "\u008f"),
1193 | Символ(144), "\u0090"),
1194 | Символ(145), "\u0091"),
1195 | Символ(146), "\u0092"),
1196 | Символ(147), "\u0093"),
1197 | Символ(148), "\u0094"),
1198 | Символ(149), "\u0095"),
1199 | Символ(150), "\u0096"),
1200 | Символ(151), "\u0097"),
1201 | Символ(152), "\u0098"),
1202 | Символ(153), "\u0099"),
1203 | Символ(154), "\u009a"),
1204 | Символ(155), "\u009b"),
1205 | Символ(156), "\u009c"),
1206 | Символ(157), "\u009d"),
1207 | Символ(158), "\u009e"),
1208 | Символ(159), "\u009f"),
1209 | Символ(173), "\u00ad");
1210 |
1211 | Результат = СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(Результат,
1212 | Символ(1536), "\u0600"),
1213 | Символ(1537), "\u0601"),
1214 | Символ(1538), "\u0602"),
1215 | Символ(1539), "\u0603"),
1216 | Символ(1540), "\u0604"),
1217 | Символ(1807), "\u070f"),
1218 | Символ(6068), "\u17b4"),
1219 | Символ(6069), "\u17b5"),
1220 | Символ(8204), "\u200c"),
1221 | Символ(8205), "\u200d"),
1222 | Символ(8206), "\u200e"),
1223 | Символ(8207), "\u200f"),
1224 | Символ(8232), "\u2028"),
1225 | Символ(8233), "\u2029"),
1226 | Символ(8234), "\u202a"),
1227 | Символ(8235), "\u202b"),
1228 | Символ(8236), "\u202c"),
1229 | Символ(8237), "\u202d"),
1230 | Символ(8238), "\u202e"),
1231 | Символ(8239), "\u202f"),
1232 | Символ(8288), "\u2060"),
1233 | Символ(8289), "\u2061"),
1234 | Символ(8290), "\u2062"),
1235 | Символ(8291), "\u2063"),
1236 | Символ(8292), "\u2064"),
1237 | Символ(8293), "\u2065"),
1238 | Символ(8294), "\u2066"),
1239 | Символ(8295), "\u2067");
1240 |
1241 | Результат = СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(Результат,
1242 | Символ(8296), "\u2068"),
1243 | Символ(8297), "\u2069"),
1244 | Символ(8268), "\u206a"),
1245 | Символ(8299), "\u206b"),
1246 | Символ(8300), "\u206c"),
1247 | Символ(8301), "\u206d"),
1248 | Символ(8302), "\u206e"),
1249 | Символ(8303), "\u206f"),
1250 | Символ(65279), "\ufeff"),
1251 | Символ(65520), "\ufff0"),
1252 | Символ(65521), "\ufff1"),
1253 | Символ(65522), "\ufff2"),
1254 | Символ(65523), "\ufff3"),
1255 | Символ(65524), "\ufff4"),
1256 | Символ(65525), "\ufff5"),
1257 | Символ(65526), "\ufff6"),
1258 | Символ(65527), "\ufff7"),
1259 | Символ(65528), "\ufff8"),
1260 | Символ(65529), "\ufff9"),
1261 | Символ(65530), "\ufffa"),
1262 | Символ(65531), "\ufffb"),
1263 | Символ(65532), "\ufffc"),
1264 | Символ(65533), "\ufffd"),
1265 | Символ(65534), "\ufffe"),
1266 | Символ(65535), "\uffff");
1267 |
1268 | КонецЕсли;
1269 |
1270 | Если МаскированиеКириллицы Тогда
1271 |
1272 | // Маскирование кириллических символов.
1273 | Результат = СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(Результат,
1274 | "А", "\u0410"),
1275 | "Б", "\u0411"),
1276 | "В", "\u0412"),
1277 | "Г", "\u0413"),
1278 | "Д", "\u0414"),
1279 | "Е", "\u0415"),
1280 | "Ж", "\u0416"),
1281 | "З", "\u0417"),
1282 | "И", "\u0418"),
1283 | "Й", "\u0419"),
1284 | "К", "\u041a"),
1285 | "Л", "\u041b"),
1286 | "М", "\u041c"),
1287 | "Н", "\u041d"),
1288 | "О", "\u041e"),
1289 | "П", "\u041f"),
1290 | "Р", "\u0420"),
1291 | "С", "\u0421"),
1292 | "Т", "\u0422"),
1293 | "У", "\u0423"),
1294 | "Ф", "\u0424"),
1295 | "Х", "\u0425"),
1296 | "Ц", "\u0426"),
1297 | "Ч", "\u0427"),
1298 | "Ш", "\u0428"),
1299 | "Щ", "\u0429"),
1300 | "Ъ", "\u042a"),
1301 | "Ы", "\u042b"),
1302 | "Ь", "\u042c"),
1303 | "Э", "\u042d"),
1304 | "Ю", "\u042e"),
1305 | "Я", "\u042f");
1306 |
1307 | Результат = СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(Результат,
1308 | "а", "\u0430"),
1309 | "б", "\u0431"),
1310 | "в", "\u0432"),
1311 | "г", "\u0433"),
1312 | "д", "\u0434"),
1313 | "е", "\u0435"),
1314 | "ж", "\u0436"),
1315 | "з", "\u0437"),
1316 | "и", "\u0438"),
1317 | "й", "\u0439"),
1318 | "к", "\u043a"),
1319 | "л", "\u043b"),
1320 | "м", "\u043c"),
1321 | "н", "\u043d"),
1322 | "о", "\u043e"),
1323 | "п", "\u043f"),
1324 | "р", "\u0440"),
1325 | "с", "\u0441"),
1326 | "т", "\u0442"),
1327 | "у", "\u0443"),
1328 | "ф", "\u0444"),
1329 | "х", "\u0445"),
1330 | "ц", "\u0446"),
1331 | "ч", "\u0447"),
1332 | "ш", "\u0448"),
1333 | "щ", "\u0449"),
1334 | "ъ", "\u044a"),
1335 | "ы", "\u044b"),
1336 | "ь", "\u044c"),
1337 | "э", "\u044d"),
1338 | "ю", "\u044e"),
1339 | "я", "\u044f");
1340 |
1341 | Результат = СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(Результат,
1342 | "’", "\u2019"),
1343 | "Ґ", "\u0490"),
1344 | "Ђ", "\u0402"),
1345 | "Ѓ", "\u0403"),
1346 | "Ѐ", "\u0400"),
1347 | "Ё", "\u0401"),
1348 | "Є", "\u0404"),
1349 | "Ѕ", "\u0405"),
1350 | "Ѝ", "\u040d"),
1351 | "І", "\u0406"),
1352 | "Ї", "\u0407"),
1353 | "Ј", "\u0408"),
1354 | "Љ", "\u0409"),
1355 | "Њ", "\u040a"),
1356 | "Ћ", "\u040b"),
1357 | "Ќ", "\u040c"),
1358 | "Ў", "\u040e"),
1359 | "Џ", "\u040f"),
1360 | "ґ", "\u0491"),
1361 | "ђ", "\u0452"),
1362 | "ѓ", "\u0453"),
1363 | "ѐ", "\u0450"),
1364 | "ё", "\u0451"),
1365 | "є", "\u0454"),
1366 | "ѕ", "\u0455"),
1367 | "ѝ", "\u045d"),
1368 | "і", "\u0456"),
1369 | "ї", "\u0457"),
1370 | "ј", "\u0458"),
1371 | "љ", "\u0459"),
1372 | "њ", "\u045a"),
1373 | "ћ", "\u045b"),
1374 | "ќ", "\u045c"),
1375 | "ў", "\u045e"),
1376 | "џ", "\u045f");
1377 |
1378 | КонецЕсли;
1379 |
1380 | // Кавычки.
1381 | Возврат """" + Результат + """";
1382 |
1383 | КонецФункции // jsonЗаписатьСтроку()
1384 |
1385 | Функция jsonЗаписатьСсылку(Значение, Стандарт, ПредставленияСсылок, ВспомогательныеДанные, Перечисление, Смещение, Отступ, Табуляция, ПереносСтроки, ПолноеМаскированиеСимволов, МаскированиеКириллицы)
1386 | #Если ВебКлиент Или ТонкийКлиент Тогда
1387 | #Иначе
1388 |
1389 | // Идентификатор.
1390 | Если Стандарт Тогда
1391 | Если Перечисление Тогда Идентификатор = Лев(Прав(ЗначениеВСтрокуВнутр(Значение), 33), 32); Идентификатор = Прав(Идентификатор, 8) + "-" + Сред(Идентификатор, 21, 4) + "-" + Сред(Идентификатор, 17, 4) + "-" + Лев(Идентификатор, 4) + "-" + Сред(Идентификатор, 5, 12); Иначе Идентификатор = XMLСтрока(Значение); КонецЕсли;
1392 | Иначе
1393 | Идентификатор = ЗначениеВСтрокуВнутр(Значение); Идентификатор = "¦ref¦" + СтрЗаменить(СтрЗаменить(Сред(Идентификатор, 6, СтрДлина(Идентификатор) - 6), ":", "×"), ",", "÷") + "¦";
1394 | КонецЕсли;
1395 |
1396 | // Включая представление ссылки.
1397 | Если ПредставленияСсылок Тогда Возврат jsonЗаписать(Новый Структура("Ссылка,Представление", Идентификатор, Строка(Значение)), Стандарт, ПредставленияСсылок, ВспомогательныеДанные, Неопределено, Смещение, Отступ, Табуляция, ПереносСтроки, ПолноеМаскированиеСимволов, МаскированиеКириллицы); КонецЕсли;
1398 |
1399 | // Ссылка.
1400 | Возврат """" + Идентификатор + """";
1401 |
1402 | #КонецЕсли
1403 | КонецФункции // jsonЗаписатьСсылку()
1404 |
1405 |
1406 | // ─────────────────────────────────────────────────────────────────────────────
1407 | // ЛОКАЛИЗАЦИЯ
1408 |
1409 | Функция СформироватьСтрокуПоШаблону(Строка, Параметры)
1410 |
1411 | Результат = Строка;
1412 |
1413 | Для Каждого Параметр Из Параметры Цикл
1414 | Результат = СтрЗаменить(Результат, "[" + Параметр.Ключ + "]", Строка(Параметр.Значение));
1415 | КонецЦикла;
1416 |
1417 | Возврат Результат;
1418 |
1419 | КонецФункции // СформироватьСтрокуПоШаблону()
1420 |
1421 |
1422 | Функция ИсключениеПустойПакетДанных()
1423 |
1424 | Возврат НСтр("ru = 'JSON: Пустой пакет данных.'; uk = 'JSON: Порожній пакет даних.'");
1425 |
1426 | КонецФункции // ИсключениеНеожиданноеОкончаниеСтроки()
1427 |
1428 | Функция ИсключениеНекорректныйПакетДанных(Индекс)
1429 |
1430 | Возврат СформироватьСтрокуПоШаблону(НСтр("ru = 'JSON: Некорректный пакет данных в позиции [Индекс].'; uk = 'JSON: Некоректний пакет даних у позиції [Индекс].'"),
1431 | Новый Структура("Индекс", Индекс));
1432 |
1433 | КонецФункции // ИсключениеНекорректныйПакетДанных()
1434 |
1435 | Функция ИсключениеНеожиданноеОкончаниеПакетаДанных()
1436 |
1437 | Возврат НСтр("ru = 'JSON: Неожиданное окончание пакета данных.'; uk = 'JSON: Несподіване закінчення пакета даних.'");
1438 |
1439 | КонецФункции // ИсключениеНеожиданноеОкончаниеПакетаДанных()
1440 |
1441 | Функция ИсключениеНеожиданноеОкончаниеМассива(Индекс)
1442 |
1443 | Возврат СформироватьСтрокуПоШаблону(НСтр("ru = 'JSON: Неожиданное окончание массива в позиции [Индекс].'; uk = 'JSON: Несподіване закінчення масиву у позиції [Индекс].'"),
1444 | Новый Структура("Индекс", Индекс));
1445 |
1446 | КонецФункции // ИсключениеНеожиданноеОкончаниеМассива()
1447 |
1448 | Функция ИсключениеНеожиданноеОкончаниеОбъетка(Индекс)
1449 |
1450 | Возврат СформироватьСтрокуПоШаблону(НСтр("ru = 'JSON: Неожиданное окончание объекта в позиции [Индекс].'; uk = 'JSON: Несподіване закінчення об''єкту у позиції [Индекс].'"),
1451 | Новый Структура("Индекс", Индекс));
1452 |
1453 | КонецФункции // ИсключениеНеожиданноеОкончаниеОбъетка()
1454 |
1455 | Функция ИсключениеНекорректныйТипNull(Индекс)
1456 |
1457 | Возврат СформироватьСтрокуПоШаблону(НСтр("ru = 'JSON: Некорректный тип Null в позиции [Индекс].'; uk = 'JSON: Некоректний тип Null у позиції [Индекс].'"),
1458 | Новый Структура("Индекс", Индекс));
1459 |
1460 | КонецФункции // ИсключениеНекорректныйТипNull()
1461 |
1462 | Функция ИсключениеНекорректныйТипБулево(Индекс)
1463 |
1464 | Возврат СформироватьСтрокуПоШаблону(НСтр("ru = 'JSON: Некорректный тип Булево в позиции [Индекс].'; uk = 'JSON: Некоректний тип Булево у позиції [Индекс].'"),
1465 | Новый Структура("Индекс", Индекс));
1466 |
1467 | КонецФункции // ИсключениеНекорректныйТипБулево()
1468 |
1469 | Функция ИсключениеНекорректныйТипНеопределено(Индекс)
1470 |
1471 | Возврат СформироватьСтрокуПоШаблону(НСтр("ru = 'JSON: Некорректный тип Неопределено в позиции [Индекс].'; uk = 'JSON: Некоректний тип Невизначено у позиції [Индекс].'"),
1472 | Новый Структура("Индекс", Индекс));
1473 |
1474 | КонецФункции // ИсключениеНекорректныйТипНеопределено()
1475 |
1476 | Функция ИсключениеНекорректныйФорматСтроки(Индекс)
1477 |
1478 | Возврат СформироватьСтрокуПоШаблону(НСтр("ru = 'JSON: Некорректный формат строки в позиции [Индекс].'; uk = 'JSON: Некоректний формат рядка у позиції [Индекс].'"),
1479 | Новый Структура("Индекс", Индекс));
1480 |
1481 | КонецФункции // ИсключениеНекорректныйФорматСтроки()
1482 |
1483 | Функция ИсключениеНекорректныйФорматДаты(Индекс, Значение)
1484 |
1485 | Возврат СформироватьСтрокуПоШаблону(НСтр("ru = 'JSON: Некорректный формат даты [Значение] в позиции [Индекс].'; uk = 'JSON: Некоректний формат дати [Значение] у позиції [Индекс].'"),
1486 | Новый Структура("Индекс", Индекс, Символ(034) + Значение + Символ(034)));
1487 |
1488 | КонецФункции // ИсключениеНекорректныйФорматДаты()
1489 |
1490 | Функция ИсключениеНекорректныйФорматЧисла(Индекс, Значение)
1491 |
1492 | Если ПустаяСтрока(Значение) Тогда
1493 |
1494 | Возврат СформироватьСтрокуПоШаблону(НСтр("ru = 'JSON: Неверный формат данных в позиции [Индекс].'; uk = 'JSON: Невірний формат даних у позиції [Индекс].'"),
1495 | Новый Структура("Индекс", Индекс));
1496 |
1497 | Иначе
1498 |
1499 | Возврат СформироватьСтрокуПоШаблону(НСтр("ru = 'JSON: Некорректный формат числа [Значение] в позиции [Индекс].'; uk = 'JSON: Некоректний формат числа [Значение] у позиції [Индекс].'"),
1500 | Новый Структура("Индекс,Значение", Индекс, Символ(034) + Значение + Символ(034)));
1501 |
1502 | КонецЕсли;
1503 |
1504 | КонецФункции // ИсключениеНекорректныйФорматЧисла()
1505 |
1506 | Функция ИсключениеНедопустимыйСимвол(Индекс, Символ)
1507 |
1508 | Если (Символ = Неопределено) Тогда
1509 |
1510 | Возврат СформироватьСтрокуПоШаблону(НСтр("ru = 'JSON: Недопустимый символ в позиции [Индекс].'; uk = 'JSON: Неприпустимий символ в позиції [Индекс].'"),
1511 | Новый Структура("Индекс", Индекс));
1512 |
1513 | Иначе
1514 |
1515 | Возврат СформироватьСтрокуПоШаблону(НСтр("ru = 'JSON: Недопустимый символ в позиции [Индекс], ожидается [Символ].'; uk = 'JSON: Неприпустимий символ в позиції [Индекс], очікується [Символ].'"),
1516 | Новый Структура("Индекс,Символ", Индекс, Символ(034) + Символ + Символ(034)));
1517 |
1518 | КонецЕсли;
1519 |
1520 | КонецФункции // ИсключениеНедопустимыйСимвол()
1521 |
1522 | Функция ИсключениеНеопознанныйТип(Индекс, Тип)
1523 |
1524 | Возврат СформироватьСтрокуПоШаблону(НСтр("ru = 'JSON: Недопустимый тип [Тип] в позиции [Индекс].'; uk = 'JSON: Неприпустимий тип [Тип] у позиції [Индекс].'"),
1525 | Новый Структура("Индекс,Тип", Индекс, Символ(034) + Тип + Символ(034)));
1526 |
1527 | КонецФункции // ИсключениеНеопознанныйТип()
1528 |
1529 | Функция ИсключениеНевозможноПреобразоватьЗначение(Индекс, Значение)
1530 |
1531 | Возврат СформироватьСтрокуПоШаблону(НСтр("ru = 'JSON: Невозможно преобразовать значение [Значение] в позиции [Индекс].'; uk = 'JSON: Неможливо перетворити значення [Значение] у позиції [Индекс].'"),
1532 | Новый Структура("Индекс,Значение", Индекс, Символ(034) + Значение + Символ(034)));
1533 |
1534 | КонецФункции // ИсключениеНевозможноПреобразоватьЗначение()
1535 |
1536 | Функция ИсключениеНевозможноПреобразоватьЗначениеНаКлиенте(Индекс, Значение)
1537 |
1538 | Возврат СформироватьСтрокуПоШаблону(НСтр("ru = 'JSON: Невозможно на клиенте преобразовать значение [Значение] в позиции [Индекс].'; uk = 'JSON: Неможливо на клієнті перетворити значення [Значение] у позиції [Индекс].'"),
1539 | Новый Структура("Индекс,Значение", Индекс, Символ(034) + Значение + Символ(034)));
1540 |
1541 | КонецФункции // ИсключениеНевозможноПреобразоватьЗначениеНаКлиенте()
1542 |
1543 |
1544 | Функция ИсключениеНекорректныйПараметр(Параметр)
1545 |
1546 | Возврат СформироватьСтрокуПоШаблону(НСтр("ru = 'JSON: Недопустимое значение параметра [Параметр].'; uk = 'JSON: Неприпустиме значення параметра [Параметр].'"),
1547 | Новый Структура("Параметр", Символ(034) + Параметр + Символ(034)));
1548 |
1549 | КонецФункции // ИсключениеНекорректныйПараметр()
1550 |
1551 |
1552 | Функция ИсключениеНедопустимыйТипКлюча(Индекс, Значение)
1553 |
1554 | Если (Индекс = Неопределено) Тогда
1555 |
1556 | Возврат СформироватьСтрокуПоШаблону(НСтр("ru = 'JSON: Недопустимый тип значения ключа [Тип].'; uk = 'JSON: Неприпустимий тип значення ключа [Тип].'"),
1557 | Новый Структура("Тип", ТипЗнч(Значение)));
1558 |
1559 | Иначе
1560 |
1561 | Возврат СформироватьСтрокуПоШаблону(НСтр("ru = 'JSON: Недопустимый тип значения ключа [Тип] в позиции [Индекс].'; uk = 'JSON: Неприпустимий тип значення ключа [Тип] в позиції [Индекс].'"),
1562 | Новый Структура("Индекс,Тип", Индекс, Символ(034) + ТипЗнч(Значение) + Символ(034)));
1563 |
1564 | КонецЕсли;
1565 |
1566 | КонецФункции // ИсключениеНедопустимыйТипКлюча()
1567 |
1568 | Функция ИсключениеНевозможноВыполнитьЗапрос(Описание)
1569 |
1570 | Позиция = Найти(Описание, "}: "); Если Позиция Тогда Позиция = Позиция + 3; Иначе Позиция = 1; КонецЕсли;
1571 | Длина = Найти(Описание, Символы.ПС); Если Длина Тогда Длина = Длина - Позиция; Иначе Длина = СтрДлина(Описание); КонецЕсли;
1572 | Возврат НСтр("ru = 'JSON: Невозможно выполнить запрос. '; uk = 'JSON: Неможливо виконати запит. '") + Сред(Описание, Позиция, Длина) + ".";
1573 |
1574 | КонецФункции // ИсключениеНевозможноВыполнитьЗапрос()
1575 |
--------------------------------------------------------------------------------
/src/CommonModule.git_JSON.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | git_JSON
6 |
7 |
8 | ru
9 | JSON
10 |
11 |
12 |
13 | false
14 | false
15 | true
16 | false
17 | false
18 | false
19 | true
20 | DontUse
21 |
22 |
23 |
--------------------------------------------------------------------------------
/src/CommonModule.git_Slack.Module.txt:
--------------------------------------------------------------------------------
1 | // 1С:Slack. Send data into Slack in real-time.
2 |
3 | // Copyright © 2014 Петр Базелюк
4 |
5 | // Данная лицензия разрешает лицам, получившим копию данного программного
6 | // обеспечения и сопутствующей документации (в дальнейшем именуемыми «Программное
7 | // Обеспечение»), безвозмездно использовать Программное Обеспечение без ограничений,
8 | // включая неограниченное право на использование, копирование, изменение,
9 | // добавление, публикацию, распространение, сублицензирование и/или продажу копий
10 | // Программного Обеспечения, также как и лицам, которым предоставляется данное
11 | // Программное Обеспечение, при соблюдении следующих условий:
12 |
13 | // Указанное выше уведомление об авторском праве и данные условия должны быть
14 | // включены во все копии или значимые части данного Программного Обеспечения.
15 |
16 | // ДАННОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ «КАК ЕСТЬ», БЕЗ КАКИХ-ЛИБО
17 | // ГАРАНТИЙ, ЯВНО ВЫРАЖЕННЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ
18 | // ГАРАНТИЯМИ ТОВАРНОЙ ПРИГОДНОСТИ, СООТВЕТСТВИЯ ПО ЕГО КОНКРЕТНОМУ НАЗНАЧЕНИЮ И
19 | // ОТСУТСТВИЯ НАРУШЕНИЙ ПРАВ. НИ В КАКОМ СЛУЧАЕ АВТОРЫ ИЛИ ПРАВООБЛАДАТЕЛИ НЕ НЕСУТ
20 | // ОТВЕТСТВЕННОСТИ ПО ИСКАМ О ВОЗМЕЩЕНИИ УЩЕРБА, УБЫТКОВ ИЛИ ДРУГИХ ТРЕБОВАНИЙ ПО
21 | // ДЕЙСТВУЮЩИМ КОНТРАКТАМ, ДЕЛИКТАМ ИЛИ ИНОМУ, ВОЗНИКШИМ ИЗ, ИМЕЮЩИМ ПРИЧИНОЙ ИЛИ
22 | // СВЯЗАННЫМ С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ ИЛИ ИСПОЛЬЗОВАНИЕМ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ
23 | // ИЛИ ИНЫМИ ДЕЙСТВИЯМИ С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ.
24 |
25 | // Петр Базелюк
26 | // e-mail: pbazelyuk@ktc-ua.com
27 | // Версия: 1.0.0.1
28 |
29 | // Требования:
30 | // Минимальная версия платформы 1С - 8.3
31 |
32 | // Методы:
33 | // ОтправитьДанные – Отправляет данные в сервис slack;
34 |
35 |
36 | // Процедура отправляет данные в сервисе slack
37 | //
38 | // Параметры:
39 | // Сервер - Строка - Хост сервера, с которым осуществляется соединение
40 | // Токен - Строка - Уникальный токен для интеграции с сервисом. (Integrations -> Incoming WebHooks -> Add Incoming WebHook -> Token)
41 | // СтруктураДанных - Структура - Структура в которой описаны поля JSON
42 | // * text - Строка - Строка текста (необязательный)
43 | // Пример:
44 | // "Это строка текста в канале /n А это другая строка в канале, с новой строки"
45 | // "Случилось важное событие! для подробной информации!""
46 | // * username - Строка - Отображаемое имя бота (необязательный)
47 | // Пример:
48 | // "Новое имя пользователя"
49 | // "Мастре Йода"
50 | // * icon_url - Строка - Отображаемая картинка бота (необязательный)
51 | // Пример:
52 | // "https://slack.com/img/icons/app-57.png"
53 | // * icon_emoji - Строка - Отображаемая картинка бота (необязательный)
54 | // Пример:
55 | // ":ghost:"
56 | // * channel - Строка - Канал\пользователь в который\которому нужно доставить сообщение (необязательный)
57 | // Пример:
58 | // "#other-channel"
59 | // "@username"
60 | // * attachments - Массив - Содержит структуры со свойствами (необязательный):
61 | // ** fallback - Строка - Описание прикрепления (обязательный)
62 | // Пример:
63 | // "Прайс-лист"
64 | // "New open task [Urgent]: "
65 | // ** text - Строка - Дополнительный текст, который должен появиться в прикреплении (необязательный)
66 | // Пример:
67 | // "Дополнительный текст"
68 | // ** pretext - Строка - Дополнительный текст, который появляется выше, над форматированными данными (необязательный)
69 | // Пример:
70 | // "Дополнительный текст"
71 | // "New open task [Urgent]: "
72 | // ** color - Строка - Цвет полосы (необязательный)
73 | // Пример:
74 | // "#36a64f"
75 | // "danger"
76 | // ** fields - Массив - Содержит структуры со свойствами (необязательный):
77 | // *** title - Строка - Заголовок поля (обязательный)
78 | // Пример:
79 | // "Заметки"
80 | // *** value - Строка - Текст значения поля. Может содержать стандартную разметку сообщения и должны быть экранированы, как обычно.
81 | // Текст может быть многострочным. (необязательный)
82 | // Пример:
83 | // "Это намного проще, чем кажется"
84 | // *** short - Булево - Флаг обозначает, что value короткое настолько чтобы рядом отобразить другие значения (необязательный)
85 | // Пример:
86 | // Ложь
87 | // Истина
88 | // ОбъектМетаданных - <Объект метаданных> - Объект метаданных, к которому относится событие
89 | // Данные - Произвольный - Данные, с которыми связано событие
90 | // Комментарий - Строка - Произвольная строка комментария к событию
91 | //
92 | Процедура ОтправитьДанные(Сервер, Токен, Знач СтруктураДанных, ОбъектМетаданных = Неопределено, Данные = Неопределено, Комментарий = Неопределено) Экспорт
93 |
94 | ЗаписьЖурналаРегистрации(НСтр("ru='Начало. Отправка сообщения в slack'"),
95 | УровеньЖурналаРегистрации.Информация,
96 | ОбъектМетаданных,
97 | Данные,
98 | Комментарий);
99 |
100 | ВыполнитьПроверкуСтруктурыДанных(СтруктураДанных);
101 |
102 | ДанныеJSON = git_JSON.ЗаписатьJSON(СтруктураДанных);
103 | ДанныеEncoded = КодироватьСтроку(ДанныеJSON, СпособКодированияСтроки.КодировкаURL, КодировкаТекста.UTF8);
104 | PayloadEncoded = "payload=%ДанныеEncoded%";
105 | PayloadEncoded = СтрЗаменить(PayloadEncoded, "%ДанныеEncoded%", ДанныеEncoded);
106 |
107 | Заголовки = Новый Соответствие;
108 | Заголовки.Вставить("Content-Type", "application/x-www-form-urlencoded");
109 |
110 | СтрокаСоединения = "/services/hooks/incoming-webhook?token=%Токен%";
111 | СтрокаСоединения = СтрЗаменить(СтрокаСоединения, "%Токен%", Токен);
112 |
113 | HTTPЗапрос = Новый HTTPЗапрос(СтрокаСоединения, Заголовки);
114 | HTTPЗапрос.УстановитьТелоИзСтроки(PayloadEncoded, "Windows-1251");
115 |
116 | ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL(Новый СертификатКлиентаWindows, Новый СертификатыУдостоверяющихЦентровWindows);
117 | HTTPСоединение = Новый HTTPСоединение(Сервер,,,,,, ЗащищенноеСоединение);
118 |
119 | Попытка
120 | HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);
121 | Исключение
122 | ЗаписьЖурналаРегистрации(НСтр("ru='Ошибка. Отправка сообщения в slack'"),
123 | УровеньЖурналаРегистрации.Ошибка,
124 | ОбъектМетаданных,
125 | Данные,
126 | ОписаниеОшибки());
127 | Возврат;
128 | КонецПопытки;
129 |
130 | ЗаписьЖурналаРегистрации(НСтр("ru='Успешное завершение. Отправка сообщения в slack'"),
131 | УровеньЖурналаРегистрации.Информация,
132 | ОбъектМетаданных,
133 | Данные,
134 | Комментарий);
135 |
136 | КонецПроцедуры // ОтправитьДанные()
137 |
138 | // Проверяет корректность переданой структуры данных
139 | //
140 | // Параметры:
141 | // СтруктураДанных - Структура - Структура в которой описаны поля JSON
142 | //
143 | Процедура ВыполнитьПроверкуСтруктурыДанных(СтруктураДанных, ТипСтруктуры = Неопределено)
144 |
145 | ПроверитьТипЗначенияСтруктуры(СтруктураДанных);
146 |
147 | Для каждого КлючИЗначение Из СтруктураДанных Цикл
148 |
149 | Если ЗначениеЗаполнено(КлючИЗначение.Значение) = Ложь Тогда
150 | СтруктураДанных.Удалить(КлючИЗначение.Ключ);
151 | Продолжить;
152 | КонецЕсли;
153 |
154 | Если КлючИЗначение.Ключ = "attachments" ИЛИ КлючИЗначение.Ключ = "fields" Тогда
155 |
156 | ПроверитьТипЗначения(КлючИЗначение, Тип("Массив"));
157 |
158 | Для каждого ЭлементМассива Из КлючИЗначение.Значение Цикл
159 | ВыполнитьПроверкуСтруктурыДанных(ЭлементМассива, КлючИЗначение.Ключ);
160 | КонецЦикла;
161 |
162 | Продолжить;
163 |
164 | КонецЕсли;
165 |
166 | Если КлючИЗначение.Ключ <> "short" Тогда
167 | ПроверитьТипЗначения(КлючИЗначение, Тип("Строка"));
168 | КонецЕсли;
169 |
170 | КонецЦикла;
171 |
172 | Если ТипСтруктуры = "attachments" Тогда
173 | Если СтруктураДанных.Свойство("fallback") = Ложь Тогда
174 | ВызватьИсключение НСтр("ru='Структура ""attachments"" не содержит обязательное поле ""fallback""'");
175 | КонецЕсли;
176 | КонецЕсли;
177 |
178 | Если ТипСтруктуры = "fields" Тогда
179 | Если СтруктураДанных.Свойство("title") = Ложь Тогда
180 | ВызватьИсключение НСтр("ru='Структура ""fields"" не содержит обязательное поле ""title""'");
181 | КонецЕсли;
182 | КонецЕсли;
183 |
184 | КонецПроцедуры // ВыполнитьПроверкуСтруктурыДанных()
185 |
186 | Процедура ПроверитьТипЗначения(КлючИЗначение, Тип)
187 |
188 | Если ТипЗнч(КлючИЗначение.Значение) <> Тип Тогда
189 | ОписаниеОшибки = НСтр("ru='Структура описания полей JSON содержит ошибочное значение в поле: %Ключ%'");
190 | ОписаниеОшибки = СтрЗаменить(ОписаниеОшибки, "%Ключ%", КлючИЗначение.Ключ);
191 | ВызватьИсключение ОписаниеОшибки;
192 | КонецЕсли;
193 |
194 | КонецПроцедуры // ПроверитьТипЗначения()
195 |
196 | Процедура ПроверитьТипЗначенияСтруктуры(СтруктураДанных)
197 |
198 | Если ТипЗнч(СтруктураДанных) <> Тип("Структура") Тогда
199 | ВызватьИсключение НСтр("ru='Переданные данные не являются структурой описания полей JSON'");
200 | КонецЕсли;
201 |
202 | КонецПроцедуры // ПроверитьТипЗначенияСтруктуры()
203 |
204 |
205 |
206 | Функция ПолучитьПустуюСтруктуруДанных() Экспорт
207 |
208 | СтруктураДанных = Новый Структура;
209 | СтруктураДанных.Вставить("text");
210 | СтруктураДанных.Вставить("username");
211 | СтруктураДанных.Вставить("icon_url");
212 | СтруктураДанных.Вставить("icon_emoji");
213 | СтруктураДанных.Вставить("channel");
214 | СтруктураДанных.Вставить("attachments");
215 | Возврат СтруктураДанных;
216 |
217 | КонецФункции // ПолучитьПустуюСтруктуруДанных()
218 |
219 | Функция ПолучитьСтруктуруПрикреплений() Экспорт
220 |
221 | СтруктураПрикреплений = Новый Структура;
222 | СтруктураПрикреплений.Вставить("fallback");
223 | СтруктураПрикреплений.Вставить("text");
224 | СтруктураПрикреплений.Вставить("pretext");
225 | СтруктураПрикреплений.Вставить("color");
226 | СтруктураПрикреплений.Вставить("fields");
227 | Возврат СтруктураПрикреплений;
228 |
229 | КонецФункции // ПолучитьСтруктуруПрикреплений()
230 |
231 | Функция ПолучитьСтруктуруПолей() Экспорт
232 |
233 | СтруктураПолей = Новый Структура;
234 | СтруктураПолей.Вставить("title");
235 | СтруктураПолей.Вставить("value");
236 | СтруктураПолей.Вставить("short");
237 | Возврат СтруктураПолей;
238 |
239 | КонецФункции // ПолучитьСтруктуруПолей()
--------------------------------------------------------------------------------
/src/CommonModule.git_Slack.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | git_Slack
6 |
7 |
8 | ru
9 | Интеграция с сервисом Slack
10 |
11 |
12 |
13 | false
14 | false
15 | true
16 | false
17 | false
18 | false
19 | true
20 | DontUse
21 |
22 |
23 |
--------------------------------------------------------------------------------
/src/Configuration.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | 9cd510cd-abfc-11d4-9434-004095e12fc7
7 | a421276e-0432-4e40-9e62-ee9790e613ab
8 |
9 |
10 | 9fcd25a0-4822-11d4-9414-008048da11f9
11 | 182b48c7-c90c-4d9e-88b3-625032674dd7
12 |
13 |
14 | e3687481-0a87-462c-a166-9f34594f9bba
15 | 2237e25a-059e-4b65-b484-802c690895d7
16 |
17 |
18 | 9de14907-ec23-4a07-96f0-85521cb6b53b
19 | 5e14b51f-ff1a-40ff-9d9b-6380d2dad337
20 |
21 |
22 | 51f2d5d8-ea4d-4064-8892-82951750031e
23 | 5332f9a0-091b-4dc5-84cf-243966dd9caa
24 |
25 |
26 | e68182ea-4237-4383-967f-90c1e3370bc7
27 | 22d5f294-3e43-4870-a432-c3af7a3518e9
28 |
29 |
30 |
31 | Конфигурация
32 |
33 |
34 | ManagedApplication
35 |
36 | PersonalComputer
37 |
38 | Russian
39 |
40 |
41 |
42 |
43 | false
44 | false
45 | false
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 | Multimedia
61 | false
62 |
63 |
64 | Location
65 | false
66 |
67 |
68 | Contacts
69 | false
70 |
71 |
72 | Calendars
73 | false
74 |
75 |
76 | Telephony
77 | false
78 |
79 |
80 |
81 |
82 | Language.Русский
83 |
84 |
85 |
86 |
87 |
88 | Managed
89 | NotAutoFree
90 | DontUse
91 | Taxi
92 | DontUse
93 |
94 |
95 |
96 | Русский
97 | git_JSON
98 | git_Slack
99 |
100 |
101 |
--------------------------------------------------------------------------------
/src/Language.Русский.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Русский
6 |
7 |
8 | ru
9 | Русский
10 |
11 |
12 |
13 | ru
14 |
15 |
16 |
--------------------------------------------------------------------------------