Разработка и Конфигурация · 12 мин
Как работают критерии отбора в 1С
Как устроены критерии отбора в 1С: состав, индексация, использование в запросах и формах. Практические примеры настройки, типичные ошибки и ограничения.
Критерий отбора в 1С — это объект конфигурации, который связывает несколько видов документов или задач по общему признаку и позволяет получить список объектов, удовлетворяющих заданному значению. Классический пример: критерий «По контрагенту» собирает все документы — заказы, накладные, счета, акты, — где указан конкретный контрагент, и выводит их единым списком независимо от вида документа.
Механизм работает на уровне платформы: разработчик указывает в конфигураторе, какие реквизиты каких объектов участвуют в критерии, а платформа автоматически создаёт служебную таблицу в базе данных и поддерживает её актуальность при записи документов. Запрос к критерию отбора выглядит как обращение к обычной таблице, но физически данные берутся из служебной таблицы, а не сканируются по всем документам.
Понимание внутреннего устройства критерия важно потому, что от состава участников и типов реквизитов зависит производительность базы, поведение при обмене данными и даже размер таблиц. Ниже разобрано, как критерий устроен, как его создать, где применять и каких ошибок избегать.
Что такое критерий отбора и как он устроен
Критерий отбора состоит из двух частей: типа критерия (значение, по которому ищем) и состава участников (реквизитов объектов, которые сравниваются с этим значением). Например, тип критерия — «СправочникСсылка.Контрагенты», а участники — реквизит «Контрагент» в документах «РеализацияТоваровУслуг», «ПоступлениеТоваровУслуг», «СчетФактура» и так далее.
При обновлении конфигурации платформа создаёт для критерия отдельную таблицу в СУБД. В ней хранятся три сущности: вид объекта, ссылка на объект и значение критерия. Каждый раз, когда документ-участник записывается, проводится или помечается на удаление, платформа пересчитывает соответствующие строки этой таблицы. Именно поэтому выборка по критерию выполняется быстро — это готовый индекс, а не полный перебор.
Важно понимать: в состав критерия могут входить только реквизиты, тип которых совместим с типом критерия. Если критерий типизирован как «СправочникСсылка.Контрагенты», то реквизит составного типа, включающего контрагентов среди прочих ссылок, тоже можно включить, но поиск будет работать только по значениям нужного типа.
Где критерии применяются на практике
Самый частый сценарий — журнал документов с отбором. В типовых конфигурациях на форме списка документов пользователь выбирает контрагента, организацию или договор, и список фильтруется по критерию отбора. Это работает быстрее, чем произвольный отбор динамического списка по реквизиту, особенно в журналах, объединяющих десятки видов документов.
Второй сценарий — программная выборка в коде. Через объект КритерииОтбораМенеджер или запрос к таблице критерия разработчик получает массив ссылок на документы по заданному значению. Это удобно в обработках свёртки, поиска дублей, построения цепочек связанных документов.
Третий сценарий — обмен данными. В планах обмена критерии отбора иногда используются для определения состава выгружаемых объектов: если документ попадает в критерий по значению организации, он регистрируется к выгрузке. Здесь
Чем заменить критерий отбора
Подходит для отбора разнородных документов по общему реквизиту. Ограничение: служебная таблица растёт с каждым участником, замедляя запись документов.
Подходит для журнала одного-двух видов документов. Ограничение: отбор по реквизиту без индекса вызывает полное сканирование таблиц.
Подходит для разовой выборки в отчёте. Ограничение: нет готового индекса, при больших объёмах выполняется медленно.
Как создать критерий отбора в конфигураторе
Создание выполняется в дереве конфигурации: ветка «Общие» → «Критерии отбора» → «Добавить». Дальше последовательность такая: сначала задаётся тип критерия, затем в свойстве «Состав» отмечаются реквизиты документов и других объектов, которые должны участвовать в отборе.
- 1Откройте конфигуратор, ветка «Общие» → «Критерии отбора», добавьте новый объект и задайте имя, например «ПоКонтрагенту».
- 2В свойстве «Тип» укажите тип значения отбора, например СправочникСсылка.Контрагенты.
- 3Откройте свойство «Состав» и отметьте флажками реквизиты документов, участвующих в критерии — платформа покажет только совместимые по типу.
- 4Обновите конфигурацию базы данных и дождитесь реструктуризации: платформа создаст служебную таблицу и заполнит её данными.
- 5Проверьте результат: откройте журнал документов или выполните тестовый запрос к критерию и сравните выборку с ручным поиском по документам.
При добавлении участников платформа автоматически отфильтровывает список доступных реквизитов по совместимости типов. Если нужный реквизит не отображается в списке — значит, его тип не включает тип критерия. Это первое, что стоит проверить, когда «реквизит не виден».
После реструктуризации на большой базе таблица критерия заполняется существующими данными, и этот процесс может занять заметное время. На рабочей базе обновление лучше выполнять в нерабочие часы, предварительно сделав резервную копию.
Как обратиться к критерию из кода и запроса
В запросе критерий отбора доступен как виртуальная таблица с именем вида «КритерийОтбора.ПоКонтрагенту». Запрос возвращает ссылки на объекты, у которых значение участвующего реквизита равно переданному параметру.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Критерий.Ссылка КАК Документ
|ИЗ
| КритерийОтбора.ПоКонтрагенту(&Контрагент) КАК Критерий";
Запрос.УстановитьПараметр("Контрагент", КонтрагентСсылка);
Результат = Запрос.Выполнить().Выгрузить();Альтернатива запросу — метод НайтиПоКритериюОтбора менеджера критерия: КритерииОтбора.ПоКонтрагенту.Найти(КонтрагентСсылка). Метод возвращает массив ссылок и удобен, когда не нужны дополнительные поля документов. Если требуются даты, номера, суммы — используйте запрос с соединением к таблицам документов.
В динамическом списке журнала документов критерий подключается через свойство «Критерий отбора» у журнала, после чего на форме появляется стандартный элемент отбора. Платформа сама формирует условие по критерию, и разработчику не нужно писать текст запроса вручную.
Производительность и ограничения
Главная цена критерия — нагрузка при записи. Каждый документ-участник при проведении или отмене проведения заставляет платформу обновить строки служебной таблицы. Если в критерии 30 видов документов, а база работает в режиме интенсивного ввода, суммарный эффект может стать ощутимым.
Второе ограничение — тип значения. Критерий отбирает только по равенству значения; диапазоны, подобие строки или сложные условия через критерий не реализуются. Для таких задач нужны запросы с условиями или индексирование реквизитов.
Третий момент — обмен и удаление. Служебная таблица критерия участвует в реструктуризации и при удалении объектов; при массовом удалении данных (свёртка базы, удаление помеченных) операции по таблице критерия добавляют время к процедуре. Планируйте такие операции с учётом размера критериев.
Типичные ошибки при работе с критериями
Отдельная группа проблем — расхождение состава критерия с реальными данными после доработок. Когда в конфигурацию добавляют новый документ, про критерии часто забывают. Признак проблемы: отбор по контрагенту показывает старые виды документов, но не показывает новый. Лечится добавлением реквизита нового документа в состав критерия и обновлением конфигурации.
Как проверить результат
Запрос к критерию возвращает все документы с заданным значением, включая свежепроведённые.
Часть документов с нужным значением в выборку не попадает.
Все виды документов с нужным реквизитом отмечены в свойстве «Состав».
Новые или редкие виды документов отсутствуют в составе.
Проведение документа-участника занимает столько же времени, что и до добавления в критерий.
Заметный рост времени проведения и блокировок после расширения критерия.
Когда критерий не нужен: альтернативы
Если отбор требуется в пределах одного вида документов, правильнее включить индексирование у реквизита (свойство «Индексировать») и использовать обычный отбор динамического списка. Это проще в сопровождении и не создаёт отдельной таблицы.
Если нужен сложный отбор — по нескольким условиям, диапазонам, вычисляемым полям — задачу решает запрос или произвольный запрос динамического списка. Критерий здесь не поможет, потому что его логика жёстко ограничена равенством одного значения.
Как выбрать действие
Перед добавлением критерия в типовую конфигурацию проверьте, нет ли уже подходящего типового критерия — в большинстве конфигураций критерии по контрагенту, организации и договору уже существуют, и доработка сводится к добавлению своего документа в их состав.
FAQ
Чем критерий отбора отличается от индекса реквизита?
Индекс ускоряет поиск внутри одной таблицы одного вида объектов. Критерий отбора создаёт отдельную таблицу, объединяющую реквизиты разных видов документов, и позволяет искать сразу по всем ним. Для одного вида документов достаточно индекса, критерий нужен для межвидового поиска.
Почему после добавления документа в критерий старые данные не видны в отборе?
После изменения состава критерия требуется обновление конфигурации базы данных — при реструктуризации платформа заполняет служебную таблицу существующими данными. Если обновление выполнено, а данных нет, проверьте, что реквизит документа действительно отмечен в составе и его тип совместим с типом критерия.
Можно ли использовать критерий отбора для отбора по дате или периоду?
Нет. Критерий работает только по точному равенству значения. Для отбора по периоду используйте стандартные настройки журнала документов, параметры динамического списка или запрос с условием по дате.
Влияет ли критерий отбора на скорость проведения документов?
Да. При записи и проведении каждого документа-участника платформа обновляет строки служебной таблицы критерия. Чем больше участников и чем чаще документы проводятся, тем заметнее нагрузка. Поэтому в состав включают только действительно нужные виды документов.
Как программно получить все документы по значению критерия?
Два способа: метод Найти у менеджера критерия (КритерииОтбора.ИмяКритерия.Найти(Значение)) возвращает массив ссылок, либо запрос к таблице КритерийОтбора.ИмяКритерия с параметром — он позволяет сразу соединить результат с таблицами документов и получить дополнительные поля.
Что произойдёт со служебной таблицей при удалении критерия из конфигурации?
При обновлении конфигурации базы данных платформа удалит таблицу критерия вместе с данными. Сами документы и их реквизиты не пострадают — удаляется только служебный индекс отбора.
Что важно запомнить
Критерий отбора — это поддерживаемый платформой индекс по общему реквизиту разных видов документов. Он ускоряет межвидовой поиск, но стоит нагрузки при записи и реструктуризации. Включайте в состав только нужные документы, для одного вида используйте индекс реквизита, а сложные условия решайте запросами.