При разработке в среде 1С часто возникает задача ограничить список документов в журнале по конкретному значению реквизита. Например, пользователю нужно видеть в журнале только документы по определенному складу, контрагенту или подразделению. В этой статье мы подробно разберем, как реализовать такой функционал, учитывая различия между Обычными формами и современными Управляемыми формами.
Представим ситуацию: у нас есть объект ЖурналДокументов.ЖурналПСА. Нам необходимо сделать так, чтобы при его открытии в списке отображались только те записи, у которых реквизит МестоХранения соответствует определенному складу. Основная сложность заключается в том, что способ обращения к механизму отборов сильно зависит от типа используемых форм в вашей конфигурации.
В конфигурациях на обычных формах (таких как УПП 1.3 или старые версии БП 2.0) работа с отборами происходит через обращение к свойству Отбор табличного поля, которое отображает список документов. Разберем по шагам два способа реализации.
Способ 1: Установка отбора внутри самой формы журнала
Если нам нужно, чтобы журнал ВСЕГДА открывался с определенным фильтром, мы можем прописать код в модуле формы журнала в процедуре ПриОткрытии(). Проанализируем пример кода, который позволил автору вопроса решить задачу:
Процедура ПриОткрытии()
// Указываем вид сравнения - Равно
ЭтаФорма.ЭлементыФормы.ДокументСписок.Значение.Отбор.МестоХранения.ВидСравнения = ВидСравнения.Равно;
// Активируем использование этого отбора
ЭтаФорма.ЭлементыФормы.ДокументСписок.Значение.Отбор.МестоХранения.Использование = Истина;
// Устанавливаем само значение поиска
// В данном примере поиск идет по коду, что допустимо для простых задач
ЭтаФорма.ЭлементыФормы.ДокументСписок.Значение.Отбор.МестоХранения.Значение = Справочники.МестаХранения.НайтиПоКоду("000000018");
КонецПроцедуры
Важное замечание: Использование метода НайтиПоКоду считается "плохим тоном" в промышленной разработке, так как коды могут измениться. Рекомендуется использовать Предопределенные элементы или передавать готовую ссылку на объект.
Способ 2: Программное открытие формы с отбором извне
Более гибкий подход — это получение формы журнала программно, установка настроек и последующее открытие. Рассмотрим, как это сделать правильно, чтобы не перегружать модуль самой формы лишней логикой:
// Получаем форму нужного журнала
ФормаЖурнала = ЖурналыДокументов.ЖурналПСА.ПолучитьФорму("ФормаСписка");
// Обращаемся к реквизиту формы, который содержит список документов (обычно ДокументСписок)
// Метод Установить позволяет быстро задать значение и включить использование отбора
ФормаЖурнала.ДокументСписок.Отбор.МестоХранения.Установить(Справочники.МестаХранения.НайтиПоКоду("000000018"));
// Открываем настроенную форму
ФормаЖурнала.Открыть();
В управляемом приложении работа с формами строится иначе. Мы не работаем с объектом формы напрямую до ее открытия так, как в обычных формах. Вместо этого мы используем структуру Параметры.
Рассмотрим, как передать отбор через метод ОткрытьФорму(). Выясним причину, по которой стандартная передача параметров может быть удобнее:
// Создаем структуру отбора
ПараметрыОтбора = Новый Структура;
ПараметрыОтбора.Вставить("МестоХранения", СсылкаНаСклад);
// Создаем параметры формы, куда помещаем наш отбор
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("Отбор", ПараметрыОтбора);
// Открываем форму с передачей параметров
ОткрытьФорму("ЖурналДокументов.ЖурналПСА.ФормаСписка", ПараметрыФормы);
В управляемых формах за отображение данных отвечает ДинамическийСписок. Если в параметрах формы передана структура с ключом Отбор, система автоматически попытается применить эти значения к полям динамического списка.
При реализации отборов в журналах разработчики часто сталкиваются со следующими проблемами, которые мы сейчас проанализируем:
ЭлементыФормы (для обычных форм) или имя колонки в ДинамическомСписке (для управляемых) должно строго совпадать с именем, к которому вы обращаетесь в коде.ФиксированныеНастройки компоновщика настроек динамического списка, если нужно запретить пользователю самостоятельно отключать установленный вами программно фильтр.Если ваша задача — жестко ограничить видимость данных в журнале без возможности сброса фильтра пользователем, разберем пример использования компоновщика настроек в процедуре ПриСозданииНаСервере на стороне формы журнала:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Проверяем, передан ли нужный нам параметр
Если Параметры.Свойство("ТолькоОпределенныйСклад") Тогда
ЭлементОтбора = Список.КомпоновщикНастроек.ФиксированныеНастройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("МестоХранения");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.Использование = Истина;
ЭлементОтбора.ПравоеЗначение = Параметры.ТолькоОпределенныйСклад;
КонецЕсли;
КонецПроцедуры
Этот метод является наиболее надежным для управляемого интерфейса, так как он интегрируется в систему компоновки данных (СКД), на которой базируются все современные списки 1С.
Мы рассмотрели несколько подходов к решению задачи. Для обычных форм наиболее эффективным является метод Установить() для объекта отбора. Для управляемых форм — передача структуры параметров или программная настройка компоновщика данных. Выбор конкретного метода зависит от архитектуры вашей конфигурации и требований к гибкости настроек для конечного пользователя.