Интеграция устаревших платформ, таких как 1С:Предприятие 7.7, с современным торговым оборудованием и веб-сервисами часто ставит разработчиков в тупик. Популярное решение для работы с онлайн-кассами — KKMServer — взаимодействует с учетными системами по протоколу HTTP, обмениваясь данными в формате JSON.
Попытка использовать привычный COM-объект MSScriptControl.ScriptControl для выполнения готового JavaScript-кода (например, с использованием библиотеки jQuery и ее методов вроде $.ajax или $.toJSON) в среде 1С 7.7 неизбежно приводит к ошибкам. Выясним причину этой проблемы и рассмотрим надежное, проверенное временем решение без привлечения тяжелых браузерных скриптов.
Рассмотрим подробнее, почему стандартный код, отлично работающий в браузере или Visual Studio Code, выдает ошибку в 1С при попытке выполнить его через ScriptControl. Основных причин две:
jQuery (символом которой является $) изначально создана для работы внутри веб-браузера. Ей жизненно необходимы такие глобальные объекты, как window, document, а также поддержка дерева элементов DOM. Внутри COM-объекта MSScriptControl разворачивается «голый» движок выполнения JScript (или VBScript), в котором нет никаких браузерных объектов. Именно поэтому возникает ошибка «$ - не определен».MSScriptControl использует системную библиотеку jscript.dll, синтаксис которой заморожен на уровне стандарта ECMAScript 3 (эквивалент Internet Explorer 8). Он физически не понимает современные конструкции JS (промисы, стрелочные функции, объявленные через const и let переменные) и даже базовые методы вроде JSON.stringify() или JSON.parse() на старых версиях операционных систем.Попытка «подключить jQuery» к MSScriptControl — это тупиковый путь. Нам необходимо полностью пересмотреть архитектуру взаимодействия.
Проанализируем ситуацию: для общения с KKMServer нам не нужен браузер и не нужны сложные интерактивные скрипты (AJAX в классическом понимании). Нам требуется выполнить три простых шага:
http://localhost:5893/Execute).Для реализации этой схемы идеально подходит связка встроенного языка 1С 7.7 и системного COM-объекта WinHttp.WinHttpRequest.5.1.
Поскольку JSON — это обычная текстовая строка определенного формата, мы можем легко собрать её вручную, используя стандартные строковые функции 1С. Разберем пример формирования простейшей команды для KKMServer на встроенном языке:
// Функция формирует JSON-строку для проверки связи с кассой
Функция СформироватьЗапросСтатуса()
JSON = "{";
JSON = JSON + """Command"": ""GetStatus"",";
JSON = JSON + """NumDevice"": 0,";
JSON = JSON + """IdCommand"": """ + СокрЛП(УникальныйИдентификатор) + """";
JSON = JSON + "}";
Возврат JSON;
КонецФункции
Если структура данных сложная, можно написать универсальную процедуру обхода СписокЗначений или использовать внешние компоненты (например, класс JSON для 1С++), но для большинства кассовых операций достаточно простой текстовой сборки.
Критически важный нюанс: 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();
Возврат Результат;
КонецФункции
Теперь соберем все воедино и отправим запрос на 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, только параметры кодировок при чтении и записи меняются местами.
После получения ответа нам нужно понять, успешно ли напечатался чек. Ответ от 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.