Добавление новых интерактивных элементов в Рабочее место кассира (РМК) — это классическая задача при адаптации торговых решений на платформе 1С под нужды конкретного бизнеса. Однако разработчики часто сталкиваются с неприятной проблемой: после добавления кнопки через расширение и привязки к ней команды при нажатии на элемент управления ничего не происходит, либо открывается пустое окно предупреждения, а отладчик даже не заходит в процедуру-обработчик.
В этой статье мы подробно разберем, как устроена архитектура динамических панелей РМК изнутри, выясним истинные причины возникновения этой ошибки и рассмотрим пошаговое руководство по корректному добавлению кнопок с помощью механизма расширений.
Чтобы понять природу ошибки, давайте проанализируем, как типовые конфигурации (такие как 1С:Розница, 1С:Управление торговлей или 1С:Комплексная автоматизация) генерируют интерфейс РМК. Для обеспечения высокой скорости работы и гибкости настройки интерфейса разработчики фирмы 1С отказались от статичных кнопок на форме кассира. Вместо этого используется динамическое построение панелей.
Кнопки нижней и боковой панелей РМК очень часто представляют собой элементы формы типа Поле картинки или Поле надписи. Это сделано для реализации плиточного дизайна интерфейса. При создании формы система программно привязывает обработчик нажатия к каждой плитке, используя встроенный метод платформы:
ЭлементПолеКартинка.УстановитьДействие("Нажатие", ИмяКартинки + "Нажатие");
Когда мы пытаемся кастомизировать этот механизм через расширение конфигурации, возникают два критических конфликта:
Расш2_ОпросПокупателяНажатиеПосле). В то же время типовой программный алгоритм РМК ищет строго фиксированное имя процедуры (без префиксов) по шаблону ИмяКартинкиНажатие. Не найдя нужного обработчика в контексте формы, платформа либо игнорирует нажатие, либо выдает неинформативное предупреждение.Безопасный режим. В этом режиме платформа блокирует выполнение динамически назначенных обработчиков событий и некоторые директивы компиляции (например, &Вместо), если они пытаются открыть новые формы без явного на то разрешения.---
Давайте рассмотрим первый и наиболее надежный способ обхода проблемы с префиксами расширения. Суть метода заключается в ручном связывании события нажатия элемента с нашей процедурой в расширении при инициализации формы.
Шаг 1. Создание элемента на форме в расширении
Добавьте на форму РМК в расширении элемент типа Поле картинки или Декорация - Надпись. Укажите имя элемента, например, КартинкаПО_ОпросПокупателя. В свойствах элемента обязательно установите флаг Гиперссылка в значение Истина.
Шаг 2. Написание обработчика нажатия кнопки
В модуле формы расширения создайте процедуру, которая будет выполняться на клиенте. Важнейшее правило — обязательно передавать параметр СтандартнаяОбработка и устанавливать его в значение Ложь в первой же строке кода.
&НаКлиенте
Процедура Расш2_КартинкаПО_ОпросПокупателяНажатие(Элемент, СтандартнаяОбработка)
// Отключаем стандартный просмотр картинки платформой
СтандартнаяОбработка = Ложь;
// Реализуем вызов нашей целевой формы
ВыполнитьОткрытиеФормыОпроса();
КонецПроцедуры
&НаКлиенте
Процедура ВыполнитьОткрытиеФормыОпроса()
ПараметрыОткрытия = Новый Структура;
ОткрытьФорму("Обработка.РМКУправляемыйРежим.Форма.ФормаОпросаПокупателя", ПараметрыОткрытия);
КонецПроцедуры
Шаг 3. Принудительное назначение обработчика
Чтобы обойти проблему префиксов, мы должны программно связать событие нажатия нашей картинки с созданной процедурой расширения. Сделаем это в обработчике события ПриСозданииНаСервере формы РМК:
&НаСервере
Процедура Расш2_ПриСозданииНаСервереПосле(Отказ, СтандартноеОформление)
// Находим наш добавленный элемент интерфейса
ЭлементКнопки = Элементы.Найти("КартинкаПО_ОпросПокупателя");
Если ЭлементКнопки <> Неопределено Тогда
// Явно привязываем событие Нажатие к процедуре из расширения с учетом префикса
ЭлементКнопки.УстановитьДействие("Нажатие", "Расш2_КартинкаПО_ОпросПокупателяНажатие");
КонецЕсли;
КонецПроцедуры
Этот способ гарантирует, что при нажатии на плитку платформа вызовет именно вашу процедуру из расширения, минуя автоматический поиск имен в базовой конфигурации.
---
Если мы хотим сделать решение максимально приближенным к стандартам разработки 1С, давайте интегрируем нашу кнопку в общую экосистему динамических команд РМК. Система считывает доступные действия кнопок из специального макета.
Рассмотрим по шагам, как прописать кнопку в макете:
НастройкиРМК. В его составе найдите табличный макет с именем СтандартныеДействияКнопокНижнейПанели (или аналогичный макет команд в зависимости от релиза вашей Розницы). Заимствуйте этот макет в расширение.КомандаПО_ОпросПокупателя (это имя команды формы, которую вы должны также добавить в расширение формы РМК).ОпросПокупателя (идентификатор элемента).КомандаПО_ОпросПокупателя и разместите её на панели.&После или &Вместо:
&НаКлиенте
Процедура Расш2_ВыполнитьКомандуРМКПосле(ИмяКоманды, СтандартнаяОбработка)
Если ИмяКоманды = "КомандаПО_ОпросПокупателя" Тогда
СтандартнаяОбработка = Ложь;
ОткрытьФорму("Обработка.РМКУправляемыйРежим.Форма.ФормаОпросаПокупателя");
КонецЕсли;
КонецПроцедуры
---
Даже если программный код написан абсолютно верно, разработчик может наткнуться на неработающий обработчик из-за настроек безопасности. При работе расширения в безопасном режиме платформа 1С накладывает жесткие ограничения на открытие внешних окон и выполнение динамических методов.
Для исправления этой проблемы выполним следующие действия:
Ложь).Если база работает во фреше или в режиме разделения данных, также не забудьте снять аналогичный флажок в профиле безопасности расширения через консоль администрирования или в режиме "1С:Предприятие" (в справочнике дополнительных отчетов и обработок/расширений).
---
После успешного написания кода и обновления конфигурации базы данных нам необходимо настроить доступность кнопки для конкретных пользователей или рабочих мест:
F11).Мы успешно проанализировали внутреннюю логику связывания элементов интерфейса в РМК 1С:Розница, обошли ограничения платформы на использование префиксов в расширениях с помощью метода УстановитьДействие() и правильно отключили дефолтное поведение картинок через параметр СтандартнаяОбработка. Теперь ваша кастомная кнопка будет стабильно работать и открывать необходимые бизнес-формы кассиру.