Как интегрировать 1С 7.7 с KKMServer и работать с JSON без MSScriptControl?

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

Интеграция устаревших платформ, таких как 1С:Предприятие 7.7, с современным торговым оборудованием и веб-сервисами часто ставит разработчиков в тупик. Популярное решение для работы с онлайн-кассами — KKMServer — взаимодействует с учетными системами по протоколу HTTP, обмениваясь данными в формате JSON.

Попытка использовать привычный COM-объект MSScriptControl.ScriptControl для выполнения готового JavaScript-кода (например, с использованием библиотеки jQuery и ее методов вроде $.ajax или $.toJSON) в среде 1С 7.7 неизбежно приводит к ошибкам. Выясним причину этой проблемы и рассмотрим надежное, проверенное временем решение без привлечения тяжелых браузерных скриптов.

Почему MSScriptControl «не переваривает» современный JavaScript?

Рассмотрим подробнее, почему стандартный код, отлично работающий в браузере или Visual Studio Code, выдает ошибку в 1С при попытке выполнить его через ScriptControl. Основных причин две:

  1. Отсутствие окружения (DOM/BOM). Библиотека jQuery (символом которой является $) изначально создана для работы внутри веб-браузера. Ей жизненно необходимы такие глобальные объекты, как window, document, а также поддержка дерева элементов DOM. Внутри COM-объекта MSScriptControl разворачивается «голый» движок выполнения JScript (или VBScript), в котором нет никаких браузерных объектов. Именно поэтому возникает ошибка «$ - не определен».
  2. Устаревшая версия движка. Компонент MSScriptControl использует системную библиотеку jscript.dll, синтаксис которой заморожен на уровне стандарта ECMAScript 3 (эквивалент Internet Explorer 8). Он физически не понимает современные конструкции JS (промисы, стрелочные функции, объявленные через const и let переменные) и даже базовые методы вроде JSON.stringify() или JSON.parse() на старых версиях операционных систем.

Попытка «подключить jQuery» к MSScriptControl — это тупиковый путь. Нам необходимо полностью пересмотреть архитектуру взаимодействия.

Правильная архитектура взаимодействия: 1С 7.7 и KKMServer

Проанализируем ситуацию: для общения с KKMServer нам не нужен браузер и не нужны сложные интерактивные скрипты (AJAX в классическом понимании). Нам требуется выполнить три простых шага:

  1. Сформировать текстовую строку в формате JSON с параметрами команды.
  2. Отправить эту строку HTTP-запросом (POST) на локальный сервер KKMServer (обычно он доступен по адресу http://localhost:5893/Execute).
  3. Получить текстовый ответ, содержащий результаты операции, и разобрать его.

Для реализации этой схемы идеально подходит связка встроенного языка 1С 7.7 и системного COM-объекта WinHttp.WinHttpRequest.5.1.

Шаг 1. Формирование JSON-строки в 1С 7.7

Поскольку JSON — это обычная текстовая строка определенного формата, мы можем легко собрать её вручную, используя стандартные строковые функции 1С. Разберем пример формирования простейшей команды для KKMServer на встроенном языке:


// Функция формирует JSON-строку для проверки связи с кассой
Функция СформироватьЗапросСтатуса()
    JSON = "{";
    JSON = JSON + """Command"": ""GetStatus"",";
    JSON = JSON + """NumDevice"": 0,";
    JSON = JSON + """IdCommand"": """ + СокрЛП(УникальныйИдентификатор) + """";
    JSON = JSON + "}";
    Возврат JSON;
КонецФункции

Если структура данных сложная, можно написать универсальную процедуру обхода СписокЗначений или использовать внешние компоненты (например, класс JSON для 1С++), но для большинства кассовых операций достаточно простой текстовой сборки.

Шаг 2. Решение проблемы с кодировкой (UTF-8)

Критически важный нюанс: 1С:Предприятие 7.7 работает исключительно в однобайтовой кодировке Windows-1251 (ANSI). В то же время KKMServer и любые современные веб-сервисы ожидают получить данные в кодировке UTF-8. Если в наименованиях товаров будут русские буквы, простая отправка строки приведет к «кракозябрам» на чеке.

Для корректного перекодирования строк перед отправкой мы воспользуемся встроенным в Windows объектом ADODB.Stream. Посмотрим на пример функции перекодирования:


// Функция преобразует строку Windows-1251 в UTF-8
Функция ПреобразоватьВ_UTF8(СтрИсточник)
    Stream = СоздатьОбъект("ADODB.Stream");
    Stream.Type = 2; // Текстовый
    Stream.Mode = 3; // Чтение и запись
    Stream.Charset = "utf-8";
    Stream.Open();
    Stream.WriteText(СтрИсточник);
    Stream.Position = 0;
    Stream.Charset = "windows-1251";
    Результат = Stream.ReadText();
    Stream.Close();
    Возврат Результат;
КонецФункции

Шаг 3. Отправка HTTP-запроса через WinHttpRequest

Теперь соберем все воедино и отправим запрос на KKMServer. Использование объекта WinHttp.WinHttpRequest.5.1 позволяет избежать работы с капризным MSScriptControl и гарантирует стабильную отправку данных напрямую из кода 1С:


Процедура ВыполнитьКомандуККМ(ТекстКомандыJSON)
    // Преобразуем наш запрос в UTF-8
    КомандаUTF8 = ПреобразоватьВ_UTF8(ТекстКомандыJSON);
    
    // Инициализируем HTTP-соединение
    Попытка
        HTTP = СоздатьОбъект("WinHttp.WinHttpRequest.5.1");
    Исключение
        Предупреждение("Не удалось создать объект WinHttp.WinHttpRequest.5.1!");
        Возврат;
    КонецПопытки;
    
    URL = "http://localhost:5893/Execute";
    
    // Настраиваем параметры запроса
    HTTP.Open("POST", URL, 0); // Синхронный запрос
    HTTP.SetRequestHeader("Content-Type", "application/json; charset=utf-8");
    
    // Отправляем запрос
    Попытка
        HTTP.Send(КомандаUTF8);
    Исключение
        Предупреждение("Ошибка отправки запроса на KKMServer: " + ОписаниеОшибки());
        Возврат;
    КонецПопытки;
    
    // Получаем ответ сервера
    КодСостояния = HTTP.Status;
    Если КодСостояния = 200 Тогда
        ОтветСервераUTF8 = HTTP.ResponseText;
        // Преобразуем ответ обратно в Windows-1251 для читаемости в 1С
        Ответ1С = ПреобразоватьИз_UTF8(ОтветСервераUTF8);
        Сообщить("Ответ от ККМ: " + Ответ1С);
        
        // Переходим к анализу результатов
        ОбработатьОтветККМ(Ответ1С);
    Иначе
        Сообщить("Сервер вернул ошибку с кодом: " + КодСостояния, "!");
    КонецЕсли;
КонецПроцедуры

Для обратного перекодирования ответа из UTF-8 в Windows-1251 используется аналогичная процедура с объектом ADODB.Stream, только параметры кодировок при чтении и записи меняются местами.

Шаг 4. Простой разбор (парсинг) полученного JSON в 1С 7.7

После получения ответа нам нужно понять, успешно ли напечатался чек. Ответ от KKMServer также придет в формате JSON. Чтобы не писать сложный парсер строк на встроенном языке, мы можем применить MSScriptControl, но использовать его исключительно в качестве безопасного интерпретатора JSON, без подключения сторонних jQuery-библиотек:


Функция ПолучитьПараметрИзJSON(СтрокаJSON, ИмяПараметра)
    Попытка
        JS = СоздатьОбъект("MSScriptControl.ScriptControl");
        JS.Language = "JScript";
        // Безопасно парсим JSON-строку средствами JS
        JS.AddCode("function getVal(jsonStr, key) { var obj = eval('(' + jsonStr + ')'); return obj[key]; }");
        Значение = JS.Run("getVal", СтрокаJSON, ИмяПараметра);
        Возврат Значение;
    Исключение
        Возврат "";
    КонецПопытки;
КонецФункции

С помощью этой нехитрой функции мы можем легко проверить статус выполнения команды:


Процедура ОбработатьОтветККМ(ОтветJSON)
    СтатусОшибки = ПолучитьПараметрИзJSON(ОтветJSON, "Error");
    Если ПустаяСтрока(СтатусОшибки) = 0 Тогда
        Предупреждение("Касса вернула ошибку: " + СтатусОшибки);
    Иначе
        Сообщить("Чек успешно пробит!");
    КонецЕсли;
КонецПроцедуры

Подводя итог, отметим: отказ от использования веб-ориентированных библиотек в пользу системных COM-объектов Windows (WinHttpRequest и ADODB.Stream) позволяет создавать быстрые, надежные и независимые от версий браузера интеграционные решения непосредственно в коде старых конфигураций 1С:Предприятие 7.7.

← На главную