Поле Регистратор в запросе: откуда брать и как получить документ

· 9 мин

Содержание

Поле Регистратор есть в таблице движений любого регистра — накопления, бухгалтерии и регистра сведений с подчинением регистратору. Чтобы вывести регистратор в запросе, обращаются к нему как к обычному полю: ВЫБРАТЬ Движения.Регистратор ИЗ РегистрНакопления.ТоварыНаСкладах КАК Движения. Это ссылка на документ, который сделал запись в регистр.

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

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

Что хранит поле Регистратор и в каких таблицах оно есть

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

Поле появляется не везде. Оно есть в:

  • 📂 физической (основной) таблице регистра накопления;
  • 📂 основной таблице регистра бухгалтерии;
  • 📂 регистре сведений, у которого режим записи — «Подчинение регистратору».

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

Рядом с регистратором в основной таблице лежат служебные поля: Период, НомерСтроки, Активность, а у регистра накопления с видом «Остатки» — ещё и ВидДвижения (приход или расход).

Базовый синтаксис: вывести регистратор из основной таблицы

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

ВЫБРАТЬ
    Движения.Регистратор,
    Движения.Период,
    Движения.Номенклатура,
    Движения.Количество
ИЗ
    РегистрНакопления.ТоварыНаСкладах КАК Движения
УПОРЯДОЧИТЬ ПО
    Движения.Период

Запрос вернёт по строке на каждое движение. В колонке Регистратор будет ссылка на документ — в консоли запросов она отобразится как его представление (например, «Реализация (акт, накладная) 00-000123 от 05.03.2025»).

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

УПОРЯДОЧИТЬ ПО
    Движения.Период,
    Движения.Регистратор,
    Движения.НомерСтроки

Поле Активность показывает, учитывается ли движение в итогах. Непроведённый или помеченный на удаление документ может оставить неактивные строки — при разборе остатков их обычно отбрасывают условием ГДЕ Движения.Активность.

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

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

ВЫБРАТЬ
    Проводки.Регистратор,
    Проводки.Период,
    Проводки.СчетДт,
    Проводки.СчетКт,
    Проводки.Сумма
ИЗ
    РегистрБухгалтерии.Хозрасчетный КАК Проводки

Регистратор в виртуальных таблицах оборотов

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

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

ВЫБРАТЬ
    ТоварыОбороты.Регистратор,
    ТоварыОбороты.Номенклатура,
    ТоварыОбороты.КоличествоПриход,
    ТоварыОбороты.КоличествоРасход
ИЗ
    РегистрНакопления.ТоварыНаСкладах.Обороты(, , Регистратор, ) КАК ТоварыОбороты

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

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

Для регистра бухгалтерии оборотов это работает так же: РегистрБухгалтерии.Хозрасчетный.Обороты(, , Регистратор, ...) выведет обороты по счетам с разбивкой по документам-регистраторам.

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

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

Как получить номер и дату документа из регистратора

Регистратор — это ссылка, а не текст. Чтобы вывести номер, дату или другой реквизит документа, обращаются к полям через точку. Но тут вмешивается составной тип.

Общие для всех документов реквизиты — Дата, Ссылка, Проведен, ПометкаУдаления — доступны напрямую:

ВЫБРАТЬ
    Движения.Регистратор,
    Движения.Регистратор.Дата КАК ДатаДокумента
ИЗ
    РегистрНакопления.ТоварыНаСкладах КАК Движения

Такое обращение платформа превращает в соединение таблицы регистра со всеми таблицами документов-регистраторов. Если регистраторов много, запрос раздувается и тормозит.

Правильный приём — оператор ВЫРАЗИТЬ. Он приводит составной тип к одному конкретному документу, и платформа соединяет только с его таблицей:

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

Здесь ВЫРАЗИТЬ(… КАК Документ.РеализацияТоваровУслуг) открывает доступ к реквизитам именно этого документа — Номер, Контрагент, табличные части. Для строк, которые записаны другим документом, ВЫРАЗИТЬ вернёт NULL, поэтому в примере стоит отбор ССЫЛКА — об этом ниже.

Номер документа нельзя получить через Регистратор.Номер без ВЫРАЗИТЬ: тип номера у разных документов различается, и для составного поля платформа общий реквизит «Номер» не отдаёт.

Если нужно только текстовое представление документа — название плюс номер и дата — не разбирайте его по реквизитам. Функция ПРЕДСТАВЛЕНИЕССЫЛКИ соберёт строку сама:

ВЫБРАТЬ
    Движения.Регистратор,
    ПРЕДСТАВЛЕНИЕССЫЛКИ(Движения.Регистратор) КАК ДокументСтрокой
ИЗ
    РегистрНакопления.ТоварыНаСкладах КАК Движения

В колонке ДокументСтрокой окажется готовое представление вида «Реализация (акт, накладная) 00-000123 от 05.03.2025» — удобно для журналов и печатных форм, где реквизиты по отдельности не нужны.

Если регистратором бывают документы нескольких видов, а реквизит нужен от каждого, их приводят к типу по очереди через ВЫБОР:

ВЫБОР
    КОГДА Движения.Регистратор ССЫЛКА Документ.РеализацияТоваровУслуг
        ТОГДА ВЫРАЗИТЬ(Движения.Регистратор КАК Документ.РеализацияТоваровУслуг).Контрагент
    КОГДА Движения.Регистратор ССЫЛКА Документ.ПоступлениеТоваровУслуг
        ТОГДА ВЫРАЗИТЬ(Движения.Регистратор КАК Документ.ПоступлениеТоваровУслуг).Контрагент
    ИНАЧЕ NULL
КОНЕЦ КАК Контрагент

Каждая ветка приводит регистратор к своему типу и берёт реквизит именно у него. Соединения добавляются только по тем документам, что перечислены в ВЫБОР, а не по всем сразу.

Соединение таблицы движений с документом-регистратором

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

ВЫБРАТЬ
    Движения.Регистратор,
    Движения.Период,
    Движения.Количество,
    Реализация.Номер КАК НомерДокумента,
    Реализация.Контрагент КАК Покупатель,
    Реализация.Организация
ИЗ
    РегистрНакопления.ТоварыНаСкладах КАК Движения
        ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг КАК Реализация
        ПО Движения.Регистратор = Реализация.Ссылка
ГДЕ
    Движения.Регистратор ССЫЛКА Документ.РеализацияТоваровУслуг

Соединение идёт по равенству Регистратор = Ссылка: регистратор и есть ссылка на документ. ЛЕВОЕ соединение оставит все строки движений; для тех, что записаны не реализацией, поля документа будут NULL — поэтому в примере стоит отбор ССЫЛКА, он отсекает чужие строки сразу.

Соединять таблицу движений сразу со всеми видами документов (несколько ЛЕВОЕ СОЕДИНЕНИЕ подряд) не стоит: запрос разрастётся и замедлится. Если в выборке действительно нужны разные типы документов, выводите общее через ПРЕДСТАВЛЕНИЕССЫЛКИ, а частные реквизиты добирайте отдельными запросами по типам.

Когда соединение не нужно вовсе:

  • 🔸 требуется только ссылка или её представление — хватит Регистратор и ПРЕДСТАВЛЕНИЕССЫЛКИ;
  • 🔸 нужны один-два реквизита одного типа документа — проще ВЫРАЗИТЬ;
  • 🔸 отбор идёт по дате движения — берите поле Период, документ подключать незачем.

Фильтрация и группировка движений по регистратору

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

Отбор по конкретному документу — через параметр запроса со ссылкой:

ВЫБРАТЬ
    Движения.Номенклатура,
    Движения.Количество
ИЗ
    РегистрНакопления.ТоварыНаСкладах КАК Движения
ГДЕ
    Движения.Регистратор = &Документ

В параметр &Документ передают ссылку на нужный документ из кода.

Отбор по типу документа — оператором ССЫЛКА. Он проверяет, какому типу принадлежит значение составного поля:

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

Такое условие оставит только движения, сделанные документами поступления.

Группировка по регистратору собирает ресурсы по каждому документу:

ВЫБРАТЬ
    Движения.Регистратор,
    СУММА(Движения.Количество) КАК ВсегоКоличество
ИЗ
    РегистрНакопления.ТоварыНаСкладах КАК Движения
СГРУППИРОВАТЬ ПО
    Движения.Регистратор

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

Оптимизация: почему составной тип тормозит запрос

Регистратор почти всегда составной, и это главная причина медленных запросов по движениям. Каждое обращение к реквизиту документа без ВЫРАЗИТЬ даёт соединение со всеми таблицами регистраторов — платформа не знает заранее, какой документ в строке.

Несколько правил, которые держат запрос быстрым:

  1. 🔹 Реквизиты документа тяните через ВЫРАЗИТЬ(Регистратор КАК Документ.ИмяДокумента), а не через Регистратор.Реквизит.
  2. 🔹 Если в запросе нужен только один вид документов — сразу ставьте отбор ГДЕ Регистратор ССЫЛКА Документ.ИмяДокумента, тогда соединение будет с одной таблицей.
  3. 🔹 Саму ссылку Регистратор выводить дёшево — соединение не нужно, пока вы не трогаете её поля. Представление документа платформа подтянет при выводе результата.
  4. 🔹 Для отчётов по оборотам используйте виртуальную Обороты с периодичностью Регистратор вместо группировки физической таблицы — она читает уже рассчитанные итоги.

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

Сравнение способов доступа к реквизитам документа:

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

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

Диагностика: выберите симптом

Частые вопросы

Есть ли регистратор в регистре сведений?
Только если у регистра режим записи «Подчинение регистратору». У независимого регистра сведений записи не привязаны к документу, поля Регистратор там нет.
Почему в виртуальной таблице Остатки нет регистратора?
Остаток — это свёрнутая величина на дату, она собрана из движений многих документов. Привязать её к одному регистратору нельзя, поэтому поля в таблице Остатки не существует.
Как в Оборотах получить разбивку по документам?
Указать периодичность Регистратор третьим параметром виртуальной таблицы: .Обороты(, , Регистратор, ). В результат добавятся колонки Регистратор и Период.
Чем отличается Период от Регистратор.Дата?
Поле Период таблицы движений хранит дату документа и не требует соединения. Регистратор.Дата даёт тот же результат, но заставляет платформу соединяться с таблицами документов — для отбора по дате берите Период.
Как отобрать движения только одного вида документа?
Оператором ССЫЛКА в условии: ГДЕ Движения.Регистратор ССЫЛКА Документ.ПоступлениеТоваровУслуг. Он оставит строки, записанные документами указанного типа.