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

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

Документ-регистратор движений регистра в 1С: как выбрать

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

Каждая запись в регистре накопления, сведений (подчинённом регистратору) или бухгалтерии связана с документом, который её создал. Этот документ хранится в служебном поле «Регистратор», и именно через него строятся отчёты, обработки проверки данных и механизмы перепроведения. Умение правильно выбрать регистратор — базовый навык при разработке на платформе 1С:Предприятие.

Задача возникает в нескольких типовых сценариях: нужно получить список документов, изменивших остатки по регистру; найти документы, у которых движения отсутствуют или «зависли»; построить отчёт по документам с детализацией до сумм движений. Во всех случаях работа ведётся через поле Регистратор в запросе либо через методы объекта набора записей.

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

Что такое регистратор и где он хранится

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

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

Выборка регистраторов запросом

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

ВЫБРАТЬ РАЗЛИЧНЫЕ

Движения.Регистратор КАК Документ

ИЗ

РегистрНакопления.ТоварыНаСкладах КАК Движения

ГДЕ

Движения.Период МЕЖДУ &НачалоПериода И &КонецПериода

Если нужны не только ссылки, но и реквизиты документов (номер, дата, контрагент), обращайтесь к ним через точку от поля Регистратор — платформа выполнит неявное соединение. Однако при больших объёмах это дороже, чем явное левое соединение с таблицей документа, поэтому в тяжёлых отчётах предпочтителен второй вариант.

bsl
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ
| Движения.Регистратор КАК Документ
|ИЗ РегистрНакопления.ТоварыНаСкладах КАК Движения
|ГДЕ Движения.Регистратор ССЫЛКА Документ.РеализацияТоваровУслуг";
Результат = Запрос.Выполнить().Выгрузить();

Отбор по типу документа

Поле Регистратор имеет составной тип: в регистре могут писать несколько видов документов. Чтобы выбрать регистраторы только одного типа, используйте оператор ССЫЛКА в условии или приведение типа через ВЫРАЗИТЬ.

Условие Регистратор ССЫЛКА Документ.РеализацияТоваровУслуг отфильтровывает записи на уровне проверки типа. Приведение ВЫРАЗИТЬ(Движения.Регистратор КАК Документ.РеализацияТоваровУслуг) дополнительно позволяет обращаться к реквизитам конкретного документа и ускоряет соединения, так как платформа работает уже с конкретной таблицей.

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

ССЫЛКА в условии ГДЕ

Простая фильтрация по типу, подходит когда нужны только ссылки. Не даёт доступа к реквизитам документа.

ВЫРАЗИТЬ с приведением типа

Позволяет обращаться к реквизитам документа и оптимизирует соединения. Требует знания конкретного типа заранее.

Соединение с таблицей документа

Гибкий доступ к любым полям документа, но при составном типе регистратора соединение выполняется по каждой таблице и может быть медленным.

Выборка движений конкретного документа

Обратная задача — получить все записи регистра, сформированные конкретным документом. В запросе это отбор по равенству поля Регистратор ссылке: ГДЕ Движения.Регистратор = &Ссылка. Параметр передаётся как ссылка на документ, а не как строка или структура.

В программном коде удобнее работать через набор записей: получить РегистрыНакопления.ИмяРегистра.СоздатьНаборЗаписей(), установить отбор по регистратору и прочитать. Этот способ применяется в обработчиках проведения и при ручной корректировке движений.

Порядок действий
  1. 1
    Создайте набор записей регистра через менеджер регистра
  2. 2
    Установите отбор: Набор.Отбор.Регистратор.Установить(СсылкаНаДокумент)
  3. 3
    Вызовите Набор.Прочитать() — в набор загрузятся только записи этого документа
  4. 4
    Проверьте Набор.Количество() — ноль означает отсутствие движений

Поиск документов без движений и «зависших» записей

Типовая аналитическая задача — найти проведённые документы, которые почему-то не оставили записей в регистре. Запрос строится от таблицы документов с левым соединением к таблице движений и условием IS NULL на регистратор.

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

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

После построения выборки убедитесь, что количество уникальных регистраторов соответствует ожиданиям: сравните с числом проведённых документов за период. Если запрос возвращает больше строк, чем ожидалось, проверьте, не забыли ли РАЗЛИЧНЫЕ — без него каждый документ повторяется столько раз, сколько у него строк движений.

Типичные ошибки
01
Забытый РАЗЛИЧНЫЕ — документы дублируются по числу записей в регистре
02
Обращение к реквизитам через точку от составного поля Регистратор без ВЫРАЗИТЬ — медленные соединения и лишние обращения к СУБД
03
Сравнение регистратора со строкой или структурой вместо ссылки — запрос возвращает пустой результат
04
Игнорирование непроведённых документов при поиске движений — в выборку попадают лишние ссылки
05
Отбор по периоду без учёта границы — последний документ периода выпадает из выборки
Контрольные точки

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

Количество уникальных регистраторов
Норма

Совпадает с числом проведённых документов, делающих движения

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

Строк больше — дубли из-за отсутствия РАЗЛИЧНЫЕ

Типы документов в выборке
Норма

Только ожидаемые виды документов

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

Появились посторонние типы — нет фильтра ССЫЛКА

Реквизиты документов
Норма

Номер и дата заполнены

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

NULL в полях — соединение сошлось не на ту таблицу

FAQ

Можно ли выбрать регистратор без запроса, чисто встроенным языком?

Да. Перебором набора записей регистра с чтением поля Регистратор у каждой записи, но это медленно на больших таблицах. Для списка документов запрос с РАЗЛИЧНЫЕ всегда предпочтительнее.

Почему условие «Регистратор = &Ссылка» возвращает пустой результат?

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

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

Используйте условие с ИЛИ: Регистратор ССЫЛКА Документ.ПриходнаяНакладная ИЛИ Регистратор ССЫЛКА Документ.РасходнаяНакладная. Альтернатива — проверка ТИПЗНАЧЕНИЯ(Регистратор) в списке значений.

Есть ли поле Регистратор у независимого регистра сведений?

Нет. Поле Регистратор существует только у регистров, подчинённых регистратору. У независимого регистра сведений записи создаются напрямую, и связать их с документом можно только через пользовательские реквизиты.

Как в СКД вывести документы-регистраторы с суммами движений?

В наборе данных запроса выберите Регистратор и ресурсы регистра, сгруппируйте по регистратору. Для реквизитов документа добавьте характеристики или соединение с таблицей документа через ВЫРАЗИТЬ.

Итог

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

Регистратор выбирается из таблицы движений регистра через поле «Регистратор» с РАЗЛИЧНЫЕ. Тип документа фильтруется оператором ССЫЛКА или приведением ВЫРАЗИТЬ, движения конкретного документа — отбором по ссылке. Прямое удаление записей регистра без перепроведения недопустимо.