Почему на форме в режиме конфигуратора нет нужных реквизитов и как программно управлять такими элементами

Программист IT и автоматизация бизнеса
← На главную

При разработке в среде 1С:Предприятие 8.3 программисты часто сталкиваются с ситуацией, когда в режиме «Предприятие» на форме отображаются флажки, поля ввода или отборы, которые совершенно невозможно найти в дереве элементов формы в режиме «Конфигуратор». Рассмотрим подробнее, почему так происходит, и разберем по шагам, как программно управлять такими «невидимыми» элементами.

Выясняем причину: механизмы динамических списков

Проанализируем ситуацию. Если на форме используется ДинамическийСписок (например, список документов, справочников или файлов), платформа предоставляет пользователю мощный механизм настройки — Пользовательские настройки компоновки данных. Когда пользователь заходит в меню «Настроить список» и выносит определенное поле в колонку «Быстрый доступ», платформа автоматически генерирует соответствующий элемент управления на форме.

В конфигураторе этого элемента нет, так как он не является статическим объектом формы. Он создается динамически при инициализации формы на основе настроек КомпоновщикаНастроек. Это объясняет, почему поиск реквизита в дереве объектов не дает результатов. Наша задача — научиться обращаться к этим настройкам через код, чтобы управлять значениями таких «галочек» и полей программно.

Разберем структуру настроек динамического списка

Для успешного решения задачи нам необходимо понимать разницу между двумя уровнями настроек в 1С:

  1. Фиксированные настройки: Это те отборы, которые программист задает в свойствах динамического списка в конфигураторе или программно через Список.КомпоновщикНастроек.Настройки.Отбор. Они обычно скрыты от пользователя и работают «под капотом».
  2. Пользовательские настройки: Именно здесь находятся элементы, которые мы видим в шапке формы. Доступ к ним осуществляется через Список.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы.

Посмотрим на пример из практики. Если нам нужно установить отбор по расширению файла в обработке РаботаСФайлами, мы не должны искать элемент формы, мы должны работать с коллекцией отборов компоновщика.

Пошаговое решение: Программная установка отбора

Рассмотрим ситуацию, когда нам нужно при открытии формы автоматически установить фильтр по списку расширений файлов (например, только изображения). Проанализируем код, который позволяет это сделать в процедуре ПриСозданииНаСервере.

Шаг 1. Подготовка списка значений для фильтра.

Сначала определим, какие именно значения мы хотим видеть в отборе. Создадим СписокЗначений и наполним его расширениями файлов.


СписокРасширенийИзображений = Новый СписокЗначений;
СписокРасширенийИзображений.Добавить("png");
СписокРасширенийИзображений.Добавить("jpg");
СписокРасширенийИзображений.Добавить("jpeg");
СписокРасширенийИзображений.Добавить("gif");

Шаг 2. Очистка существующих отборов (если это необходимо).

Прежде чем добавлять свой отбор, важно убедиться, что он не конфликтует с уже существующими. Мы можем очистить коллекцию элементов отбора, но будьте осторожны: это удалит и фиксированные отборы, установленные системой.

Список.Отбор.Элементы.Очистить();

Шаг 3. Создание и настройка нового элемента отбора.

Теперь создадим новый ЭлементОтбораКомпоновкиДанных. Важным моментом здесь является установка свойства ИдентификаторПользовательскойНастройки. Если этот идентификатор совпадет с идентификатором в пользовательских настройках, ваша «галочка» в интерфейсе синхронизируется с программным значением.


Отбор = Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
Отбор.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Расширение");
Отбор.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке;
Отбор.Использование = Истина;
Отбор.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Обычный;
Отбор.ПравоеЗначение = СписокРасширенийИзображений;
// Указываем ID, чтобы связать с интерфейсом
Отбор.ИдентификаторПользовательскойНастройки = "Основная"; 

Использование функций Библиотеки Стандартных Подсистем (БСП)

Проанализируем более современный подход. Если ваша конфигурация использует БСП (что является стандартом для современных решений 1С), лучше использовать типовые методы общего модуля ОбщегоНазначенияКлиентСервер. Это позволит избежать ошибок при работе с типами данных и обеспечит корректное обновление настроек.

Рассмотрим пример установки отбора через БСП:


ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка(
    Список, 
    "Расширение",
    СписокРасширенийИзображений,
    ВидСравненияКомпоновкиДанных.ВСписке,
    , // Имя группы
    Истина, // Использование
    РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Обычный,
    "ИдентификаторВашегоОтбора"
);

Этот метод самостоятельно проверит наличие существующего отбора по указанному полю и либо обновит его, либо создаст новый. Это гораздо надежнее прямого манипулирования коллекцией элементов.

Решение проблемы конфликта настроек

Если при открытии формы вы получаете ошибку «Конфликт настроек», это означает, что в ПользовательскихНастройках уже сохранен отбор по этому же полю, но с другими параметрами. Платформа не может решить, какой из них приоритетнее.

Чтобы избежать этой ситуации, выясним причину конфликта. Обычно она кроется в сохраненных настройках пользователя между сеансами. Рекомендуется перед установкой нового отбора программно деактивировать старые пользовательские настройки для данного поля. Посмотрим, как это сделать, перебирая элементы пользовательских настроек:


ПолеРасширение = Новый ПолеКомпоновкиДанных("Расширение");
Для Каждого Элемент Из Список.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы Цикл
    Если ТипЗнч(Элемент) = Тип("ЭлементОтбораКомпоновкиДанных") Тогда
        Если Элемент.ЛевоеЗначение = ПолеРасширение Тогда
            Элемент.Использование = Ложь;
        КонецЕсли;
    КонецЕсли;
КонецЦикла;

Как работать с формой «ПрисоединенныеФайлы» (БСП)

В случае с обработкой РаботаСФайлами и ее формой ПрисоединенныеФайлы, ситуация осложняется тем, что форма универсальна. Заголовок и состав полей меняются в зависимости от владельца файла. Если вы хотите изменить поведение этой формы, не снимая конфигурацию с поддержки, лучше всего использовать Расширение конфигурации.

  1. Создайте расширение и добавьте в него форму Обработка.РаботаСФайлами.Форма.ПрисоединенныеФайлы.
  2. Создайте процедуру-перехватчик &После("ПриСозданииНаСервере").
  3. Внутри этой процедуры примените вышеописанный код для установки отборов.

Подведем итог: Отсутствие реквизита в конфигураторе — это не ошибка, а особенность работы динамических списков и пользовательских настроек компоновки данных. Управляя КомпоновщикомНастроек, вы получаете полный контроль над интерфейсом и фильтрацией данных, даже если сами элементы управления создаются платформой автоматически.

← На главную