При проектировании интерфейсов в платформе 1С:Предприятие 7.7 разработчики часто сталкиваются с задачей размещения большого количества реквизитов на форме элемента справочника или документа. Попытка уместить все поля на одном экране делает форму перегруженной и неудобной для пользователя. В отличие от современных версий 1С (8.x), в «семерке» нет готового визуального элемента управления типа «Вкладка». Однако эту задачу можно легко решить с помощью штатного механизма, объединяющего закладки формы и визуальные слои. Разберем подробно, как это реализовать.
Прежде чем приступать к написанию программного кода, нам необходимо визуально подготовить форму в Конфигураторе, создать слои и распределить по ним наши реквизиты. Без этого шага программный код просто не сможет управлять видимостью элементов.
Рассмотрим по шагам процесс создания и настройки слоев:
Основной, Дополнительно и Свойства.Теперь нам нужно привязать уже существующие или новые элементы диалога к созданным слоям. Для этого выполним следующие действия:
Дополнительно). Регистр букв имеет значение, поэтому пишем точно так же, как указали в окне управления слоями.Основной, Дополнительно).После того как элементы распределены по слоям, нам нужно заставить форму выводить закладки в нижней части окна и реагировать на их переключение пользователем. Для этого мы будем использовать встроенный объект формы Закладки, который по своей сути является стандартным объектом типа СписокЗначений.
Рассмотрим базовый код, который необходимо поместить в предопределенную процедуру ПриОткрытии() модуля формы:
Процедура ПриОткрытии()
// Включаем отображение закладок на форме
Форма.ИспользоватьЗакладки(1);
// Заполняем список закладок
Форма.Закладки.ДобавитьЗначение("Основной", "Общие сведения");
Форма.Закладки.ДобавитьЗначение("Дополнительно", "Дополнительные реквизиты");
Форма.Закладки.ДобавитьЗначение("Свойства", "Характеристики");
// Устанавливаем фокус на первую вкладку при открытии формы
Форма.Закладки.ТекущаяСтрока(1);
// Активируем соответствующий слой принудительно
УстановкаВидимостиСлоев(1);
КонецПроцедуры
Для переключения слоев используется метод контекста формы Форма.ИспользоватьСлой(). Выясним принцип работы этого метода. Его полный синтаксис выглядит следующим образом:
Форма.ИспользоватьСлой(<ИмяСлоя>, [<Режим>])
Параметр Режим крайне важен для оптимизации кода. Он может принимать следующие значения:
0 — полностью скрыть указанный слой (или список слоев через запятую).1 — показать указанный слой на форме.2 — показать указанный слой и одновременно скрыть все остальные существующие слои.Именно режим 2 является значением по умолчанию. Его использование избавляет нас от необходимости писать громоздкие конструкции со скрытием каждого неактивного слоя по отдельности.
Напишем процедуру, которая будет реагировать на интерактивный клик пользователя по закладкам. В платформе 1С 7.7 для этого предназначена предопределенная процедура ПриВыбореЗакладки():
Процедура ПриВыбореЗакладки(НомерЗакладки, ЗначениеЗакладки)
// ЗначениеЗакладки содержит имя слоя, которое мы привязали к закладке
УстановкаВидимостиСлоев(НомерЗакладки);
КонецПроцедуры
Процедура УстановкаВидимостиСлоев(НомерЗакладки)
// Получаем имя слоя из значения выбранной закладки
ИмяАктивногоСлоя = Форма.Закладки.ПолучитьЗначение(НомерЗакладки);
// Активируем выбранный слой, автоматически скрывая все остальные
Форма.ИспользоватьСлой(ИмяАктивногоСлоя, 2);
КонецПроцедуры
Проанализируем структуру кода из предыдущего шага. Мы можем сделать решение еще более изящным и лаконичным. Это стандартный паттерн, который часто применяется в типовых конфигурациях 1С 7.7. Поскольку объект Форма.Закладки является списком значений, мы можем хранить имя слоя (или список слоев через запятую) в качестве Значения элемента списка, а понятный пользователю текст — в качестве Представления.
Давайте посмотрим на пример оптимизированного кода:
Процедура ПриОткрытии()
Форма.ИспользоватьЗакладки(1);
// В первом параметре передаем имя слоя (или слоев), во втором - название вкладки
Форма.Закладки.ДобавитьЗначение("Основной", "Общие сведения");
Форма.Закладки.ДобавитьЗначение("Дополнительно", "Доп. параметры");
Форма.Закладки.ДобавитьЗначение("Свойства,Характеристики", "Спецификация");
// По умолчанию открываем первую вкладку
Форма.Закладки.ТекущаяСтрока(1);
// Вызываем обработчик для включения слоя первой вкладки
ПриВыбореЗакладки(1, Форма.Закладки.ПолучитьЗначение(1));
КонецПроцедуры
Процедура ПриВыбореЗакладки(Номер, Значение)
// Включаем слой из значения выбранной закладки в режиме "2" (скрыть остальные)
Форма.ИспользоватьСлой(Значение, 2);
КонецПроцедуры
Этот подход невероятно удобен: если нам понадобится привязать к одной вкладке отображение сразу нескольких слоев (например, Свойства и Характеристики), мы просто перечисляем их через запятую в первом параметре метода ДобавитьЗначение(). При этом код обработчика ПриВыбореЗакладки() вообще не требует изменений и умещается всего в одну строку!
Иногда возникает необходимость скрывать или показывать вкладки динамически, в зависимости от заполнения тех или иных реквизитов формы. Например, если в карточке контрагента выбран тип «Юридическое лицо», нам нужна вкладка «Банковские реквизиты», а если выбран тип «Физическое лицо» — эту вкладку нужно скрыть.
Поскольку закладки — это динамический список значений, мы можем легко управлять им программно. Рассмотрим пример функции динамического обновления вкладок:
Процедура ОбновитьСоставВкладок()
// Очищаем текущий список закладок
Форма.Закладки.УдалитьВсе();
// Всегда добавляем основную вкладку
Форма.Закладки.ДобавитьЗначение("Основной", "Основная информация");
// Проверяем условие (например, значение реквизита ЮрФизическоеЛицо)
Если ЮрФизическоеЛицо = Перечисление.ЮрФизЛицо.ЮрЛицо Тогда
// Для юрлиц добавляем вкладку с реквизитами организации
Форма.Закладки.ДобавитьЗначение("РеквизитыОрг", "Банковские реквизиты");
КонецЕсли;
// Всегда добавляем финальную вкладку
Форма.Закладки.ДобавитьЗначение("История", "История изменений");
// Проверяем, чтобы текущий номер строки не выходил за границы нового списка
Если Форма.Закладки.ТекущаяСтрока() = 0 Тогда
Форма.Закладки.ТекущаяСтрока(1);
КонецЕсли;
// Обновляем видимость слоев
ТекущийНомер = Форма.Закладки.ТекущаяСтрока();
ПриВыбореЗакладки(ТекущийНомер, Форма.Закладки.ПолучитьЗначение(ТекущийНомер));
КонецПроцедуры
Стандартный механизм работы с закладками в системе «1С:Предприятие 7.7» имеет один существенный архитектурный недостаток: вкладки всегда отображаются исключительно в самом низу формы. С точки зрения современного UX/UI-дизайна, это не всегда удобно, так как пользователи привыкли видеть вкладки в верхней части рабочих окон.
Для обхода этого ограничения разработчики используют два основных подхода:
Форма.ИспользоватьСлой() и визуально перерисовывает рамки кнопок, создавая у пользователя полную иллюзию работы с настоящими вкладками.Сочетание визуального разделения элементов по слоям в Конфигураторе и лаконичного кода управления списком значений Форма.Закладки позволяет создавать удобные, многофункциональные и интуитивно понятные интерфейсы даже на классической платформе 1С 7.7.