При работе с решениями от компании «Штрих-М» (например, «Штрих-М: Торговое предприятие 5.2» или «Штрих-М: Кассир 5») разработчики часто сталкиваются с проблемой: при попытке изменить рабочее место кассира (РМК) стандартную форму регистрации продаж невозможно найти в дереве метаданных конфигуратора. Попытки найти форму «в лоб» не приносят успеха, так как архитектура этих решений построена на динамическом формировании интерфейса и использовании механизма логических модулей.
В этой статье мы подробно разберем, как устроено рабочее место кассира в решениях «Штрих-М», выясним причину «исчезновения» формы из конфигуратора и рассмотрим два эффективных способа добавления новой кнопки на форму РМК: визуальный (без изменения кода) и программный (с сохранением возможности легкого обновления конфигурации).
Разработчики отраслевых решений «Штрих-М» применили модульный подход. Основная логика интерфейса кассира вынесена во внешние библиотеки и логические модули. Объект LogicalModules (Логические модули) управляет загрузкой внешних обработок, перехватывает события формы и динамически генерирует элементы управления. Это позволяет обновлять конфигурацию без потери индивидуальных доработок конкретного торгового объекта.
Если нам нужно кастомизировать интерфейс, у нас есть два пути: воспользоваться встроенным конструктором или написать собственный логический модуль.
---
Перед тем как приступать к написанию кода, проверим, позволяет ли система решить задачу штатными средствами. В «Штрих-М» встроен мощный визуальный редактор — Адаптивный интерфейс. Если вам нужно добавить кнопку для вызова стандартной кассовой функции (например, применение скидки, выбор определенного товара, аннулирование чека, вызов меню), конфигуратор вообще не понадобится.
Разберем процесс настройки по шагам:
Esc). На вопрос системы о сохранении изменений ответим «Да». Чтобы новые настройки вступили в силу, обязательно перезапустим кассовую программу.---
Если перед нами стоит задача добавить кнопку с уникальной бизнес-логикой, которой нет в стандартном списке функций РМК, нам потребуется программная доработка. Прямое изменение форм в конфигураторе крайне не рекомендуется — это усложнит поддержку и обновление информационной базы.
Правильный путь — использование API LogicalModules. Мы создадим внешнюю обработку (файл с расширением .epf), которая перехватит событие открытия формы РМК и динамически добавит на нее нашу кнопку.
Внешние файлы обработок логики должны храниться в каталоге базы данных на кассовом компьютере. Путь к ним выглядит следующим образом:
...%КаталогБазыДанных%\ExtFiles\LogicalModules\ (в зависимости от релиза папка может называться ExtForms\LogicalModules).
При выполнении ключевых операций (открытие формы, проведение чека, расчет скидки) ядро «Штрих-М» обращается к менеджеру логических модулей. Модули могут работать в двух режимах:
Отказ = Истина.Рассмотрим пример создания логического модуля для динамического добавления кнопки.
Шаг 1. Создание внешней обработки
Создадим в конфигураторе новую внешнюю обработку и назовем ее, например, ДобавлениеПользовательскойКнопки.epf. Сохраним ее в вышеуказанную папку LogicalModules.
Шаг 2. Написание процедуры инициализации модуля
В модуле созданной внешней обработки пропишем процедуру, которая будет регистрировать наш перехватчик при запуске системы:
Процедура ИнициализироватьМодуль() Экспорт
// Регистрируем обработчик события "При открытии" формы регистрации продаж
МенеджерОбъектов.ПолучитьОбщийОбъект("LogicalModules").НазначитьОбработчик(
"Супервизор.РегистрацияПродаж.ПриОткрытии.ПостОбработка",
ЭтаФорма,
Неопределено
);
КонецПроцедуры
Шаг 3. Реализация перехватчика и динамическое создание кнопки
Теперь добавим в этот же модуль процедуру, которая будет вызываться в момент открытия формы РМК. В этой процедуре мы найдем нужную группу элементов на форме и добавим туда новую команду и кнопку:
Процедура Супервизор_РегистрацияПродаж_ПриОткрытии_ПостОбработка(ФормаРегистрации) Экспорт
// Попробуем найти на форме группу кнопок, куда мы хотим поместить наш элемент
ГруппаКнопок = ФормаРегистрации.Элементы.Найти("ГруппаБыстрыеТовары");
Если ГруппаКнопок <> Неопределено Тогда
// Создаем команду формы, которая будет отвечать за логику нажатия кнопки
НоваяКоманда = ФормаРегистрации.Команды.Добавить("ПользовательскаяКомандаДействия");
// Указываем имя процедуры в нашем логическом модуле, которая будет вызвана при нажатии
НоваяКоманда.Действие = "Подключаемый_ВыполнитьПользовательскоеДействие";
// Добавляем саму кнопку на форму в найденную группу элементов
НоваяКнопка = ФормаРегистрации.Элементы.Добавить("КнопкаПользовательскогоДействия", Тип("КнопкаФормы"), ГруппаКнопок);
НоваяКнопка.Заголовок = "Спец. Действие";
НоваяКнопка.ИмяКоманды = "ПользовательскаяКомандаДействия";
КонецЕсли;
КонецПроцедуры
Шаг 4. Написание обработчика нажатия кнопки
Осталось описать алгоритм, который будет выполняться при клике кассира по созданной кнопке:
Процедура Подключаемый_ВыполнитьПользовательскоеДействие() Экспорт
// Здесь описываем логику вашей уникальной функции
ПоказатьПредупреждение(, "Пользовательское действие успешно выполнено!");
КонецПроцедуры
Благодаря такому подходу мы не изменили ни одной строчки кода в основной конфигурации «Штрих-М». При обновлении программы все наши доработки интерфейса РМК гарантированно сохранят свою работоспособность, так как они находятся во внешнем файле и подключаются динамически в момент работы приложения.