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