Как программно установить режим просмотра списка, если мешают настройки пользователя?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Почему стандартный подход в «ПриСозданииНаСервере» не всегда работает?

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

Способ 1. Использование события «ПриОткрытии» (Клиент)

Самый простой и популярный метод — перенести установку режима в клиентское событие ПриОткрытии. Это событие срабатывает уже после того, как платформа восстановила все настройки пользователя, поэтому наш код окажется «последним словом» в настройке интерфейса.

Рассмотрим пример кода в форме выбора справочника (аналогично тому, как реализуется флажок в динамическом списке — для этого подойдёт универсальное расширение для настройки динамических списков 1С):


&НаКлиенте
Процедура ПриОткрытии(Отказ)
    // Проверяем наличие специального параметра, переданного при открытии
    Если Параметры.Свойство("РежимТолькоСписок") И Параметры.РежимТолькоСписок Тогда
        Элементы.Список.Отображение = ОтображениеТаблицы.Список;
    КонецЕсли;
КонецПроцедуры

Чтобы передать этот параметр из формы документа, используем следующий код:


&НаКлиенте
Процедура ВыборНоменклатуры(Команда)
    ПараметрыФормы = Новый Структура;
    ПараметрыФормы.Вставить("РежимТолькоСписок", Истина);
    
    ОткрытьФорму("Справочник.Номенклатура.ФормаВыбора", ПараметрыФормы, Элементы.Номенклатура);
КонецПроцедуры

Важный нюанс: использование клиентских событий для визуальных изменений может вызвать кратковременное «мигание» интерфейса на медленных каналах связи, так как форма сначала отрисовывается с пользовательскими настройками, а затем мгновенно перестраивается.

Способ 2. Системный параметр «ОтображениеТаблицы» (для платформы 8.3.21+)

В современных версиях платформы (начиная с 8.3.21) разработчики добавили штатную возможность управлять режимом отображения через параметры открытия формы. Это наиболее правильный и производительный метод, так как он обрабатывается платформой на низком уровне.

Посмотрим на пример вызова формы:


&НаКлиенте
Процедура ОткрытьСправочникСРежимомСписок()
    ПараметрыФормы = Новый Структура;
    // Используем предопределенный ключ параметра "ОтображениеТаблицы"
    ПараметрыФормы.Вставить("ОтображениеТаблицы", ОтображениеТаблицы.Список);
    ПараметрыФормы.Вставить("РежимВыбора", Истина);
    
    ОткрытьФорму("Справочник.Контрагенты.ФормаВыбора", ПараметрыФормы, ЭтаФорма);
КонецПроцедуры

В этом случае платформа сама применит режим Список при инициализации, и вам даже не придется писать код внутри вызываемой формы выбора.

Способ 3. Передача данных через ДополнительныеСвойства компоновщика

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

В процедуре ПриСозданииНаСервере:


Список.КомпоновщикНастроек.Настройки.ДополнительныеСвойства.Вставить("НужноеОтображение", ОтображениеТаблицы.Список);

Затем в процедуре ПриОткрытии на клиенте восстанавливаем значение:


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

Способ 4. Ограничение прав пользователя на смену режима

Иногда недостаточно просто установить режим — нужно запретить пользователю менять его обратно через меню «Еще». Рассмотрим, как это сделать программно в ПриСозданииНаСервере. Мы можем управлять видимостью стандартных команд таблицы — для этого подойдёт расширение для управления правами и видимостью элементов формы:


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

Обратите внимание: имена команд могут отличаться в зависимости от того, как назван ваш элемент таблицы (в примере — «Список»). Если вы скроете эти команды, пользователь не сможет переключить вид, и форма будет всегда работать в заданном вами режиме.

Способ 5. Управление автоматическим сохранением настроек

Если задача стоит радикально — чтобы форма вообще никогда не запоминала выбор пользователя (не только режим просмотра, но и отборы, положение колонок), можно воспользоваться свойством формы АвтоматическоеСохранениеДанныхФормВНастройках — решать такие задачи удобнее через инструмент настройки интерфейса и поведения управляемых форм.

Рассмотрим алгоритм:

  1. В конфигураторе откройте свойства нужной формы.
  2. Найдите флаг «Автоматическое сохранение данных форм в настройках».
  3. Установите его в значение «Выключить» (или выберите «Использовать список» и не включайте туда режим просмотра).

В этом случае программная установка в ПриСозданииНаСервере будет работать безупречно, так как платформе будет нечего восстанавливать из хранилища при открытии.

Рекомендации по выбору метода

Выясним, какой метод лучше использовать в различных ситуациях:

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

← На главную