При разработке в среде 1С:Предприятие 7.7 часто возникает задача отобразить в журнале только определенные документы — например, конкретных видов или с заданным значением реквизита (флаг закрытия, статус, организация). Начинающие разработчики нередко сталкиваются с ошибкой Неверное имя реквизита! при вызове метода УстановитьОтбор() или с ситуацией, когда фильтр попросту не срабатывает и журнал показывает все документы без исключения.
Разберем подробно, как устроен механизм фильтрации в 1С 7.7, выясним причину распространенных ошибок и настроим отбор по шагам.
Типичная ошибка заключается в попытке наложить отбор на обычную визуальную графу, созданную внутри конкретного журнала. Рассмотрим, что происходит при таком подходе:
ЗакрытьАвтоматом) и связывает ее с реквизитом документа.УстановитьОтбор("ЗакрытьАвтоматом", 1);.Неверное имя реквизита!, либо отбор игнорируется.Причина такого поведения заключается в архитектуре платформы: метод УстановитьОтбор() в общем журнале работает не с визуальными графами самого журнала, а исключительно со специальным объектом метаданных — Графой отбора, которая создается в корне конфигурации.
Разберем по шагам правильный алгоритм настройки отбора в общем журнале:
Журналы → Графы отбора. Добавляем новую графу отбора и задаем ей понятный идентификатор, например ЗакрытАвтоматом.Посмотрим на пример корректного кода в модуле формы журнала:
Процедура ПриОткрытии()
// Устанавливаем фильтр по созданной графе отбора
УстановитьОтбор("ЗакрытАвтоматом", 1);
КонецПроцедуры
Обратите внимание: первым параметром передается строковое имя графы отбора (в кавычках), а вторым — значение, по которому фильтруются строки.
Проанализируем технические особенности и ограничения штатного механизма отборов, которые важно учитывать при проектировании:
УстановитьОтбор() не объединяет условия через логическое «И», а полностью перезаписывает предыдущий фильтр.=). Условия «не равно», «в списке» или сравнения «больше/меньше» через метод УстановитьОтбор() не поддерживаются._1SCRDOC). Запись в нее попадает только в том случае, если реквизит документа привязан к графе отбора и заполнен. Если вид документа не содержит такого реквизита, отфильтровать документы по признаку отсутствия значения штатным отбором невозможно.УстановитьОтбор("ВидДокумента", "ИмяВида")) также является одиночным отбором и не может применяться параллельно с отбором по графе.Если перед вами стоит задача отфильтровать документы сразу по нескольким критериям (например, определенный вид документа И статус закрытия), рассмотрим следующие способы решения:
КлючОтбора). При записи или проведении документа этот реквизит автоматически заполняется конкатенацией параметров (например, ПриходнаяНакладная_1). Графа отбора настраивается по этому реквизиту, а фильтрация выполняется одной строкой:УстановитьОтбор("КлючОтбора", "ПриходнаяНакладная_1");ТаблицаЗначений, которая заполняется программно через объект Запрос или выборку ВыбратьДокументы().Для того чтобы программно отключить ранее установленный фильтр и вернуть отображение всех документов в журнале, используем передачу пустых строковых параметров:
УстановитьОтбор("", "");
Важное замечание: если графа отбора была добавлена в существующую информационную базу с уже созданными документами, новые индексы для старых документов автоматически не сформируются. Чтобы документы попали в выборку, необходимо выполнить реиндексацию базы данных через режим «Тестирование и исправление» в Конфигураторе либо программно пересохранить существующие документы.