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

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

Как вывести регистратор в запросе 1С

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

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

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

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

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

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

Базовый вывод регистратора в запросе

Простейший вариант — выбрать поле Регистратор напрямую из таблицы регистра. Для регистра накопления «ТоварыНаСкладах» запрос выглядит так:

ВЫБРАТЬ

Товары.Регистратор КАК Регистратор,

Товары.Номенклатура КАК Номенклатура,

Товары.Количество КАК Количество

ИЗ

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

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

Для регистров сведений, подчинённых регистратору, и регистров бухгалтерии подход тот же: поле Регистратор присутствует в основной таблице. В регистре бухгалтерии дополнительно доступно поле Регистратор у виртуальной таблицы «ДвиженияССубконто» при соответствующей настройке периодичности.

Вывод номера, даты и представления регистратора

Часто ссылки недостаточно — в отчёте нужно показать номер и дату документа. Язык запросов позволяет обращаться к реквизитам регистратора «через точку» без явного соединения:

ВЫБРАТЬ

Товары.Регистратор КАК Документ,

Товары.Регистратор.Номер КАК Номер,

Товары.Регистратор.Дата КАК Дата

ИЗ

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

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

Если нужно текстовое представление документа (как его видит пользователь: «Поступление товаров 000001 от 12.03…»), есть два пути. Первый — вывести ссылку и позволить СКД или форме отчёта самой показать представление. Второй — использовать функцию ПРЕДСТАВЛЕНИЕ(Товары.Регистратор) в запросе, но помните, что результат станет строкой, по которой нельзя выполнить отбор или соединение.

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

Отбор по регистратору и определение его типа

Самая частая задача — выбрать движения одного конкретного документа. Отбор ставится в секции ГДЕ или, что эффективнее, в параметрах виртуальной таблицы:

ВЫБРАТЬ

Товары.Номенклатура КАК Номенклатура,

Товары.КоличествоОборот КАК Количество

ИЗ

РегистрНакопления.ТоварыНаСкладах.Обороты(, , Регистратор, ) КАК Товары

ГДЕ

Товары.Регистратор = &Документ

Когда нужно понять, каким видом документа создана запись, используйте функцию ТИПЗНАЧЕНИЯ() в сочетании с ВЫБОР или оператором ССЫЛКА:

ВЫБРАТЬ

ВЫБОР

КОГДА Товары.Регистратор ССЫЛКА Документ.ПоступлениеТоваров

ТОГДА "Поступление"

КОГДА Товары.Регистратор ССЫЛКА Документ.РеализацияТоваров

ТОГДА "Реализация"

ИНАЧЕ "Прочее"

КОНЕЦ КАК ВидДвижения

ИЗ

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

Оператор ССЫЛКА также применяется для отбора по типу: ГДЕ Товары.Регистратор ССЫЛКА Документ.РеализацияТоваров оставит только движения реализаций. Это удобно, когда нужно исключить, например, документы корректировки или инвентаризации из аналитического отчёта.

Порядок действий для отбора движений документа
  1. 1
    Откройте консоль запросов или конструктор запроса в конфигураторе
  2. 2
    Выберите таблицу регистра, для виртуальной таблицы Обороты укажите периодичность «Регистратор»
  3. 3
    Добавьте условие ГДЕ Регистратор = &Документ
  4. 4
    Передайте в параметр ссылку на документ и выполните запрос
  5. 5
    Проверьте, что состав движений совпадает с данными на вкладке движений самого документа

Вывод регистратора в СКД и динамических списках

В системе компоновки данных регистратор выводится тем же запросом, но есть нюансы с расшифровкой. Если поле Регистратор добавлено в ресурсы или группировки отчёта, пользователь сможет развернуть итог до документов. Для корректной работы расшифровки поле должно присутствовать в выборке на верхнем уровне набора данных, а не только во вложенных группировках.

В динамических списках регистров (например, форма списка регистра сведений) колонка «Регистратор» включается в настройках списка и позволяет открыть документ прямо из записи. Если список построен произвольным запросом, убедитесь, что поле Регистратор входит в выборку — иначе переход к документу будет недоступен.

При выводе регистратора в печатные формы и макеты учитывайте, что платформа сама отображает представление ссылки. Явно формировать строку через ПРЕДСТАВЛЕНИЕ() стоит только тогда, когда нужен нестандартный формат или объединение нескольких полей в одну ячейку.

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

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

Состав движений по отбору
Норма

Записи в запросе совпадают с табличной частью движений документа в пользовательском режиме

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

Число строк или суммы отличаются — проверьте параметры виртуальной таблицы и отбор

Тип регистратора
Норма

В колонке видны ссылки ожидаемых видов документов

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

Появились неожиданные типы — проверьте список регистраторов регистра в конфигураторе

Номер и дата через точку
Норма

Реквизиты заполнены для всех строк

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

Пустые значения — возможно, используется соединение вместо разыменования или битая ссылка

Типичные ошибки и ограничения

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

Вторая частая проблема — сравнение регистратора со значением другого типа или использование его в соединении без учёта составного типа. Соединение таблицы регистра с конкретным документом по условию «Регистратор = Документ.Ссылка» работает, но слева должно быть поле, приведённое к нужному типу через ВЫРАЗИТЬ, если в запросе уже есть операции над полем.

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

Типичные ошибки
01
Выбор поля Регистратор из таблицы Остатки — поле отсутствует, запрос не выполняется; используйте Обороты с периодичностью «Регистратор»
02
Забытая периодичность «Регистратор» в таблице Обороты — поле недоступно, хотя таблица та же самая
03
Массовое разыменование Регистратор.Номер, Регистратор.Дата и других реквизитов на больших таблицах — резкое падение производительности из-за скрытых соединений
04
Сравнение регистратора со строкой или числом вместо ссылки — отбор ничего не найдёт без сообщения об ошибке

Альтернативные способы получить регистратора

Не всегда нужен запрос. Если требуется просто посмотреть движения документа, в пользовательском режиме у большинства документов есть команда перехода к движениям по регистрам. Для массового анализа удобен стандартный отчёт «Движения документа» или универсальный отчёт по регистру с группировкой по регистратору.

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

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

Прямой запрос к таблице регистра

Максимальная гибкость и контроль; требует ручной оптимизации при больших объёмах

Виртуальная таблица Обороты с периодичностью «Регистратор»

Быстрые агрегаты по документам; не даёт детальных записей и требует правильной настройки параметров

СКД с полем Регистратор

Готовая расшифровка и переход к документу из отчёта; меньше контроля над итоговым SQL

Просмотр движений в пользовательском режиме

Никакой разработки; подходит только для разового анализа одного документа

Часто задаваемые вопросы

Почему в таблице Остатки нет поля Регистратор?

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

Как вывести регистратора, если движения создают разные виды документов?

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

Можно ли в отборе сравнить регистратора со списком документов?

Да, используйте оператор В: ГДЕ Товары.Регистратор В (&СписокДокументов), передав в параметр массив или список значений со ссылками. Для больших списков эффективнее поместить документы во временную таблицу и выполнить соединение.

Почему Регистратор.Номер возвращает пустое значение?

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

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

В пользовательском режиме откройте документ и воспользуйтесь командой перехода к движениям по регистрам (обычно кнопка «Перейти» или отчёт «Движения документа»). Программно в модуле объекта движения доступны через коллекцию Движения с обращением по имени регистра.

Влияет ли вывод регистратора на производительность отчёта?

Само поле Регистратор выбирается дёшево — оно хранится в таблице регистра. Нагрузку создаёт разыменование реквизитов через точку: каждый такой реквизит порождает скрытое соединение с таблицей документа. На больших объёмах группируйте движения до регистраторов заранее и присоединяйте реквизиты к сокращённому набору.

Итог

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

Регистратор выбирается из основной таблицы регистра напрямую, а из таблицы Обороты — только при периодичности «Регистратор»; в таблице Остатки его нет. Реквизиты документа получайте через точку, но умеренно, тип документа определяйте оператором ССЫЛКА, а исправление движений выполняйте только перепроведением документа.