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