// A8PRO CR 1.1.30.0 R4. Шаблон модуля управляемой формы. // Установленный клиент 1С на том же Windows-ПК, где работает A8PRO CR. // Не EPF. Не выполнять на сервере 1С или в веб-клиенте. // Токен передаётся из согласованного локального хранилища, в журнал не выводится. &НаКлиенте Функция CRЗапрос(Метод, Путь, Токен) Если СтрДлина(Токен) < 32 Тогда ВызватьИсключение "Не настроен локальный токен A8PRO CR"; КонецЕсли; Заголовки = Новый Соответствие; Заголовки.Вставить("X-A8PRO-Token", Токен); Заголовки.Вставить("Accept", "application/json"); Запрос = Новый HTTPЗапрос(Путь, Заголовки); Соединение = Новый HTTPСоединение("localhost", 9010, , , , 15); Возврат Соединение.ВызватьHTTPМетод(Метод, Запрос); КонецФункции &НаКлиенте Функция CRЗаголовок(Ответ, Имя) Для Каждого Пара Из Ответ.Заголовки Цикл Если НРег(Пара.Ключ) = НРег(Имя) Тогда Возврат Пара.Значение; КонецЕсли; КонецЦикла; Возврат ""; КонецФункции &НаКлиенте Функция CRПроверитьScanId(Идентификатор) Если СтрДлина(Идентификатор) <> 32 Тогда ВызватьИсключение "Отсутствует корректный scanId A8PRO CR"; КонецЕсли; Для Позиция = 1 По 32 Цикл Если СтрНайти("0123456789abcdef", НРег(Сред(Идентификатор, Позиция, 1))) = 0 Тогда ВызватьИсключение "Некорректный scanId A8PRO CR"; КонецЕсли; КонецЦикла; Возврат Истина; КонецФункции &НаКлиенте Функция CRПрочитатьДокумент(Токен) Экспорт // Вызывать один раз по команде оператора. Нет автоматических повторов. Ответ = CRЗапрос("GET", "/v2/getInfo", Токен); Если Ответ.КодСостояния <> 200 Тогда // Не выводить тело ответа: оно может содержать данные документа. ВызватьИсключение "A8PRO CR: HTTP " + Строка(Ответ.КодСостояния); КонецЕсли; Чтение = Новый ЧтениеJSON; Чтение.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку()); Попытка Данные = ПрочитатьJSON(Чтение, Истина); Исключение Чтение.Закрыть(); ВызватьИсключение "A8PRO CR вернул некорректный JSON"; КонецПопытки; Чтение.Закрыть(); Если ТипЗнч(Данные) <> Тип("Соответствие") Тогда ВызватьИсключение "Неожиданный формат ответа A8PRO CR"; КонецЕсли; Статус = Данные.Получить("status"); Если Статус = "waiting" Тогда Возврат Новый Структура("Состояние,Данные,ScanId", "waiting", Неопределено, ""); КонецЕсли; Если Статус <> Неопределено Тогда ВызватьИсключение "Неожиданный статус A8PRO CR"; КонецЕсли; Идентификатор = CRЗаголовок(Ответ, "X-A8PRO-Scan-Id"); CRПроверитьScanId(Идентификатор); // Перед сохранением: проверить поля и даты, сопоставить с реквизитами вашей базы. Возврат Новый Структура("Состояние,Данные,ScanId", "received", Данные, Идентификатор); КонецФункции &НаКлиенте Функция CRПодтвердитьПослеСохранения(Токен, Идентификатор, СохранениеПодтверждено) Экспорт // СохранениеПодтверждено должно поступать из успешной фиксации в вашей системе. // Нажатие «Получить» или показ данных на форме не подтверждает сохранение. Если СохранениеПодтверждено <> Истина Тогда ВызватьИсключение "Сначала сохраните результат в принимающей системе"; КонецЕсли; CRПроверитьScanId(Идентификатор); Ответ = CRЗапрос("POST", "/v2/getInfo/ack?scanId=" + Идентификатор, Токен); Если Ответ.КодСостояния = 204 Тогда Возврат "cleared"; КонецЕсли; Если Ответ.КодСостояния = 404 Тогда // Не ACK-ать другой scanId и не повторять сохранённую бизнес-операцию. Возврат "not_found_or_replaced"; КонецЕсли; ВызватьИсключение "A8PRO CR: ошибка ACK, HTTP " + Строка(Ответ.КодСостояния); КонецФункции