Разработка удобного пользовательского интерфейса в 1С, особенно для рабочих мест кассира (РМК), часто сталкивается с проблемой ограниченности экранного пространства. Одной из самых востребованных, но штатно отсутствующих функций в платформе 1С:Предприятие 8, является механизм «фреймов» — возможность встроить одну полноценную управляемую форму внутрь другой. Рассмотрим ситуацию на примере «1С:Розница», когда окно подбора быстрых товаров перекрывает основную часть чека, и разберем способы решения этой задачи.
Стандартный метод ОткрытьФорму позволяет указать параметр Окно (тип ОкноКлиентскогоПриложения), однако он не позволяет «приземлить» форму в конкретную группу (вид: обычная группа) на родительской форме. Форма всегда открывается либо в основном окне, либо во вспомогательном. В результате кассиру приходится вручную перемещать окно «Быстрых товаров», чтобы видеть содержимое чека, что крайне неудобно при высокой интенсивности продаж и использовании сенсорных мониторов (тач-скринов).
Проанализируем доступные варианты решения этой проблемы, от простых манипуляций с интерфейсом до использования системных скриптов Windows.
Этот метод основан на эмуляции нажатия горячих клавиш 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-объектам операционной системы.
Если ваша цель — избежать «плавающих» окон, наиболее стабильным и правильным с точки зрения архитектуры 1С методом будет отказ от открытия второй формы. Вместо этого рассмотрим вариант размещения всех элементов палитры товаров непосредственно на форме РМК внутри скрытой группы.
Проанализируем последовательность действий:
Обычную группу (например, с именем ГруппаБыстрыеТовары).Видимость этой группы в значение Ложь.
&НаКлиенте
Процедура КомандаОткрытьПодбор(Команда)
// Переключаем видимость встроенной панели
Элементы.ГруппаБыстрыеТовары.Видимость = Не Элементы.ГруппаБыстрыеТовары.Видимость;
// Если нужно, чтобы панель занимала определенную часть экрана,
// можно управлять растягиванием соседних групп
КонецПроцедуры
Этот способ идеален для тач-интерфейсов, так как исключает риск того, что одно окно скроется под другим, и кассир не сможет его найти без клавиатуры.
В конфигурациях типа «Розница» (особенно базовых версий или ПРОФ без изменения кода) часто невозможно внедрить изменения напрямую. Здесь на помощь приходят расширения. Мы можем создать расширение, которое изменит форму РМК, добавив в неё необходимые механизмы из справочника ПалитраБыстрыхТоваров.
Рассмотрим, как оптимизировать рабочую область в расширении. Для освобождения места под палитру можно программно свернуть основное меню 1С (панель разделов). Для этого часто используется сочетание клавиш Ctrl + Shift + ~. Программно это реализуется также через WScript.Shell:
&НаКлиенте
Процедура СвернутьПанелиДляРМК()
WSHShell = Новый COMОбъект("WScript.Shell");
// Эмуляция Ctrl+Shift+~ для максимизации рабочего пространства
WSHShell.SendKeys("^+~");
КонецПроцедуры
Выбор метода зависит от ваших технических условий. Проанализируем ключевые отличия:
Элементы.Добавить(). Это гарантирует, что интерфейс будет монолитным.Для реализации качественного интерфейса в 1С:Розница мы рекомендуем комбинированный подход: использование расширения для внедрения группы быстрых товаров непосредственно в макет формы РМК. Это позволит избежать проблем с перекрытием окон и обеспечит максимальную скорость работы персонала на кассовой зоне.
Посмотрим на ситуацию со стороны сопровождения: использование встроенных элементов (Способ 2) значительно облегчает обновление конфигурации, так как вы не полагаетесь на специфические настройки окон Windows, которые могут измениться с обновлением ОС или платформы 1С.
Таким образом, хотя прямого механизма «форма в форме» не существует, современные инструменты платформы 8.3 позволяют добиться аналогичного результата через гибкое управление видимостью элементов и программную настройку расположения окон.