В типовых конфигурациях, таких как 1С:Бухгалтерия предприятия 3.0, часто возникает задача автоматизировать работу пользователя, заранее заполнив фильтры в формах списков. Рассмотрим ситуацию: в базе ведется учет по нескольким организациям, и нам нужно сделать так, чтобы при нажатии на определенную кнопку открывался список документов или справочник (например, ДоговорыКонтрагентов) с уже установленным фильтром по конкретной организации. При этом важно не просто «спрятать» лишние записи, но и корректно заполнить элементы управления «быстрого отбора» на форме.
Разберем по шагам несколько подходов к решению этой задачи: от простого проброса параметров до универсального метода через механизмы Библиотеки стандартных подсистем (БСП).
Проанализируем самый очевидный способ. Мы можем передать структуру параметров в функцию ОткрытьФорму. Однако стоит учитывать, что стандартный параметр Отбор работает хорошо только для простых форм. В сложных формах БП 3.0, где используются «быстрые отборы» (отдельные реквизиты на форме), этот отбор может не отобразиться визуально или не сработать так, как ожидает пользователь.
Рассмотрим пример кода в модуле команды или общей команды:
&AtClient
Процедура ОбработкаКоманды(ПараметрКоманда, ПараметрыВыполненияКоманды)
// Формируем структуру параметров
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("Организация", ПредопределенноеЗначение("Справочник.Организации.ОсновнаяОрганизация"));
// Открываем форму списка с нашими параметрами
ОткрытьФорму("Справочник.ДоговорыКонтрагентов.ФормаСписка", ПараметрыФормы);
КонецПроцедуры
Теперь выясним, что нужно написать внутри самой формы списка, чтобы она «поняла» этот параметр. В модуле формы справочника в обработчике ПриСозданииНаСервере добавим следующий код:
&AtServer
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Проверяем наличие параметра в структуре
Если Параметры.Свойство("Организация") Тогда
// Устанавливаем значение в реквизит формы, отвечающий за быстрый отбор
// Обычно в БП 3.0 он называется "ОтборОрганизация" или просто "Организация"
ЭтаФорма.Организация = Параметры.Организация;
// Вызываем стандартный механизм обновления списка, если он предусмотрен в конфигурации
// Например, в БП 3.0 часто используется механизм БСП для обновления отборов
Если ТипЗнч(ЭтаФорма.Организация) = Тип("СправочникСсылка.Организации") Тогда
// Устанавливаем признак использования отбора
ОтборОрганизацияИспользование = ЗначениеЗаполнено(ЭтаФорма.Организация);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Если нам нужно установить отбор непосредственно в ДинамическийСписок, минуя элементы интерфейса, мы должны обратиться к КомпоновщикуНастроек. Это более надежный метод для фильтрации данных на уровне запроса к базе данных.
Посмотрим на пример установки отбора через пользовательские настройки. Это позволит пользователю увидеть фильтр в списке настроек и, при необходимости, изменить его.
&AtServer
Процедура УстановитьОтборНаСервере(ЗначениеОрганизации)
// Находим элемент отбора в настройках компоновщика
// Список - это имя вашего реквизита типа ДинамическийСписок
Настройки = Список.КомпоновщикНастроек.Настройки;
// Ищем существующее поле "Организация" в отборе
ПолеОрганизация = Новый ПолеКомпоновкиДанных("Организация");
ЭлементОтбора = Неопределено;
Для Каждого Элемент Из Настройки.Отбор.Элементы Цикл
Если Элемент.ЛевоеЗначение = ПолеОрганизация Тогда
ЭлементОтбора = Элемент;
Прервать;
КонецЕсли;
КонецЦикла;
// Если не нашли - создаем новый
Если ЭлементОтбора = Неопределено Тогда
ЭлементОтбора = Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = ПолеОрганизация;
КонецЕсли;
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = ЗначениеОрганизации;
ЭлементОтбора.Использование = Истина;
ЭлементОтбора.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.БыстрыйДоступ;
КонецПроцедуры
В современных версиях конфигураций «1С:Бухгалтерия» реализован мощный механизм управления отборами через общие модули БСП. Рассмотрим метод, который позволяет обновить «быстрые отборы» одной строкой кода. Это особенно актуально, если вы хотите, чтобы визуальное поле с организацией в шапке формы заполнилось корректно.
Используем метод УстановитьБыстрыйОтбор из общего модуля ОтборыСписковКлиентСервер:
// В обработчике ПриОткрытии или после программного изменения реквизита на клиенте
&AtClient
Процедура ПриОткрытии(Отказ)
// Устанавливаем быстрый отбор по полю "Организация"
// ЭтотМетод обновит и данные в динамическом списке, и визуальное состояние формы
ОтборыСписковКлиентСервер.УстановитьБыстрыйОтбор(ЭтотОбъект, "Организация");
КонецПроцедуры
Важный нюанс: Чтобы этот метод сработал, на форме должен существовать реквизит Организация (или ОтборОрганизация), и он должен быть связан с настройками динамического списка через свойства конфигуратора или программно.
Если ваша задача — установить организацию для 20–30 различных форм, прописывать код в каждой из них будет неэффективно. Проанализируем ситуацию: как сделать это в одном месте? Для этого идеально подходят Переопределяемые модули.
Рассмотрим алгоритм реализации:
МодификацияКонфигурацииПереопределяемый.ПриСозданииНаСервере.Пример реализации в общем модуле расширения:
&После("ПриСозданииНаСервере")
Процедура Расш_ПриСозданииНаСервере(Форма, Отказ, СтандартнаяОбработка)
// Проверяем, есть ли у формы параметр "УстановитьМоюОрганизацию"
Если Форма.Параметры.Свойство("УстановитьМоюОрганизацию") Тогда
ОрганизацияДляУстановки = Форма.Параметры.УстановитьМоюОрганизацию;
// Пытаемся найти реквизит "Организация" на форме
Попытка
Если Форма.Метаданные().Реквизиты.Найти("Организация") <> Неопределено Тогда
Форма.Организация = ОрганизацияДляУстановки;
// Для БП 3.0 вызываем обновление
ОтборыСписковКлиентСервер.УстановитьБыстрыйОтбор(Форма, "Организация");
КонецЕсли;
Исключение
// Если реквизита нет, можно попробовать установить отбор напрямую в список
Если Форма.Элементы.Найти("Список") <> Неопределено Тогда
// Здесь вызываем процедуру установки отбора в компоновщик (см. Метод 2)
КонецЕсли;
КонецПопытки;
КонецЕсли;
КонецПроцедуры
Такой подход позволяет вызвать любую форму системы и передать ей нужную организацию, не меняя код каждой конкретной формы в отдельности.
Если ваша цель — жестко ограничить видимость данных так, чтобы пользователь не мог отключить фильтр, следует использовать свойство ФиксированныеНастройки. Это самый «строгий» вид отбора.
Выясним, как это реализовать при открытии:
&AtClient
Процедура ОткрытьСФиксированнымОтбором()
// Создаем настройки компоновки
Настройки = Новый НастройкиКомпоновкиДанных;
ЭлементОтбора = Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Организация");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = ВыбраннаяОрганизация;
ЭлементОтбора.Использование = Истина;
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("ФиксированныеНастройки", Настройки);
ОткрытьФорму("Справочник.ДоговорыКонтрагентов.ФормаСписка", ПараметрыФормы);
КонецПроцедуры
Важно: При использовании фиксированных настроек поле организации в шапке формы может выглядеть пустым, так как фиксированный отбор работает «глубже» пользовательского интерфейса. Поэтому рекомендуется комбинировать установку значения реквизита формы и фиксированных настроек для лучшего визуального восприятия.
Подводя итог, выбор метода зависит от ваших целей. Для разовой задачи подойдет проброс параметров и правка ПриСозданииНаСервере. Для массовой автоматизации — использование расширений и общих модулей БСП. А для строгого разграничения прав доступа лучше смотреть в сторону RLS (Record Level Security) или фиксированных настроек динамического списка.