Как программно добавить кнопку в РМК 1С:Розница через расширение и исправить ошибку с пустым окном предупреждения?

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

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

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

Выясняем причину: почему стандартный подход не работает в РМК?

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

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

ЭлементПолеКартинка.УстановитьДействие("Нажатие", ИмяКартинки + "Нажатие");

Когда мы пытаемся кастомизировать этот механизм через расширение конфигурации, возникают два критических конфликта:

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

---

Способ 1. Программное переопределение действия в расширении формы (Рекомендуемый)

Давайте рассмотрим первый и наиболее надежный способ обхода проблемы с префиксами расширения. Суть метода заключается в ручном связывании события нажатия элемента с нашей процедурой в расширении при инициализации формы.

Шаг 1. Создание элемента на форме в расширении

Добавьте на форму РМК в расширении элемент типа Поле картинки или Декорация - Надпись. Укажите имя элемента, например, КартинкаПО_ОпросПокупателя. В свойствах элемента обязательно установите флаг Гиперссылка в значение Истина.

Шаг 2. Написание обработчика нажатия кнопки

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


&НаКлиенте
Процедура Расш2_КартинкаПО_ОпросПокупателяНажатие(Элемент, СтандартнаяОбработка)
    
    // Отключаем стандартный просмотр картинки платформой
    СтандартнаяОбработка = Ложь; 
    
    // Реализуем вызов нашей целевой формы
    ВыполнитьОткрытиеФормыОпроса();
    
КонецПроцедуры

&НаКлиенте
Процедура ВыполнитьОткрытиеФормыОпроса()
    
    ПараметрыОткрытия = Новый Структура;
    ОткрытьФорму("Обработка.РМКУправляемыйРежим.Форма.ФормаОпросаПокупателя", ПараметрыОткрытия);
    
КонецПроцедуры

Шаг 3. Принудительное назначение обработчика

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


&НаСервере
Процедура Расш2_ПриСозданииНаСервереПосле(Отказ, СтандартноеОформление)
    
    // Находим наш добавленный элемент интерфейса
    ЭлементКнопки = Элементы.Найти("КартинкаПО_ОпросПокупателя");
    
    Если ЭлементКнопки <> Неопределено Тогда
        // Явно привязываем событие Нажатие к процедуре из расширения с учетом префикса
        ЭлементКнопки.УстановитьДействие("Нажатие", "Расш2_КартинкаПО_ОпросПокупателяНажатие");
    КонецЕсли;
    
КонецПроцедуры

Этот способ гарантирует, что при нажатии на плитку платформа вызовет именно вашу процедуру из расширения, минуя автоматический поиск имен в базовой конфигурации.

---

Способ 2. Регистрация кнопки через макет настроек РМК

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

Рассмотрим по шагам, как прописать кнопку в макете:

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

&НаКлиенте
Процедура Расш2_ВыполнитьКомандуРМКПосле(ИмяКоманды, СтандартнаяОбработка)
    
    Если ИмяКоманды = "КомандаПО_ОпросПокупателя" Тогда
        СтандартнаяОбработка = Ложь;
        ОткрытьФорму("Обработка.РМКУправляемыйРежим.Форма.ФормаОпросаПокупателя");
    КонецЕсли;
    
КонецПроцедуры

---

Важная деталь: Отключение безопасного режима

Даже если программный код написан абсолютно верно, разработчик может наткнуться на неработающий обработчик из-за настроек безопасности. При работе расширения в безопасном режиме платформа 1С накладывает жесткие ограничения на открытие внешних окон и выполнение динамических методов.

Для исправления этой проблемы выполним следующие действия:

  1. Откройте конфигуратор вашей базы данных.
  2. Перейдите в меню Конфигурация -> Расширения конфигурации.
  3. В списке расширений найдите вашу строку и откройте её свойства.
  4. Найдите свойство Безопасный режим и снимите с него флажок (установите в значение Ложь).
  5. Сохраните изменения в базе данных.

Если база работает во фреше или в режиме разделения данных, также не забудьте снять аналогичный флажок в профиле безопасности расширения через консоль администрирования или в режиме "1С:Предприятие" (в справочнике дополнительных отчетов и обработок/расширений).

---

Настройка видимости кнопки в режиме "1С:Предприятие"

После успешного написания кода и обновления конфигурации базы данных нам необходимо настроить доступность кнопки для конкретных пользователей или рабочих мест:

  1. Запустите программу в режиме "1С:Предприятие" под правами Администратора.
  2. Перейдите в раздел Продажи -> Настройки РМК (или воспользуйтесь поиском по функциям).
  3. Откройте действующую настройку для вашего рабочего места кассира.
  4. Перейдите на вкладку Кнопки нижней панели (или боковой панели).
  5. В списке доступных команд найдите ваше новое действие "Опрос покупателя".
  6. Добавьте кнопку в список выбранных, настройте её положение на экране и при необходимости привяжите к ней горячую клавишу (например, F11).
  7. Сохраните настройки и перезапустите сеанс РМК.

Мы успешно проанализировали внутреннюю логику связывания элементов интерфейса в РМК 1С:Розница, обошли ограничения платформы на использование префиксов в расширениях с помощью метода УстановитьДействие() и правильно отключили дефолтное поведение картинок через параметр СтандартнаяОбработка. Теперь ваша кастомная кнопка будет стабильно работать и открывать необходимые бизнес-формы кассиру.

← На главную