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