Как создать кастомную кнопку в РМК 1С:Розница через расширение и интегрировать её с внешним сервисом

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

Рабочее место кассира (РМК) — это сердце розничной торговли в системе 1С. Часто стандартного функционала недостаточно, и возникает необходимость добавить специфическую кнопку, например, для интеграции с программой лояльности стороннего сервиса или вызова особых форм обработки данных. В этой статье мы подробно разберем, как добавить свою кнопку в интерфейс РМК, не снимая основную конфигурацию с поддержки, и реализуем логику обработки внешнего запроса.

Зачем использовать расширения для модификации РМК

Использование механизма расширений — это «золотой стандарт» современной разработки на платформе 1С. Проанализируем основные преимущества этого подхода. Во-первых, вы сохраняете типовую конфигурацию на полной поддержке, что значительно упрощает процесс будущих обновлений. Во-вторых, весь ваш код локализован в одном месте, что облегчает отладку. При разработке в РМК это критически важно, так как фирма «1С» часто обновляет интерфейс и логику работы с торговым оборудованием.

Шаг 1: Добавление кнопки в командную панель формы РМК

Рассмотрим процесс добавления элемента управления. Прежде всего, нам необходимо создать новое расширение и добавить в него форму ФормаРМК (обычно она находится в обработке РМК или ПодборТоваровВРМК, в зависимости от версии «Розницы»).

Разберем последовательность действий:

  1. Откроем конфигуратор и создадим новое расширение (сняв галочки «Безопасный режим» и «Защита от опасных действий»).
  2. Найдем в основной конфигурации обработку РМК и её основную форму. Нажмем правой кнопкой мыши — «Добавить в расширение».
  3. В расширении перейдем на вкладку «Командный интерфейс» или просто добавим новую команду формы. Назовем её, например, СервисЛояльности.
  4. Перетащим созданную команду на форму в нужную группу кнопок (обычно это командная панель или группа дополнительных кнопок).

Важный нюанс: В современных версиях «1С:Розница 2.3» и «3.0» интерфейс РМК может строиться динамически. Если кнопка не появляется после добавления на форму, проанализируем процедуру ПриСозданииНаСервере. Возможно, состав кнопок управляется программно через общий модуль РМКСервер. В таком случае нам потребуется применить аннотацию &После к процедуре формирования командной панели.

Шаг 2: Создание обработчика нажатия кнопки

После того как кнопка появилась в интерфейсе, нам нужно написать код, который будет выполняться при нажатии. Выясним, как правильно связать действие на клиенте с логикой на сервере. Создадим обработчик команды СервисЛояльности:


&НаКлиенте
Процедура СервисЛояльности(Команда)
    
    // Подготовим структуру параметров для открытия нашей формы
    ПараметрыФормы = Новый Структура;
    ПараметрыФормы.Вставить("РежимВыбора", Истина);
    
    // Открываем форму для сканирования или ввода данных
    ОткрытьФорму("Расширение1:ФормаСканированияКарты", ПараметрыФормы, ЭтаФорма);
    
КонецПроцедуры

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

Шаг 3: Перехват события сканирования штрихкода

Если ваша задача — считать карту лояльности через сторонний сервис, проанализируем более элегантный способ: использование типового механизма обработки внешних событий. Вместо открытия новой формы, мы можем «научить» РМК распознавать штрихкоды вашего сервиса.

Для этого в расширении найдем процедуру ОбработкаВнешнегоСобытия и добавим к ней обработчик с аннотацией &Вместо или &После. Посмотрим на пример кода:


&НаКлиенте
&После("Подключаемое_ВыполнитьОбработкуШтрихкода")
Процедура Расш1_Подключаемое_ВыполнитьОбработкуШтрихкода(ДанныеШтрихкода, Отказ)
    
    // Предположим, карты нашего сервиса начинаются с префикса "99"
    Если Лев(ДанныеШтрихкода.Штрихкод, 2) = "99" Тогда
        // Останавливаем стандартную обработку 1С, если это нужно
        // И запускаем свою логику интеграции
        ПолучитьДанныеИзВнешнегоСервиса(ДанныеШтрихкода.Штрихкод);
    КонецЕсли;
    
КонецПроцедуры

Шаг 4: Интеграция с внешним API (HTTP-запрос)

Теперь разберем самый ответственный этап — связь с бэкендом. Для этого мы будем использовать объект HTTPСоединение. Нам нужно отправить ID клиента (полученный из штрихкода) и получить в ответ размер скидки или количество баллов.

Проанализируем пример серверной функции для выполнения запроса:


&НаСервереБезКонтекста
Функция ЗапроситьДанныеСервиса(Знач НомерКарты)
    
    Сервер = "api.loyalty-service.ru";
    Ресурс = "/v1/get_discount?card=" + НомерКарты;
    
    Попытка
        Соединение = Новый HTTPСоединение(Сервер, 443, , , , , Новый ЗащищенноеСоединениеOpenSSL());
        Запрос = Новый HTTPЗапрос(Ресурс);
        Ответ = Соединение.Получить(Запрос);
        
        Если Ответ.КодСостояния = 200 Тогда
            // Парсим JSON ответ
            ЧтениеJSON = Новый ЧтениеJSON;
            ЧтениеJSON.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());
            Данные = ПрочитатьJSON(ЧтениеJSON);
            Возврат Данные.ПроцентСкидки;
        КонецЕсли;
    Исключение
        ЗаписьЖурналаРегистрации("ИнтеграцияЛояльность", УровеньЖурналаРегистрации.Ошибка, , , ОписаниеОшибки());
        Возврат 0;
    КонецПопытки;
    
КонецФункции

Важно: При работе в РМК всегда учитывайте возможность отсутствия интернета. Кассир не должен ждать вечно, если ваш сервер недоступен. Обязательно устанавливайте таймауты в объекте HTTPСоединение.

Шаг 5: Программное применение скидки в чеке

Выясним, как отразить полученную скидку в текущем чеке РМК. После получения процента скидки от сервиса, нам нужно обновить данные в табличной части товаров. В «1С:Розница» это лучше делать через механизм ручных скидок или путем прямой модификации колонки ПроцентРучнойСкидки.

Рассмотрим пример кода, который обходит строки чека и устанавливает скидку:


&НаСервере
Процедура ПрименитьСкидкуКЧеку(Процент)
    
    ОбъектЧека = ДанныеФормыВЗначение(Объект, Тип("ДокументОбъект.ЧекККМ"));
    
    Для Каждого СтрокаТовара Из ОбъектЧека.Товары Цикл
        СтрокаТовара.ПроцентРучнойСкидки = Процент;
    КонецЦикла;
    
    // Пересчитываем итоги документа по правилам конфигурации
    ОбъектЧека.РассчитатьСкидкиНаценки();
    
    ЗначениеВДанныеФормы(ОбъектЧека, Объект);
    
КонецПроцедуры

Типичные ошибки при реализации

Разберем, почему иногда кнопка добавляется, но «ничего не происходит», как упоминалось в сообщениях форума. Проанализируем основные причины:

  1. Неправильное имя обработчика: Проверьте, что в свойстве элемента формы «Действие» указано именно то имя процедуры, которое вы написали в модуле.
  2. Отсутствие контекста: Если вы добавили кнопку в расширение, но не перенесли в расширение связанные объекты (например, справочники, которые используются в коде), выполнение может прерваться с ошибкой.
  3. Конфликт имен: Если в основной конфигурации уже есть команда с таким именем, ваше расширение может вести себя непредсказуемо. Всегда используйте уникальные префиксы (например, МойСервис_КнопкаЛояльности).
  4. Обновление интерфейса: Если РМК в вашей версии динамическое, кнопка может быть перекрыта другими элементами при изменении размера окна. Используйте привязки и группы в дизайнере формы.

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

← На главную