Как программно установить организацию при открытии формы списка в 1С

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

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

Разберем по шагам несколько подходов к решению этой задачи: от простого проброса параметров до универсального метода через механизмы Библиотеки стандартных подсистем (БСП).

Метод 1. Передача параметров через «ОткрытьФорму» и их обработка

Проанализируем самый очевидный способ. Мы можем передать структуру параметров в функцию ОткрытьФорму. Однако стоит учитывать, что стандартный параметр Отбор работает хорошо только для простых форм. В сложных формах БП 3.0, где используются «быстрые отборы» (отдельные реквизиты на форме), этот отбор может не отобразиться визуально или не сработать так, как ожидает пользователь.

Рассмотрим пример кода в модуле команды или общей команды:


&AtClient
Процедура ОбработкаКоманды(ПараметрКоманда, ПараметрыВыполненияКоманды)
    
    // Формируем структуру параметров
    ПараметрыФормы = Новый Структура;
    ПараметрыФормы.Вставить("Организация", ПредопределенноеЗначение("Справочник.Организации.ОсновнаяОрганизация"));
    
    // Открываем форму списка с нашими параметрами
    ОткрытьФорму("Справочник.ДоговорыКонтрагентов.ФормаСписка", ПараметрыФормы);
    
КонецПроцедуры

Теперь выясним, что нужно написать внутри самой формы списка, чтобы она «поняла» этот параметр. В модуле формы справочника в обработчике ПриСозданииНаСервере добавим следующий код:


&AtServer
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Проверяем наличие параметра в структуре
    Если Параметры.Свойство("Организация") Тогда
        // Устанавливаем значение в реквизит формы, отвечающий за быстрый отбор
        // Обычно в БП 3.0 он называется "ОтборОрганизация" или просто "Организация"
        ЭтаФорма.Организация = Параметры.Организация;
        
        // Вызываем стандартный механизм обновления списка, если он предусмотрен в конфигурации
        // Например, в БП 3.0 часто используется механизм БСП для обновления отборов
        Если ТипЗнч(ЭтаФорма.Организация) = Тип("СправочникСсылка.Организации") Тогда
             // Устанавливаем признак использования отбора
             ОтборОрганизацияИспользование = ЗначениеЗаполнено(ЭтаФорма.Организация);
        КонецЕсли;
    КонецЕсли;
    
КонецПроцедуры

Метод 2. Программное управление компоновщиком настроек

Если нам нужно установить отбор непосредственно в ДинамическийСписок, минуя элементы интерфейса, мы должны обратиться к КомпоновщикуНастроек. Это более надежный метод для фильтрации данных на уровне запроса к базе данных.

Посмотрим на пример установки отбора через пользовательские настройки. Это позволит пользователю увидеть фильтр в списке настроек и, при необходимости, изменить его.


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

КонецПроцедуры

Метод 3. Использование функций БСП для типовых форм

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

Используем метод УстановитьБыстрыйОтбор из общего модуля ОтборыСписковКлиентСервер:


// В обработчике ПриОткрытии или после программного изменения реквизита на клиенте
&AtClient
Процедура ПриОткрытии(Отказ)
    
    // Устанавливаем быстрый отбор по полю "Организация"
    // ЭтотМетод обновит и данные в динамическом списке, и визуальное состояние формы
    ОтборыСписковКлиентСервер.УстановитьБыстрыйОтбор(ЭтотОбъект, "Организация");
    
КонецПроцедуры

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

Метод 4. Универсальное решение через расширение (для множества справочников)

Если ваша задача — установить организацию для 20–30 различных форм, прописывать код в каждой из них будет неэффективно. Проанализируем ситуацию: как сделать это в одном месте? Для этого идеально подходят Переопределяемые модули.

Рассмотрим алгоритм реализации:

  1. Создаем расширение конфигурации.
  2. Заимствуем в расширение общий модуль МодификацияКонфигурацииПереопределяемый.
  3. Добавляем обработчик в процедуру ПриСозданииНаСервере.

Пример реализации в общем модуле расширения:


&После("ПриСозданииНаСервере")
Процедура Расш_ПриСозданииНаСервере(Форма, Отказ, СтандартнаяОбработка)
    
    // Проверяем, есть ли у формы параметр "УстановитьМоюОрганизацию"
    Если Форма.Параметры.Свойство("УстановитьМоюОрганизацию") Тогда
        
        ОрганизацияДляУстановки = Форма.Параметры.УстановитьМоюОрганизацию;
        
        // Пытаемся найти реквизит "Организация" на форме
        Попытка
            Если Форма.Метаданные().Реквизиты.Найти("Организация") <> Неопределено Тогда
                Форма.Организация = ОрганизацияДляУстановки;
                // Для БП 3.0 вызываем обновление
                ОтборыСписковКлиентСервер.УстановитьБыстрыйОтбор(Форма, "Организация");
            КонецЕсли;
        Исключение
            // Если реквизита нет, можно попробовать установить отбор напрямую в список
            Если Форма.Элементы.Найти("Список") <> Неопределено Тогда
                // Здесь вызываем процедуру установки отбора в компоновщик (см. Метод 2)
            КонецЕсли;
        КонецПопытки;
        
    КонецЕсли;
    
КонецПроцедуры

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

Особенности использования «Фиксированных настроек»

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

Выясним, как это реализовать при открытии:


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

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

Подводя итог, выбор метода зависит от ваших целей. Для разовой задачи подойдет проброс параметров и правка ПриСозданииНаСервере. Для массовой автоматизации — использование расширений и общих модулей БСП. А для строгого разграничения прав доступа лучше смотреть в сторону RLS (Record Level Security) или фиксированных настроек динамического списка.

← На главную