Интеграция учетной системы 1С и фронт-офиса R-Keeper 7 (RK7) — стандартная задача при автоматизации ресторанного бизнеса и предприятий общественного питания. Двусторонний обмен данными позволяет исключить ручной ввод номенклатуры, оперативно обновлять цены на кассах и автоматически загружать результаты продаж для последующего списания ингредиентов и формирования отчетности в 1С. В данной статье мы подробно разберем, как настроить обмен данными, используя встроенный XML-интерфейс R-Keeper 7, проанализируем структуру XML-пакетов и реализуем отправку запросов напрямую из 1С без использования сторонних утилит.
Перед тем как переходить к написанию кода в 1С, проанализируем архитектурные особенности R-Keeper 7. В отличие от предыдущих версий, RK7 имеет четкое разделение серверов по назначению. Понимание этой архитектуры критически важно для корректной интеграции:
Выясним, какие команды используются для обмена данными через XML-интерфейс. Для работы со справочниками используются две основные команды:
GetRefData — запрос на получение информации о справочниках (например, выгрузка структуры меню из R-Keeper в 1С).SetRefData — запрос на создание, изменение или удаление элементов справочников (например, загрузка новой номенклатуры и цен из 1С в R-Keeper).Прежде чем отправлять HTTP-запросы из 1С, необходимо активировать и настроить XML-интерфейс в менеджерской станции R-Keeper. Разберем этот процесс по шагам:
rk7man.exe) под учетной записью с правами администратора.22331), который сервер будет прослушивать для входящих подключений.3355) и ограничим доступ с помощью специальной привилегии.1c_exchange) и зададим ему сложный пароль. Назначим данному пользователю роль, наделенную правами на использование XML-интерфейса. Данные авторизации (логин и пароль) будут использоваться для Basic-авторизации в HTTP-заголовках запросов из 1С.Рассмотрим структуру XML-пакета, который формируется в 1С для отправки в R-Keeper с целью создания или обновления блюд в меню. Посмотрим на практический пример:
<?xml version="1.0" encoding="utf-8"?>
<RK7Query>
<RK7Command CMD="SetRefData" RefName="MenuItems">
<Items>
<Item GUIDString="{5B3537CE-ECF0-4D6A-B0AE-F095FC4F0522}" MainParentIdent="{a70ab9c0-934b-49e4-91a8-cb2e85f1cbf2}" Code="101" Name="Чай зеленый" AltName="" Status="rsActive" TaxDishType="1" ExtCode="101" PRICETYPES-0="1500"/>
<Item GUIDString="{5a76323c-3a58-4bd8-8a91-478ca2568ecc}" MainParentIdent="{85A6B558-D59B-44F2-A103-031E473D6843}" Code="102" Name="Судак запеченный" AltName="" Status="rsActive" TaxDishType="1" ExtCode="102" PRICETYPES-0="5500" CLASSIFICATORGROUPS-2560="27"/>
</Items>
</RK7Command>
</RK7Query>
Проанализируем ключевые атрибуты элементов, представленных в данном XML-файле:
RefName="MenuItems" — указывает системе, что мы производим манипуляции со справочником «Элементы меню».GUIDString — глобальный уникальный идентификатор элемента. Настоятельно рекомендуем генерировать GUID на стороне 1С и передавать его в R-Keeper. Это гарантирует надежное сопоставление объектов при последующих обменах и исключает дублирование записей.MainParentIdent — GUID родительской группы меню, в которую будет помещено блюдо.Code — числовой код элемента внутри R-Keeper.Name — наименование блюда, отображаемое на кассовом терминале и печатающееся в чеке.Status="rsActive" — статус элемента. Значение rsActive делает блюдо доступным для продажи. Если позицию необходимо временно скрыть из меню, можно передать статус rsDraft (черновик) или rsDeleted (удален).ExtCode — внешний код элемента. Здесь мы можем передать код номенклатуры или код быстрого выбора из 1С.PRICETYPES-0="1500" — параметр установки цены. Обратим внимание на два важнейших момента. Во-первых, суффикс -0 после дефиса указывает на внутренний идентификатор типа цены в R-Keeper (например, базовая цена). Во-вторых, цена передается в копейках (минимальных долях валюты). Значение 1500 соответствует цене 15 рублей 00 копеек, а 5500 — 55 рублям.Выясним, как организовать отправку таких пакетов из 1С без использования внешних скриптов или консольной утилиты curl. Для реализации обмена воспользуемся стандартными объектами платформы 1С:Предприятие 8 — HTTPСоединение и HTTPЗапрос. Разберем этот процесс по шагам в коде:
&НаСервере
Процедура ЗагрузитьМенюВRKeeper()
// 1. Определяем параметры подключения к серверу справочников R-Keeper
СерверАдрес = "192.168.101.82";
СерверПорт = 3355;
Пользователь = "1c_exchange";
Пароль = "StrongPassword987";
// 2. Формируем тело XML-запроса
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку("UTF-8");
ЗаписьXML.ЗаписатьОбъявлениеXML();
ЗаписьXML.ЗаписатьНачалоЭлемента("RK7Query");
ЗаписьXML.ЗаписатьНачалоЭлемента("RK7Command");
ЗаписьXML.ЗаписатьАтрибут("CMD", "SetRefData");
ЗаписьXML.ЗаписатьАтрибут("RefName", "MenuItems");
ЗаписьXML.ЗаписатьНачалоЭлемента("Items");
// Пример добавления одного элемента меню (Кофе Эспрессо)
ЗаписьXML.ЗаписатьНачалоЭлемента("Item");
ЗаписьXML.ЗаписатьАтрибут("GUIDString", "{9C3F87D1-4E6B-41AF-A190-2B3E4F8A52D1}");
ЗаписьXML.ЗаписатьАтрибут("MainParentIdent", "{85A6B558-D59B-44F2-A103-031E473D6843}");
ЗаписьXML.ЗаписатьАтрибут("Code", "103");
ЗаписьXML.ЗаписатьАтрибут("Name", "Кофе Эспрессо");
ЗаписьXML.ЗаписатьАтрибут("Status", "rsActive");
ЗаписьXML.ЗаписатьАтрибут("ExtCode", "103");
ЗаписьXML.ЗаписатьАтрибут("PRICETYPES-0", "12000"); // Цена: 120.00 руб.
ЗаписьXML.ЗаписатьКонецЭлемента(); // Item
ЗаписьXML.ЗаписатьКонецЭлемента(); // Items
ЗаписьXML.ЗаписатьКонецЭлемента(); // RK7Command
ЗаписьXML.ЗаписатьКонецЭлемента(); // RK7Query
ТекстXMLЗапроса = ЗаписьXML.Закрыть();
// 3. Настраиваем защищенное соединение SSL, если R-Keeper требует HTTPS
// Если используется обычный HTTP, передаем Неопределено
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL();
Попытка
Соединение = Новый HTTPСоединение(
СерверАдрес,
СерверПорт,
Пользователь,
Пароль,
, // Прокси
30, // Таймаут соединения в секундах
ЗащищенноеСоединение
);
Исключение
ЗаписатьВЛог("Не удалось установить соединение с сервером R-Keeper: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
// 4. Формируем HTTP POST запрос
АдресРесурса = "rk7api/v0/xmlinterface.xml";
Запрос = Новый HTTPЗапрос(АдресРесурса);
Запрос.Заголовки.Вставить("Content-Type", "text/xml; charset=utf-8");
Запрос.УстановитьТелоИзСтроки(ТекстXMLЗапроса, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
Попытка
// 5. Отправляем запрос на сервер R-Keeper
Ответ = Соединение.ОтправитьДляОбработки(Запрос);
Если Ответ.КодСостояния = 200 Тогда
СтрокаОтвета = Ответ.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
ОбработатьОтветСервера(СтрокаОтвета);
Иначе
ЗаписатьВЛог(СтрШаблон("Ошибка сервера R-Keeper. Код состояния: %1. Ответ: %2",
Ответ.КодСостояния, Ответ.ПолучитьТелоКакСтроку()));
КонецЕсли;
Исключение
ЗаписатьВЛог("Ошибка отправки запроса: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Рассмотрим структуру XML-пакета, который возвращает сервер R-Keeper в качестве ответа на наш запрос. При успешном выполнении команды ответ выглядит следующим образом:
<?xml version="1.0" encoding="utf-8"?>
<RK7QueryResult ServerVersion="7.6.5.12" Status="Ok" Command="SetRefData" ErrorText="" DateTime="2023-10-24T15:30:22">
<ItemsProcessed Count="1"/>
</RK7QueryResult>
Если во время импорта возникли какие-либо ошибки (например, неверный формат GUID, дублирование кода блюда или отсутствие прав у пользователя), атрибут Status примет значение Error, а описание проблемы будет передано в атрибуте ErrorText. Разберем, как прочитать этот ответ в 1С с помощью объекта ЧтениеXML:
&НаСервере
Процедура ОбработатьОтветСервера(Знач СтрокаXML)
Чтение = Новый ЧтениеXML;
Чтение.УстановитьСтроку(СтрокаXML);
СтатусЗапроса = "";
ТекстОшибки = "";
Пока Чтение.Прочитать() Цикл
Если Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента И Чтение.Имя = "RK7QueryResult" Тогда
Если Чтение.ПрочитатьАтрибут("Status") Тогда
СтатусЗапроса = Чтение.Значение;
КонецЕсли;
Если Чтение.ПрочитатьАтрибут("ErrorText") Тогда
ТекстОшибки = Чтение.Значение;
КонецЕсли;
Прервать;
КонецЕсли;
КонецЦикла;
Если СтатусЗапроса = "Ok" Тогда
Сообщить("Синхронизация данных выполнена успешно!");
Иначе
Сообщить(СтрШаблон("При обработке пакета в R-Keeper возникла ошибка: %1", ТекстОшибки));
КонецЕсли;
КонецПроцедуры
Хотя интеграция по XML-протоколу является гибкой и универсальной, рассмотрим альтернативные подходы, которые часто применяются на практике в зависимости от бизнес-требований:
COMОбъект("ADODB.Connection"). Это позволит извлекать данные со скоростью работы СУБД, не мешая кассирам принимать заказы.Таким образом, мы рассмотрели полный цикл интеграции 1С с R-Keeper 7: от настройки кассовых драйверов до программной реализации отправки запросов и разбора XML-ответов. Выбор конкретного метода интеграции зависит от масштаба вашей ресторанной сети, требований к безопасности локальной сети и объемов передаваемой информации.