Как реализовать открытие формы внутри другой формы в 1С:Розница (интерфейс РМК)?

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

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

Анализ проблемы: почему стандартное «ОткрытьФорму» не подходит для встраивания

Стандартный метод ОткрытьФорму позволяет указать параметр Окно (тип ОкноКлиентскогоПриложения), однако он не позволяет «приземлить» форму в конкретную группу (вид: обычная группа) на родительской форме. Форма всегда открывается либо в основном окне, либо во вспомогательном. В результате кассиру приходится вручную перемещать окно «Быстрых товаров», чтобы видеть содержимое чека, что крайне неудобно при высокой интенсивности продаж и использовании сенсорных мониторов (тач-скринов).

Проанализируем доступные варианты решения этой проблемы, от простых манипуляций с интерфейсом до использования системных скриптов Windows.

Способ 1. Программное закрепление формы через COM-объект WScript.Shell

Этот метод основан на эмуляции нажатия горячих клавиш Windows, которые позволяют «примагнитить» окно к краю экрана. Это наиболее близкое решение к «встраиванию», так как два окна начинают работать как единое целое, не перекрывая друг друга.

Разберем алгоритм реализации. Во-первых, для обеих форм (основной формы РМК и формы палитры товаров) необходимо установить свойство РежимОткрытияОкна в значение Независимый. Во-вторых, в форме, которую мы хотим «прикрепить», необходимо прописать следующий код:


&НаКлиенте
Процедура ЗакрепитьСправа() Экспорт
    Если ЭтаФорма.ВводДоступен() Тогда
        // Используем системную оболочку Windows для передачи команд нажатия клавиш
        WSHShell = Новый COMОбъект("WScript.Shell");
        WSHShell.SendKeys("%");          // Активация меню (Alt)
        WSHShell.SendKeys("{DOWN 5}");   // Переход к пункту управления окнами
        WSHShell.SendKeys("{RIGHT}");    // Выбор режима закрепления
        WSHShell.SendKeys("{UP 5}");     // Выбор конкретной стороны (например, справа)
        WSHShell.SendKeys("{ENTER}");    // Подтверждение действия
    КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)
    // Запускаем обработчик с небольшой задержкой, чтобы форма успела инициализироваться
    ПодключитьОбработчикОжидания("ЗакрепитьСправа", 0.1, Истина);
КонецПроцедуры

Важное примечание: данный метод работает только в тонком и толстом клиентах под управлением Windows. В веб-клиенте данный код не будет исполнен из-за отсутствия доступа к COM-объектам операционной системы.

Способ 2. Управление видимостью групп на основной форме (Альтернатива фреймам)

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

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

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

&НаКлиенте
Процедура КомандаОткрытьПодбор(Команда)
    // Переключаем видимость встроенной панели
    Элементы.ГруппаБыстрыеТовары.Видимость = Не Элементы.ГруппаБыстрыеТовары.Видимость;
    
    // Если нужно, чтобы панель занимала определенную часть экрана, 
    // можно управлять растягиванием соседних групп
КонецПроцедуры

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

Способ 3. Использование расширений для изменения типовой логики

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

Рассмотрим, как оптимизировать рабочую область в расширении. Для освобождения места под палитру можно программно свернуть основное меню 1С (панель разделов). Для этого часто используется сочетание клавиш Ctrl + Shift + ~. Программно это реализуется также через WScript.Shell:


&НаКлиенте
Процедура СвернутьПанелиДляРМК()
    WSHShell = Новый COMОбъект("WScript.Shell");
    // Эмуляция Ctrl+Shift+~ для максимизации рабочего пространства
    WSHShell.SendKeys("^+~"); 
КонецПроцедуры

Сравнение методов и практические советы

Выбор метода зависит от ваших технических условий. Проанализируем ключевые отличия:

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

Посмотрим на ситуацию со стороны сопровождения: использование встроенных элементов (Способ 2) значительно облегчает обновление конфигурации, так как вы не полагаетесь на специфические настройки окон Windows, которые могут измениться с обновлением ОС или платформы 1С.

Таким образом, хотя прямого механизма «форма в форме» не существует, современные инструменты платформы 8.3 позволяют добиться аналогичного результата через гибкое управление видимостью элементов и программную настройку расположения окон.

← На главную