├── 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 | --------------------------------------------------------------------------------