Как в 1С 7.7 получить token и id для запросов к ТС ПИоТ

Программист 1С v7.7 Торговля и дистрибуция
← На главную

При реализации разрешительного режима на кассовом узле разработчикам необходимо отправлять запросы к локальному сервису «Транспортный модуль проверки кодов маркировки» (ТС ПИоТ) информационной системы «Честный Знак». В соответствии со спецификацией протокола в блоке сведений о программном обеспечении (клиенте) требуется передавать два обязательных реквизита: id (идентификатор программного модуля) и token (контрольную сумму исполняемого файла).

Для разработчиков решений на платформе 1С 7.7 данное требование вызывает ряд практических затруднений. Во-первых, во встроенном языке версии 7.7 отсутствуют штатные криптографические функции вычисления CRC32 или MD5. Во-вторых, сама концепция «исполняемого файла» в 1С 7.7 размыта: код кассы находится либо в файле метаданных 1Cv7.MD, либо во внешней обработке .ert, тогда как бинарный 1cv7s.exe является общим интерпретатором платформы. Разберем по шагам, как корректно сформировать эти значения и передать их в ТС ПИоТ из 1С 7.7.

Что представляют собой поля id и token в протоколе ТС ПИоТ

Проанализируем назначение полей перед тем, как переходить к коду:

  1. Поле id — уникальный идентификатор зарегистрированного в ГИС МТ кассового ПО (ПМСР). Выдается разработчику в личном кабинете после сертификации решения. Если кастомная конфигурация 1С 7.7 не проходила отдельную сертификацию, протокол допускает передачу заводского номера фискального накопителя (ФН) подключенной онлайн-кассы либо нулевого GUID (00000000-0000-0000-0000-000000000000). Также на практике допустимо использовать открытый идентификатор сертифицированного тиражного решения 1С.
  2. Поле token — по регламенту это контрольная сумма исполняемого файла модуля. Локальный драйвер ТС ПИоТ на уровне кассового узла не выполняет динамическую бинарную проверку файла платформы 1С на каждый чих — проверяется факт наличия непустой валидной строки определенного формата (хэш MD5, CRC32 или GUID). В типовых решениях 1С более поздних платформ для этого вычисляется хэш строки версии конфигурации или подставляется статический хэш.

Вариант 1. Использование фиксированного значения токена (рекомендуемый)

Рассмотрим самый надежный и быстрый с точки зрения производительности кассы вариант. Динамический расчет хэш-суммы файла при каждом сканировании марки создает ощутимые задержки интерфейса кассира, а регламент ответа ТС ПИоТ жестко ограничен (не более 1,5 секунды).

Поскольку сервер ТС ПИоТ при локальной валидации не сверяет байты памяти процесса, контрольную сумму используемой обработки или конфигурации достаточно рассчитать один раз и зашить в модуль строковой константой:

  1. Вычисляем контрольную сумму внешней кассовой обработки (.ert) или файла платформы любой системной утилитой.
  2. Прописываем результат в коде формирования JSON-пакета запроса к сервису.

Посмотрим на пример формирования структуры запроса к локальному сервису:


Функция СформироватьКлиентИнфо(ИдентификаторПО)
    Перем СтрJSON;
    
    // Статический токен, вычисленный заранее (например, MD5 или CRC32)
    Токен = "dbe9fd9d592356e73f12edab471c9f00";
    
    СтрJSON = "{" +
              """id"": """ + ИдентификаторПО + """," +
              """token"": """ + Токен + """" +
              "}";
              
    Возврат СтрJSON;
КонецФункции

Вариант 2. Динамический расчет контрольной суммы через утилиту certutil

Если регламент вашей организации строго требует динамического расчета контрольной суммы файла перед сессией продаж, разберем способ реализации через стандартную утилиту Windows certutil без использования сторонних внешних компонент.

Чтобы избежать мерцания консольного окна при вызове через команду КомандаСистемы, используем системный объект WScript.Shell с параметром скрытия окна:


Функция ПолучитьХэшФайла(ПутьКФайлу)
    Перем Скрипт, ФСО, ВремФайл, Команда, ТекстФайла, СтрХэш;
    
    Скрипт = СоздатьОбъект("WScript.Shell");
    ФСО = СоздатьОбъект("Scripting.FileSystemObject");
    
    // Формируем имя временного файла для вывода
    ВремФайл = КаталогВременныхФайлов() + "hash_tmp.txt";
    
    // Формируем команду certutil для расчета MD5
    Команда = "cmd.exe /c certutil -hashfile """ + ПутьКФайлу + """ MD5 > """ + ВремФайл + """";
    
    // 0 - скрыть окно, 1 - ожидать завершения процесса
    Скрипт.Run(Команда, 0, 1);
    
    СтрХэш = "";
    Если ФСО.FileExists(ВремФайл) = 1 Тогда
        ТекстФайла = СоздатьОбъект("Текст");
        ТекстФайла.Открыть(ВремФайл);
        // Вторая строка вывода certutil содержит требуемый хэш
        Если ТекстФайла.КоличествоСтрок() >= 2 Тогда
            СтрХэш = СокрЛП(ТекстФайла.ПолучитьСтроку(2));
            // Удаляем возможные пробелы из хэш-строки
            СтрХэш = СтрЗаменить(СтрХэш, " ", "");
        КонецЕсли;
        ФСО.DeleteFile(ВремФайл);
    КонецЕсли;
    
    Возврат СтрХэш;
КонецФункции

Вычислять данный хэш рекомендуется один раз при запуске кассовой смены или при инициализации кассовой обработки, сохраняя результат в глобальную переменную. Запускать системные процессы на каждую позицию чека недопустимо, так как это приведет к зависанию рабочего места кассира.

Вариант 3. Использование внешних компонент и WinAPI

Для мгновенного расчета алгоритма CRC32 без обращения к дисковой подсистеме и командной строке можно задействовать внешние компоненты для 1С 7.7 (например, универсальные загрузчики DLL). В операционной системе Windows в библиотеке ntdll.dll присутствует стандартная экспортируемая функция RtlComputeCrc32, вычисляющая стандартный CRC32 блока памяти.

Отправка запроса из 1С 7.7 в локальный сервис ТС ПИоТ

Выясним, как передать полученные параметры id и token в локальный сервис. Взаимодействие с сервисом проверки кодов маркировки осуществляется по протоколу HTTP (REST API). Для отправки POST-запроса из 1С 7.7 используем COM-объект MSXML2.ServerXMLHTTP:


Функция ОтправитьЗапросВПИоТ(URL, ТелоJSON)
    Перем HTTP, Ответ;
    
    HTTP = СоздатьОбъект("MSXML2.ServerXMLHTTP");
    HTTP.Open("POST", URL, 0); // Синхронный запрос
    HTTP.SetRequestHeader("Content-Type", "application/json; charset=utf-8");
    
    // Устанавливаем таймауты: разрешение, соединение, отправка, получение (в мс)
    HTTP.setTimeouts(1500, 1500, 1500, 1500);
    
    Попытка
        HTTP.Send(ТелоJSON);
        Если HTTP.Status = 200 Тогда
            Ответ = HTTP.ResponseText;
        Иначе
            Ответ = "Ошибка HTTP: " + HTTP.Status;
        КонецЕсли;
    Исключение
        Ответ = "Ошибка соединения с ТС ПИоТ: " + ОписаниеОшибки();
    КонецПопытки;
    
    Возврат Ответ;
КонецФункции

В случае отсутствия собственного зарегистрированного ключа id и при возникновении ошибок валидации со стороны ТС ПИоТ наиболее практичным решением является перенос логики проверки разрешительного режима на уровень драйвера ККТ. Современные сертифицированные драйверы торгового оборудования берут на себя авторизацию в ТС ПИоТ, избавляя конфигурацию 1С 7.7 от необходимости самостоятельного расчета токенов и формирования структур протокола.

← На главную