При разработке интерфейсов форм списков справочников и журналов в платформе 1С:Предприятие 7.7 разработчики часто сталкиваются с задачей разбиения данных по вкладкам. Штатный метод ЗакладкиОтбора() позволяет быстро вывести закладки по значениям реквизита, однако на практике возникают ограничения: если реквизит числовой или строковый (например, со значениями "1", "2", "3"), закладки получают точно такие же имена, а предопределенная процедура ПриВыбореЗакладки() при клике на них не срабатывает. Разберем причины такого поведения платформы и рассмотрим правильные варианты решения этой задачи.
Проанализируем, почему штатный механизм ЗакладкиОтбора() ведет себя подобным образом. В платформе 1С 7.7 реализовано два принципиально разных механизма работы со вкладками:
ЗакладкиОтбора()): этот элемент полностью управляется внутренними механизмами платформы. Названия закладок формируются автоматически на основании строкового представления значений реквизита. Платформа самостоятельно накладывает и снимает отбор при переключении, не вызывая при этом процедуру ПриВыбореЗакладки(). Переопределить текст на системных закладках через коллекцию Форма.Закладки невозможно.Форма.ИспользоватьЗакладки(1)): это управляемый разработчиком элемент интерфейса. Список закладок формируется вручную через объект Форма.Закладки (тип «СписокЗначений»), где для каждого элемента можно задать как внутреннее значение, так и произвольный отображаемый текст. Любое переключение таких вкладок гарантированно вызывает процедуру ПриВыбореЗакладки().Рассмотрим основной и самый надежный способ решения задачи. Откажемся от использования встроенного метода ЗакладкиОтбора() и построим логику на закладках формы с ручным управлением отбором через метод УстановитьОтбор().
Разберем по шагам реализацию этого механизма в модуле формы списка:
ПриОткрытии() включим отображение закладок формы и заполним список вкладок. Метод ДобавитьЗначение() принимает два параметра: само значение фильтра и строку с понятным пользователю представлением.ПриВыбореЗакладки(), в которой будем устанавливать фильтр по выбранному значению реквизита или сбрасывать его, если выбрана общая вкладка «Все».Посмотрим на пример программного кода модуля формы:
Процедура ПриОткрытии()
// Включаем использование пользовательских закладок формы
Форма.ИспользоватьЗакладки(1);
// Очищаем и наполняем коллекцию закладок произвольными заголовками
Форма.Закладки.УдалитьВсе();
Форма.Закладки.ДобавитьЗначение("", "Все элементы");
Форма.Закладки.ДобавитьЗначение("1", "Закладка 1");
Форма.Закладки.ДобавитьЗначение("2", "Закладка 2");
Форма.Закладки.ДобавитьЗначение("3", "Закладка 3");
// Позиционируемся на первой закладке по умолчанию
Форма.Закладки.ТекущаяСтрока(1);
КонецПроцедуры
Процедура ПриВыбореЗакладки(Номер, Значение)
// Проверяем, выбрано ли конкретное значение для отбора
Если ПустоеЗначение(Значение) = 0 Тогда
// Устанавливаем отбор по нужному реквизиту (реквизит должен быть отмечен для отбора в метаданных)
УстановитьОтбор("ТипКарты", Значение);
Иначе
// Снимаем ранее установленный отбор
СнятьОтбор();
КонецЕсли;
КонецПроцедуры
Важный момент: для работы метода УстановитьОтбор() у реквизита справочника в конфигураторе обязательно должен быть установлен флаг «Отбор по реквизиту» (или признак сортировки/отбора).
Рассмотрим альтернативную ситуацию: если в конфигурации принципиально важно сохранить работу именно системного метода ЗакладкиОтбора(), проанализируем тип данных самого реквизита отбора.
Когда реквизит имеет тип Число или Строка, системный метод выводит в заголовок «сырое» значение ("1", "2"). Если же перевести реквизит на тип Перечисление или ссылочный Справочник, платформа 1С 7.7 автоматически возьмет в качестве названий закладок синонимы значений перечисления или наименования элементов справочника. В этом случае строковые подписи станут человекопонятными без написания дополнительного кода, хотя само событие переключения по-прежнему останется системным.
В случаях, когда требуется не только сохранить системный метод ЗакладкиОтбора(), но и динамически менять текст системных вкладок операционной системы или перехватывать клики мыши по системным элементам управления (SysTabControl32), программисты применяют внешние компоненты (например, FormEx или 1C++). Они позволяют перехватывать низкоуровневые оконные события и модифицировать свойства визуальных контролов Windows напрямую, однако для подавляющего большинства прикладных задач наиболее простым и надежным остается Способ 1.