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