К статье
Практический материал

Разработка и Конфигурация · 13 мин

Как установить отбор в регистре сведений в 1С

Как установить отбор в регистре сведений 1С: через форму списка, динамический список и программно на встроенном языке. Примеры кода, ошибки и проверка результата.

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

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

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

Что нужно знать перед установкой отбора

Прежде чем настраивать отбор, откройте регистр в конфигураторе и посмотрите его структуру: какие поля являются измерениями, какие — ресурсами, а какие — реквизитами. Измерения задают координаты записи (например, «Организация», «Номенклатура»), ресурсы хранят значения (цена, курс, ставка), реквизиты — дополнительные пояснения. От этого деления зависит, каким способом можно фильтровать данные.

Также определите периодичность регистра. Для периодического регистра сведений в отборе набора записей доступно поле «Период», а для чтения актуальных значений удобнее использовать виртуальную таблицу «СрезПоследних» или «СрезПервых» в запросе. Для непериодического регистра таких виртуальных таблиц нет, и работа ведётся напрямую с основной таблицей.

Как установить отбор в форме списка без программирования

В пользовательском режиме откройте регистр сведений через раздел «Все функции» или через стандартную навигацию прикладного решения. В форме списка нажмите кнопку «Ещё» и выберите пункт «Настроить список». В открывшемся окне на закладке «Отбор» добавьте поле, по которому нужно фильтровать, выберите вид сравнения («Равно», «В списке», «Содержит» и другие) и укажите значение.

После нажатия «ОК» список покажет только записи, удовлетворяющие условию. Признак того, что отбор активен, — информационная строка о настроенном отборе над таблицей списка. Чтобы снять фильтр, снова откройте «Настроить список» и удалите условие либо отключите его флажком, не стирая саму настройку.

Порядок действий в форме списка
  1. 1
    Откройте регистр сведений через «Все функции» или меню прикладного решения
  2. 2
    Нажмите «Ещё» → «Настроить список»
  3. 3
    На закладке «Отбор» добавьте поле и задайте вид сравнения и значение
  4. 4
    Нажмите «ОК» и убедитесь, что над списком появилась строка активного отбора
  5. 5
    Для снятия фильтра отключите условие в той же настройке

Отбор через строку поиска и быстрый отбор

В тонком клиенте доступен упрощённый вариант: поле поиска в командной панели списка ищет по отображаемым колонкам. Это быстрее, чем полная настройка, но менее гибко — нельзя задать сложные условия и комбинации. Для разовой фильтрации по одному значению этого достаточно, для повторяющихся задач лучше сохранить настройку списка как вариант.

Как настроить отбор в динамическом списке формы

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

Программно отбор динамического списка устанавливается в обработчике «ПриСозданииНаСервере» формы. Это удобно, когда форма открывается с параметром — например, список цен по конкретной номенклатуре, переданной из карточки товара.

&НаСервере

Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

ЭлементОтбора = Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));

ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Номенклатура");

ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;

ЭлементОтбора.ПравоеЗначение = Параметры.Номенклатура;

ЭлементОтбора.Использование = Истина;

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

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

Программный отбор через набор записей

Набор записей — основной объект для программного чтения и записи регистра сведений. Отбор устанавливается до вызова методов «Прочитать» или «Записать» и определяет, с какой порцией данных работает набор. Каждому измерению регистра соответствует элемент отбора с тем же именем.

НаборЗаписей = РегистрыСведений.ЦеныНоменклатуры.СоздатьНаборЗаписей();

НаборЗаписей.Отбор.Номенклатура.Установить(ТекущаяНоменклатура);

НаборЗаписей.Прочитать();

Для Каждого Запись Из НаборЗаписей Цикл

Сообщить("Цена: " + Запись.Цена);

КонецЦикла;

Метод «Установить» принимает значение и необязательный второй параметр «Использование». Если передать «Ложь», элемент отбора останется в коллекции, но фильтровать не будет. Для периодического регистра добавьте отбор по полю «Период», если нужна запись на конкретную дату.

Отбор по нескольким измерениям

Элементы отбора комбинируются по логике «И»: набор прочитает только записи, где совпадают все указанные значения. Например, отбор по номенклатуре и типу цен вернёт записи конкретного товара по конкретному виду цен. Частичный отбор допустим — можно задать только одно измерение из нескольких.

Чтение одной записи через менеджер записи

Если известны значения всех измерений (и период для периодического регистра), удобнее использовать менеджер записи — он читает ровно одну запись по полному ключу. Это быстрее и нагляднее, чем набор записей с полным отбором.

МенеджерЗаписи = РегистрыСведений.КурсыВалют.СоздатьМенеджерЗаписи();

МенеджерЗаписи.Валюта = ВалютаДоллар;

МенеджерЗаписи.Период = ТекущаяДатаСеанса();

МенеджерЗаписи.Прочитать();

Если МенеджерЗаписи.Выбран() Тогда

Курс = МенеджерЗаписи.Курс;

КонецЕсли;

Метод «Выбран» возвращает «Истина», если запись с таким ключом существует. Всегда проверяйте его перед обращением к ресурсам, иначе при отсутствии записи получите значения по умолчанию (нули, пустые ссылки), что может незаметно исказить расчёты.

Отбор через запрос: когда нужен этот способ

Запрос — единственный способ отобрать записи по ресурсам и реквизитам, а также получить срез первых или последних значений периодического регистра. Для чтения больших объёмов данных запрос также предпочтительнее цикла по набору записей, потому что выполняется на сервере СУБД одним обращением.

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| Цены.Номенклатура,

| Цены.Цена

|ИЗ

| РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Период, ) КАК Цены

|ГДЕ

| Цены.Цена > &МинимальнаяЦена";

Запрос.УстановитьПараметр("Период", ТекущаяДатаСеанса());

Запрос.УстановитьПараметр("МинимальнаяЦена", 1000);

Результат = Запрос.Выполнить().Выбрать();

Параметры виртуальной таблицы «СрезПоследних» позволяют задать отбор прямо в круглых скобках — это эффективнее, чем фильтрация в секции «ГДЕ», потому что платформа строит более оптимальный план запроса. Условие на ресурсы при этом остаётся в секции «ГДЕ».

Сравнение способов отбора

Настройка списка в форме

Подходит пользователю без программирования; работает по любым видимым полям, но не применима в коде

Отбор набора записей

Для программного чтения и записи; только по измерениям и периоду, нельзя по ресурсам

Менеджер записи

Для одной записи по полному ключу измерений; требует значений всех измерений

Запрос

Универсальный: отбор по любым полям, срезы, большие объёмы; только чтение, для изменения нужен набор или менеджер

Отбор динамического списка

Для форм и отчётов; любые поля, но только отображение, без изменения данных

Как проверить, что отбор работает правильно

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

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

Контрольные точки

Как проверить результат

Строка отбора над списком
Норма

Отображается заданное условие, список содержит только подходящие записи

Тревожный признак

Строки нет или видны лишние записи — отбор не применён

НаборЗаписей.Количество() после Прочитать
Норма

Больше нуля при существующих данных

Тревожный признак

Ноль — проверьте тип и значение в отборе

МенеджерЗаписи.Выбран()
Норма

Истина — запись найдена

Тревожный признак

Ложь — ключ не совпал, ресурсы содержат значения по умолчанию

Записанный набор
Норма

Изменены только записи под отбором

Тревожный признак

Затронуты другие данные — отбор был неполным

Типичные ошибки при установке отбора

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

Типичные ошибки
01
Попытка отбора набора записей по ресурсу — ошибка «Поле не найдено»; используйте запрос или динамический список
02
Запись набора без отбора — удаление всех записей регистра; всегда устанавливайте отбор перед Записать
03
Несовпадение типа значения отбора (строка вместо ссылки) — пустой результат без сообщения об ошибке
04
Отбор по периоду без учёта времени — запись с датой 10:30 не попадает под условие «равно началу дня»; используйте диапазон или КонецДня
05
Обращение к ресурсам менеджера записи без проверки Выбран() — в расчётах участвуют нули вместо реальных данных

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

Если отбор по измерению часто используется в запросах и списках, проверьте, что измерение входит в индексы регистра — по умолчанию измерения индексируются автоматически. А вот отбор по реквизиту без индекса на большом регистре может выполняться долго; для часто используемых условий включайте у реквизита свойство «Индексировать».
ПЗ
Практическое замечание

FAQ

Можно ли установить отбор по ресурсу регистра сведений?

Через набор записей — нет, его отбор работает только по измерениям и периоду. Для фильтрации по ресурсам используйте запрос с условием в секции «ГДЕ», динамический список с отбором компоновки данных или интерактивную настройку списка в форме регистра.

Почему набор записей после «Прочитать» пустой, хотя данные в регистре есть?

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

Как отобрать записи периодического регистра за интервал дат?

Отбор набора записей по периоду работает только на равенство, поэтому для интервала используйте запрос с условием «Период МЕЖДУ &Начало И &Конец» по основной таблице регистра. В динамическом списке задайте два элемента отбора: «Больше или равно» и «Меньше или равно».

Чем отличается отбор в наборе записей от отбора в динамическом списке?

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

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

Вызовите метод «Сбросить» у конкретного элемента отбора, например НаборЗаписей.Отбор.Номенклатура.Сбросить(), или установите его свойство «Использование» в Ложь. После этого набор будет работать со всеми записями регистра — учитывайте это перед вызовом «Записать».

Опасно ли записывать набор записей с частичным отбором?

Сам по себе частичный отбор безопасен: набор заместит только записи, попадающие под установленные условия. Опасность представляет запись вообще без отбора — она удалит все данные регистра. Перед записью всегда проверяйте, что хотя бы один элемент отбора активен, и тестируйте код на копии базы.

Итог

Что важно запомнить

Отбор в регистре сведений устанавливается интерактивно через «Настроить список» или программно через набор записей, менеджер записи, запрос и динамический список. Набор записей фильтрует только по измерениям и периоду; для ресурсов нужен запрос. Перед записью набора всегда проверяйте установленный отбор, а результат чтения — через Количество() или Выбран().