Как программно открыть журнал документов с установленным отбором по реквизиту

Программист 1С v8.3 (Обычные формы) Управленческий учет
← На главную

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

Постановка задачи и анализ ситуации

Представим ситуацию: у нас есть объект ЖурналДокументов.ЖурналПСА. Нам необходимо сделать так, чтобы при его открытии в списке отображались только те записи, у которых реквизит МестоХранения соответствует определенному складу. Основная сложность заключается в том, что способ обращения к механизму отборов сильно зависит от типа используемых форм в вашей конфигурации.

Решение для Обычных форм (Толстый клиент)

В конфигурациях на обычных формах (таких как УПП 1.3 или старые версии БП 2.0) работа с отборами происходит через обращение к свойству Отбор табличного поля, которое отображает список документов. Разберем по шагам два способа реализации.

Способ 1: Установка отбора внутри самой формы журнала

Если нам нужно, чтобы журнал ВСЕГДА открывался с определенным фильтром, мы можем прописать код в модуле формы журнала в процедуре ПриОткрытии(). Проанализируем пример кода, который позволил автору вопроса решить задачу:


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

Важное замечание: Использование метода НайтиПоКоду считается "плохим тоном" в промышленной разработке, так как коды могут измениться. Рекомендуется использовать Предопределенные элементы или передавать готовую ссылку на объект.

Способ 2: Программное открытие формы с отбором извне

Более гибкий подход — это получение формы журнала программно, установка настроек и последующее открытие. Рассмотрим, как это сделать правильно, чтобы не перегружать модуль самой формы лишней логикой:


// Получаем форму нужного журнала
ФормаЖурнала = ЖурналыДокументов.ЖурналПСА.ПолучитьФорму("ФормаСписка");

// Обращаемся к реквизиту формы, который содержит список документов (обычно ДокументСписок)
// Метод Установить позволяет быстро задать значение и включить использование отбора
ФормаЖурнала.ДокументСписок.Отбор.МестоХранения.Установить(Справочники.МестаХранения.НайтиПоКоду("000000018"));

// Открываем настроенную форму
ФормаЖурнала.Открыть();

Решение для Управляемых форм (Такси, 8.3)

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

Рассмотрим, как передать отбор через метод ОткрытьФорму(). Выясним причину, по которой стандартная передача параметров может быть удобнее:


// Создаем структуру отбора
ПараметрыОтбора = Новый Структура;
ПараметрыОтбора.Вставить("МестоХранения", СсылкаНаСклад);

// Создаем параметры формы, куда помещаем наш отбор
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("Отбор", ПараметрыОтбора);

// Открываем форму с передачей параметров
ОткрытьФорму("ЖурналДокументов.ЖурналПСА.ФормаСписка", ПараметрыФормы);

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

Типичные ошибки и нюансы

При реализации отборов в журналах разработчики часто сталкиваются со следующими проблемами, которые мы сейчас проанализируем:

  1. Отсутствие графы в журнале: Если вы пытаетесь установить отбор по реквизиту, который есть в документе, но не добавлен в Графы журнала документов в конфигураторе, отбор может не сработать или вызвать ошибку. Убедитесь, что реквизит выведен в состав журнала.
  2. Различие в именах: Имя поля в ЭлементыФормы (для обычных форм) или имя колонки в ДинамическомСписке (для управляемых) должно строго совпадать с именем, к которому вы обращаетесь в коде.
  3. Использование в управляемых формах: В современных конфигурациях рекомендуется использовать свойство ФиксированныеНастройки компоновщика настроек динамического списка, если нужно запретить пользователю самостоятельно отключать установленный вами программно фильтр.

Продвинутый метод: Фиксированные настройки (Управляемые формы)

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


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

Этот метод является наиболее надежным для управляемого интерфейса, так как он интегрируется в систему компоновки данных (СКД), на которой базируются все современные списки 1С.

Заключение

Мы рассмотрели несколько подходов к решению задачи. Для обычных форм наиболее эффективным является метод Установить() для объекта отбора. Для управляемых форм — передача структуры параметров или программная настройка компоновщика данных. Выбор конкретного метода зависит от архитектуры вашей конфигурации и требований к гибкости настроек для конечного пользователя.

← На главную