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