При разработке в среде 1С:Предприятие 8.3 программисты часто сталкиваются с ситуацией, когда в режиме «Предприятие» на форме отображаются флажки, поля ввода или отборы, которые совершенно невозможно найти в дереве элементов формы в режиме «Конфигуратор». Рассмотрим подробнее, почему так происходит, и разберем по шагам, как программно управлять такими «невидимыми» элементами.
Проанализируем ситуацию. Если на форме используется ДинамическийСписок (например, список документов, справочников или файлов), платформа предоставляет пользователю мощный механизм настройки — Пользовательские настройки компоновки данных. Когда пользователь заходит в меню «Настроить список» и выносит определенное поле в колонку «Быстрый доступ», платформа автоматически генерирует соответствующий элемент управления на форме.
В конфигураторе этого элемента нет, так как он не является статическим объектом формы. Он создается динамически при инициализации формы на основе настроек КомпоновщикаНастроек. Это объясняет, почему поиск реквизита в дереве объектов не дает результатов. Наша задача — научиться обращаться к этим настройкам через код, чтобы управлять значениями таких «галочек» и полей программно.
Для успешного решения задачи нам необходимо понимать разницу между двумя уровнями настроек в 1С:
Список.КомпоновщикНастроек.Настройки.Отбор. Они обычно скрыты от пользователя и работают «под капотом».Список.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы.Посмотрим на пример из практики. Если нам нужно установить отбор по расширению файла в обработке РаботаСФайлами, мы не должны искать элемент формы, мы должны работать с коллекцией отборов компоновщика.
Рассмотрим ситуацию, когда нам нужно при открытии формы автоматически установить фильтр по списку расширений файлов (например, только изображения). Проанализируем код, который позволяет это сделать в процедуре ПриСозданииНаСервере.
Шаг 1. Подготовка списка значений для фильтра.
Сначала определим, какие именно значения мы хотим видеть в отборе. Создадим СписокЗначений и наполним его расширениями файлов.
СписокРасширенийИзображений = Новый СписокЗначений;
СписокРасширенийИзображений.Добавить("png");
СписокРасширенийИзображений.Добавить("jpg");
СписокРасширенийИзображений.Добавить("jpeg");
СписокРасширенийИзображений.Добавить("gif");
Шаг 2. Очистка существующих отборов (если это необходимо).
Прежде чем добавлять свой отбор, важно убедиться, что он не конфликтует с уже существующими. Мы можем очистить коллекцию элементов отбора, но будьте осторожны: это удалит и фиксированные отборы, установленные системой.
Список.Отбор.Элементы.Очистить();
Шаг 3. Создание и настройка нового элемента отбора.
Теперь создадим новый ЭлементОтбораКомпоновкиДанных. Важным моментом здесь является установка свойства ИдентификаторПользовательскойНастройки. Если этот идентификатор совпадет с идентификатором в пользовательских настройках, ваша «галочка» в интерфейсе синхронизируется с программным значением.
Отбор = Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
Отбор.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Расширение");
Отбор.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке;
Отбор.Использование = Истина;
Отбор.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Обычный;
Отбор.ПравоеЗначение = СписокРасширенийИзображений;
// Указываем ID, чтобы связать с интерфейсом
Отбор.ИдентификаторПользовательскойНастройки = "Основная";
Проанализируем более современный подход. Если ваша конфигурация использует БСП (что является стандартом для современных решений 1С), лучше использовать типовые методы общего модуля ОбщегоНазначенияКлиентСервер. Это позволит избежать ошибок при работе с типами данных и обеспечит корректное обновление настроек.
Рассмотрим пример установки отбора через БСП:
ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка(
Список,
"Расширение",
СписокРасширенийИзображений,
ВидСравненияКомпоновкиДанных.ВСписке,
, // Имя группы
Истина, // Использование
РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Обычный,
"ИдентификаторВашегоОтбора"
);
Этот метод самостоятельно проверит наличие существующего отбора по указанному полю и либо обновит его, либо создаст новый. Это гораздо надежнее прямого манипулирования коллекцией элементов.
Если при открытии формы вы получаете ошибку «Конфликт настроек», это означает, что в ПользовательскихНастройках уже сохранен отбор по этому же полю, но с другими параметрами. Платформа не может решить, какой из них приоритетнее.
Чтобы избежать этой ситуации, выясним причину конфликта. Обычно она кроется в сохраненных настройках пользователя между сеансами. Рекомендуется перед установкой нового отбора программно деактивировать старые пользовательские настройки для данного поля. Посмотрим, как это сделать, перебирая элементы пользовательских настроек:
ПолеРасширение = Новый ПолеКомпоновкиДанных("Расширение");
Для Каждого Элемент Из Список.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы Цикл
Если ТипЗнч(Элемент) = Тип("ЭлементОтбораКомпоновкиДанных") Тогда
Если Элемент.ЛевоеЗначение = ПолеРасширение Тогда
Элемент.Использование = Ложь;
КонецЕсли;
КонецЕсли;
КонецЦикла;
В случае с обработкой РаботаСФайлами и ее формой ПрисоединенныеФайлы, ситуация осложняется тем, что форма универсальна. Заголовок и состав полей меняются в зависимости от владельца файла. Если вы хотите изменить поведение этой формы, не снимая конфигурацию с поддержки, лучше всего использовать Расширение конфигурации.
Обработка.РаботаСФайлами.Форма.ПрисоединенныеФайлы.&После("ПриСозданииНаСервере").Подведем итог: Отсутствие реквизита в конфигураторе — это не ошибка, а особенность работы динамических списков и пользовательских настроек компоновки данных. Управляя КомпоновщикомНастроек, вы получаете полный контроль над интерфейсом и фильтрацией данных, даже если сами элементы управления создаются платформой автоматически.