Рабочее место кассира (РМК) — это сердце розничной торговли в системе 1С. Часто стандартного функционала недостаточно, и возникает необходимость добавить специфическую кнопку, например, для интеграции с программой лояльности стороннего сервиса или вызова особых форм обработки данных. В этой статье мы подробно разберем, как добавить свою кнопку в интерфейс РМК, не снимая основную конфигурацию с поддержки, и реализуем логику обработки внешнего запроса.
Использование механизма расширений — это «золотой стандарт» современной разработки на платформе 1С. Проанализируем основные преимущества этого подхода. Во-первых, вы сохраняете типовую конфигурацию на полной поддержке, что значительно упрощает процесс будущих обновлений. Во-вторых, весь ваш код локализован в одном месте, что облегчает отладку. При разработке в РМК это критически важно, так как фирма «1С» часто обновляет интерфейс и логику работы с торговым оборудованием.
Рассмотрим процесс добавления элемента управления. Прежде всего, нам необходимо создать новое расширение и добавить в него форму ФормаРМК (обычно она находится в обработке РМК или ПодборТоваровВРМК, в зависимости от версии «Розницы»).
Разберем последовательность действий:
РМК и её основную форму. Нажмем правой кнопкой мыши — «Добавить в расширение».СервисЛояльности.Важный нюанс: В современных версиях «1С:Розница 2.3» и «3.0» интерфейс РМК может строиться динамически. Если кнопка не появляется после добавления на форму, проанализируем процедуру ПриСозданииНаСервере. Возможно, состав кнопок управляется программно через общий модуль РМКСервер. В таком случае нам потребуется применить аннотацию &После к процедуре формирования командной панели.
После того как кнопка появилась в интерфейсе, нам нужно написать код, который будет выполняться при нажатии. Выясним, как правильно связать действие на клиенте с логикой на сервере. Создадим обработчик команды СервисЛояльности:
&НаКлиенте
Процедура СервисЛояльности(Команда)
// Подготовим структуру параметров для открытия нашей формы
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("РежимВыбора", Истина);
// Открываем форму для сканирования или ввода данных
ОткрытьФорму("Расширение1:ФормаСканированияКарты", ПараметрыФормы, ЭтаФорма);
КонецПроцедуры
Рассмотрим ситуацию, когда кассир нажимает кнопку, и открывается вспомогательное окно. Однако, как отмечают опытные разработчики, создание отдельной формы для сканирования не всегда оправдано, так как РМК уже умеет слушать сканер штрихкодов в фоновом режиме.
Если ваша задача — считать карту лояльности через сторонний сервис, проанализируем более элегантный способ: использование типового механизма обработки внешних событий. Вместо открытия новой формы, мы можем «научить» РМК распознавать штрихкоды вашего сервиса.
Для этого в расширении найдем процедуру ОбработкаВнешнегоСобытия и добавим к ней обработчик с аннотацией &Вместо или &После. Посмотрим на пример кода:
&НаКлиенте
&После("Подключаемое_ВыполнитьОбработкуШтрихкода")
Процедура Расш1_Подключаемое_ВыполнитьОбработкуШтрихкода(ДанныеШтрихкода, Отказ)
// Предположим, карты нашего сервиса начинаются с префикса "99"
Если Лев(ДанныеШтрихкода.Штрихкод, 2) = "99" Тогда
// Останавливаем стандартную обработку 1С, если это нужно
// И запускаем свою логику интеграции
ПолучитьДанныеИзВнешнегоСервиса(ДанныеШтрихкода.Штрихкод);
КонецЕсли;
КонецПроцедуры
Теперь разберем самый ответственный этап — связь с бэкендом. Для этого мы будем использовать объект HTTPСоединение. Нам нужно отправить ID клиента (полученный из штрихкода) и получить в ответ размер скидки или количество баллов.
Проанализируем пример серверной функции для выполнения запроса:
&НаСервереБезКонтекста
Функция ЗапроситьДанныеСервиса(Знач НомерКарты)
Сервер = "api.loyalty-service.ru";
Ресурс = "/v1/get_discount?card=" + НомерКарты;
Попытка
Соединение = Новый HTTPСоединение(Сервер, 443, , , , , Новый ЗащищенноеСоединениеOpenSSL());
Запрос = Новый HTTPЗапрос(Ресурс);
Ответ = Соединение.Получить(Запрос);
Если Ответ.КодСостояния = 200 Тогда
// Парсим JSON ответ
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());
Данные = ПрочитатьJSON(ЧтениеJSON);
Возврат Данные.ПроцентСкидки;
КонецЕсли;
Исключение
ЗаписьЖурналаРегистрации("ИнтеграцияЛояльность", УровеньЖурналаРегистрации.Ошибка, , , ОписаниеОшибки());
Возврат 0;
КонецПопытки;
КонецФункции
Важно: При работе в РМК всегда учитывайте возможность отсутствия интернета. Кассир не должен ждать вечно, если ваш сервер недоступен. Обязательно устанавливайте таймауты в объекте HTTPСоединение.
Выясним, как отразить полученную скидку в текущем чеке РМК. После получения процента скидки от сервиса, нам нужно обновить данные в табличной части товаров. В «1С:Розница» это лучше делать через механизм ручных скидок или путем прямой модификации колонки ПроцентРучнойСкидки.
Рассмотрим пример кода, который обходит строки чека и устанавливает скидку:
&НаСервере
Процедура ПрименитьСкидкуКЧеку(Процент)
ОбъектЧека = ДанныеФормыВЗначение(Объект, Тип("ДокументОбъект.ЧекККМ"));
Для Каждого СтрокаТовара Из ОбъектЧека.Товары Цикл
СтрокаТовара.ПроцентРучнойСкидки = Процент;
КонецЦикла;
// Пересчитываем итоги документа по правилам конфигурации
ОбъектЧека.РассчитатьСкидкиНаценки();
ЗначениеВДанныеФормы(ОбъектЧека, Объект);
КонецПроцедуры
Разберем, почему иногда кнопка добавляется, но «ничего не происходит», как упоминалось в сообщениях форума. Проанализируем основные причины:
МойСервис_КнопкаЛояльности).Подводя итог, можно сказать, что добавление кастомной кнопки в РМК — это отличная задача для освоения расширений и механизмов интеграции 1С. Мы рассмотрели путь от визуального редактирования формы до программного взаимодействия с внешним API и применения результатов к документу продажи. Помните о безопасности и отказоустойчивости, так как любая задержка на кассе напрямую влияет на удовлетворенность покупателей.