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

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

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

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

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

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

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

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

У каждого набора записей есть свойство Отбор — коллекция элементов отбора, состав которой определяется метаданными регистра. Для регистра сведений это все измерения, для регистра накопления и бухгалтерии — обязательный элемент «Регистратор». Обращение к элементу идёт по имени: НаборЗаписей.Отбор.Регистратор или НаборЗаписей.Отбор.Организация.

Каждый элемент отбора имеет три ключевых свойства: Значение (чему равно поле), Использование (учитывать ли элемент при чтении/записи) и ВидСравнения. Важная особенность: если установить значение, но оставить Использование = Ложь, отбор фактически не применится — платформа проигнорирует условие.

Метод Установить(Значение) делает оба действия сразу: присваивает значение и включает использование. Именно поэтому в типовом коде чаще всего встречается короткая запись через Установить(), а раздельное присваивание свойств используют, когда нужно гибко управлять включением условия.

Как установить отбор: базовый синтаксис

Типовой фрагмент для регистра накопления, где отбор возможен только по регистратору, выглядит так:

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

НаборЗаписей.Отбор.Регистратор.Установить(СсылкаНаДокумент);

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

Для регистра сведений отбор ставится по измерениям. Например, чтобы получить цену конкретной номенклатуры в конкретном типе цен:

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

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

НаборЗаписей.Отбор.ТипЦен.Установить(ТипЦен);

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

Если требуется отключить ранее установленный элемент, присвойте Использование = Ложь — значение при этом можно не очищать. Для сброса всего отбора достаточно пройти по коллекции и выключить использование каждого элемента.

Порядок действий
  1. 1
    Создайте набор записей через менеджер регистра: РегистрыСведений.Имя.СоздатьНаборЗаписей()
  2. 2
    Установите отбор по нужным измерениям или регистратору методом Установить(Значение)
  3. 3
    Вызовите Прочитать(), если нужно получить существующие записи
  4. 4
    Измените, добавьте или очистите строки набора
  5. 5
    Вызовите Записать() и проверьте результат в базе

Отбор при записи: как не стереть чужие данные

Ключевое правило платформы: при вызове Записать() набор полностью замещает все записи регистра, попадающие под текущий отбор. Если отбор не установлен вовсе, а набор пуст, запись пустого набора удалит все записи регистра — это самая разрушительная ошибка при работе с наборами.

Безопасный сценарий замены движений документа выглядит так: отбор по регистратору установлен, набор заполнен (или намеренно очищен для удаления движений), затем вызван Записать(). В модуле объекта документа движения обычно доступны через Движения.ИмяРегистра, где отбор по регистратору платформа устанавливает автоматически.

Для регистра сведений с несколькими измерениями будьте внимательны к полноте отбора. Если вы хотите заменить записи только по одной организации, а отбор установили только по номенклатуре, запись затронет данные всех организаций с этой номенклатурой.

Особенности для разных видов регистров

Регистры сведений

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

Для независимого регистра сведений отбор по всем измерениям необязателен: можно установить только часть измерений, и набор будет работать с соответствующим подмножеством записей. Для подчинённого регистратора регистра сведений обязателен отбор по регистратору.

Регистры накопления, бухгалтерии и расчёта

В этих регистрах отбор набора доступен только по регистратору. Попытка обратиться к измерению через Отбор вызовет ошибку, потому что элемента с таким именем в коллекции нет. Если нужно изменить записи по условию из данных (например, по складу), сначала запросом найдите регистраторы, затем работайте с наборами каждого из них.

Сравнение вариантов

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

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

Запрос с условием ГДЕ

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

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

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

Типовые ошибки и как их диагностировать

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

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

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

Типичные ошибки
01
Установить Значение, но забыть Использование = Истина — условие не применится, прочитаются или перезапишутся лишние записи
02
Записать пустой набор без отбора — удаляются все записи регистра
03
Искать в Отбор измерение регистра накопления — там доступен только Регистратор, возникает ошибка обращения
04
Пытаться задать диапазон дат через отбор набора — поддерживается только равенство, нужен запрос
05
Записывать набор без Прочитать() там, где нужно дополнение, — существующие записи замещаются

Проверка результата после установки отбора

После чтения проверяйте НаборЗаписей.Количество() и выводите значения отбора в журнал или сообщение при отладке. Полезный приём — перед записью сравнить количество записей в базе по тому же отбору через запрос: если цифры расходятся с ожиданием, отбор настроен неверно.

В отладчике конфигуратора остановитесь после Прочитать() и раскройте набор: видны и состав отбора, и загруженные строки. Для контроля записи выполните тестовый прогон на копии базы и проверьте регистр через универсальный отчёт или консоль запросов.

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

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

Использование элементов отбора
Норма

У нужных элементов Использование = Истина и заполнено Значение

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

Значение задано, но Использование = Ложь — условие не работает

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

Совпадает с количеством по контрольному запросу с теми же условиями

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

Ноль при наличии данных или существенно больше ожидаемого

Содержимое регистра после Записать()
Норма

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

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

Пропали или изменились записи вне области отбора

FAQ

Можно ли установить отбор набора записей по условию «не равно» или по списку значений?

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

Чем отличается Установить() от присваивания Значение?

Метод Установить(Значение) одновременно присваивает значение и включает использование элемента отбора. Присваивание свойства Значение напрямую не меняет флаг Использования — если он был выключен, отбор не применится, что часто становится причиной «не работающего» условия.

Нужно ли вызывать Прочитать() перед Записать()?

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

Как очистить все движения документа по регистру?

Создайте набор записей регистра, установите отбор по регистратору методом Установить(СсылкаНаДокумент) и вызовите Записать() без заполнения строк. Пустой набор с корректным отбором удалит только записи этого документа. Обязательно проверьте, что отбор установлен, до вызова записи.

Почему при обращении к Отбор.ИмяИзмерения возникает ошибка «Поле объекта не обнаружено»?

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

Как установить отбор в наборе записей динамически, по имени измерения из переменной?

Используйте метод Найти(ИмяПоля) коллекции отбора: ЭлементОтбора = НаборЗаписей.Отбор.Найти(ИмяИзмерения). Если элемент найден, вызовите ЭлементОтбора.Установить(Значение). Такой подход применяют в универсальных обработках, где состав измерений заранее неизвестен.

Итог

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

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