Как настроить интеграцию 1С и R-Keeper 7 через XML-интерфейс для загрузки меню и обмена данными?

Программист 1С v8.3 (Управляемые формы) Управленческий учет IT и автоматизация бизнеса
← На главную

Интеграция учетной системы 1С и фронт-офиса R-Keeper 7 (RK7) — стандартная задача при автоматизации ресторанного бизнеса и предприятий общественного питания. Двусторонний обмен данными позволяет исключить ручной ввод номенклатуры, оперативно обновлять цены на кассах и автоматически загружать результаты продаж для последующего списания ингредиентов и формирования отчетности в 1С. В данной статье мы подробно разберем, как настроить обмен данными, используя встроенный XML-интерфейс R-Keeper 7, проанализируем структуру XML-пакетов и реализуем отправку запросов напрямую из 1С без использования сторонних утилит.

Архитектура обмена данными в R-Keeper 7

Перед тем как переходить к написанию кода в 1С, проанализируем архитектурные особенности R-Keeper 7. В отличие от предыдущих версий, RK7 имеет четкое разделение серверов по назначению. Понимание этой архитектуры критически важно для корректной интеграции:

  1. Сервер справочников (Reference Server). Этот сервер отвечает за хранение и редактирование глобальной базы данных системы: меню, модификаторов, цен, персонала, скидок и настроек. Любые запросы на создание или изменение объектов (например, добавление новых блюд) должны отправляться исключительно на этот сервер. Попытка отправить запрос изменения данных на кассовый сервер вернет ошибку.
  2. Кассовый сервер (Cash Server). Данный сервер обслуживает оперативную работу кассовых станций в режиме реального времени. На кассовый сервер отправляются запросы оперативного характера: создание или редактирование столов/заказов, оплата счетов, получение текущего статуса смены.

Выясним, какие команды используются для обмена данными через XML-интерфейс. Для работы со справочниками используются две основные команды:

Настройка R-Keeper 7 для работы с XML-интерфейсом

Прежде чем отправлять HTTP-запросы из 1С, необходимо активировать и настроить XML-интерфейс в менеджерской станции R-Keeper. Разберем этот процесс по шагам:

  1. Запустим менеджерскую станцию R-Keeper 7 (rk7man.exe) под учетной записью с правами администратора.
  2. Перейдем в меню Сервис -> Станции и устройства.
  3. В дереве объектов выберем нужный сервер. Если мы планируем изменять справочники меню, выбираем Сервер справочников (Reference Server).
  4. Перейдем на вкладку Устройства и добавим драйвер XML interface for windows.
  5. В свойствах добавленного драйвера зададим порт (например, 22331), который сервер будет прослушивать для входящих подключений.
  6. Свяжем созданный интерфейс с логическим интерфейсом в меню Сервис -> Интерфейсы.
  7. Для обеспечения безопасности настроим авторизацию. В свойствах сервера в секции HTTP Server зададим порт доступа (например, 3355) и ограничим доступ с помощью специальной привилегии.
  8. В справочнике Работники создадим технического пользователя (например, с именем 1c_exchange) и зададим ему сложный пароль. Назначим данному пользователю роль, наделенную правами на использование XML-интерфейса. Данные авторизации (логин и пароль) будут использоваться для Basic-авторизации в HTTP-заголовках запросов из 1С.

Структура XML-запроса SetRefData для загрузки меню

Рассмотрим структуру 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-файле:

Реализация отправки запросов напрямую из 1С

Выясним, как организовать отправку таких пакетов из 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 в 1С

Рассмотрим структуру 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-протоколу является гибкой и универсальной, рассмотрим альтернативные подходы, которые часто применяются на практике в зависимости от бизнес-требований:

  1. Прямое подключение к базе данных MS SQL. Если вам требуется забирать большие массивы исторических данных (например, закрытые чеки за прошлую смену для сотен ресторанов), XML-запросы могут существенно нагружать кассовый сервер во время его работы. В этом случае эффективнее написать прямой SQL-запрос к транзакционной базе данных R-Keeper 7, используя COM-соединение COMОбъект("ADODB.Connection"). Это позволит извлекать данные со скоростью работы СУБД, не мешая кассирам принимать заказы.
  2. Готовые отраслевые конфигурации 1С. Специализированные решения, такие как «1С:Общепит» или конфигурации от компании Рарус, содержат в себе готовые встроенные обработки для прямой загрузки продаж из R-Keeper 7. Они поддерживают интеграцию на уровне базы данных, автоматически сопоставляют справочники номенклатуры по кодам или штрихкодам и мгновенно создают документы «Выпуск продукции списанием» или «Отчет о розничных продажах». Использование готовых решений позволяет значительно сократить время разработки.
  3. Облачный API (White Server). В современных инфраструктурах r_keeper обмен данными часто организуется через облачный шлюз White Server. В таком сценарии 1С общается по протоколу JSON-RPC с единым облачным сервисом, который сам маршрутизирует запросы до касс ресторанов. Это решает проблему безопасности, так как вам больше не нужно настраивать сложные сетевые маршруты, VPN-каналы или пробрасывать порты до каждого локального ресторана.

Таким образом, мы рассмотрели полный цикл интеграции 1С с R-Keeper 7: от настройки кассовых драйверов до программной реализации отправки запросов и разбора XML-ответов. Выбор конкретного метода интеграции зависит от масштаба вашей ресторанной сети, требований к безопасности локальной сети и объемов передаваемой информации.

← На главную