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

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

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

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

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

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

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

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

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

Простейший запрос, выводящий движения вместе с документом-регистратором:

ВЫБРАТЬ

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

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

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

ИЗ

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

ГДЕ

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

В результате колонка «Документ» будет содержать ссылку на документ. В консоли запросов или СКД её можно развернуть, открыть карточку документа, вывести представление. Если нужен номер или дата документа — не спешите писать Товары.Регистратор.Номер: об этом подробнее ниже.

Отбор движений по конкретному документу

Частая задача — выбрать записи, созданные одним известным документом. Здесь достаточно сравнения по ссылке, параметр передаётся как объект ДокументСсылка:

ВЫБРАТЬ

Движения.Номенклатура КАК Номенклатура,

Движения.Количество КАК Количество

ИЗ

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

ГДЕ

Движения.Регистратор = &Регистратор

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

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

Отбор по виду документа-регистратора

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

ВЫБРАТЬ

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

Движения.Номенклатура КАК Номенклатура

ИЗ

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

ГДЕ

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

Альтернативный вариант с приведением типа:

ВЫБРАТЬ

ВЫРАЗИТЬ(Движения.Регистратор КАК Документ.ПоступлениеТоваровУслуг) КАК Поступление

ИЗ

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

ГДЕ

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

Оба подхода дают одинаковый результат: в выборку попадут только записи, чей регистратор — документ указанного вида. Условие ССЫЛКА читается проще, а ВЫРАЗИТЬ дополнительно «сужает» тип поля, что полезно, когда дальше нужно обратиться к реквизитам документа без лишних соединений.

Сравнение вариантов отбора по типу

Регистратор ССЫЛКА Документ.Имя

Короткая запись, удобна в условии ГДЕ. Не меняет тип поля в результате.

ВЫРАЗИТЬ(Регистратор КАК Документ.Имя)

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

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

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

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

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

Правильный приём — явное соединение с нужной таблицей документа:

ВЫБРАТЬ

Поступление.Номер КАК Номер,

Поступление.Дата КАК Дата,

Поступление.Контрагент КАК Контрагент,

Движения.Номенклатура КАК Номенклатура,

Движения.Количество КАК Количество

ИЗ

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

ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ПоступлениеТоваровУслуг КАК Поступление

ПО Движения.Регистратор = Поступление.Ссылка

ГДЕ

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

Внутреннее соединение здесь одновременно решает две задачи: отбирает движения только по поступлениям и подтягивает реквизиты документа. Если нужны движения по нескольким видам документов, используйте левые соединения с каждой таблицей и функцию ЕСТЬNULL для выбора непустого реквизита, либо выводите общие поля (Номер, Дата), которые есть у любого документа.

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

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

ВЫБРАТЬ

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

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

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

ИЗ

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

&Начало, &Конец, Регистратор, ) КАК Обороты

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

Для партионного учёта (регистры с видом «Остатки», где измерение — партия-документ) документ часто хранится в обычном измерении, например Партия. Тогда регистратор выбирать не нужно — достаточно вывести измерение из таблицы остатков, и запрос будет проще и быстрее.

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

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

Вторая ошибка — сравнение регистратора со строкой или представлением документа. Условие Регистратор = "Поступление 0001" никогда не выполнится: сравнивать нужно по ссылке. Если документ ищется по номеру, сначала найдите ссылку отдельным запросом к таблице документа, а затем передавайте её параметром.

Третья ошибка — попытка выбрать регистратора из виртуальной таблицы Остатки. Запрос не скомпилируется: поля там нет. Используйте Обороты с периодичностью «Регистратор» или физическую таблицу регистра.

Типичные ошибки
01
Обращение Регистратор.Реквизит через точку — неявные соединения со всеми типами документов и падение производительности
02
Сравнение регистратора со строкой вместо ссылки — условие никогда не срабатывает
03
Выбор регистратора из таблицы Остатки — ошибка построения запроса, поля там нет
04
Игнорирование NULL при составном типе — в отчёте появляются строки с пустыми реквизитами документа
05
Отсутствие отбора по периоду — полное сканирование таблицы движений

Проверка результата и оптимизация запроса

Проверить корректность выборки проще всего в консоли запросов: выполните запрос с параметрами на тестовом периоде, убедитесь, что колонка с регистратором содержит ссылки ожидаемого вида и что количество строк совпадает с данными отчёта по регистру. Для контроля полезно сгруппировать результат по типу документа:

ВЫБРАТЬ

ТИПЗНАЧЕНИЯ(Движения.Регистратор) КАК ТипДокумента,

КОЛИЧЕСТВО(*) КАК Строк

ИЗ

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

СГРУППИРОВАТЬ ПО

ТИПЗНАЧЕНИЯ(Движения.Регистратор)

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

По производительности работают три правила: всегда ограничивайте период, отбирайте по регистратору через равенство или В (используется индекс), а реквизиты документа получайте явным соединением. Если запрос используется в СКД, параметры периода лучше передавать в виртуальную таблицу, а не в общее условие — тогда отбор применяется до соединений.

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

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

Тип ссылок в колонке регистратора
Норма

Ссылки соответствуют ожидаемым видам документов

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

Появились неожиданные типы или пустые значения

Количество строк
Норма

Совпадает с данными штатного отчёта по регистру за тот же период

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

Строк больше или меньше — проверяйте соединения и условия

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

Номер, дата и контрагент заполнены для нужных типов

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

Массовые NULL — реквизит отсутствует у части видов документов

Время выполнения
Норма

Запрос с отбором по периоду и регистратору выполняется быстро

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

Заметная задержка — проверьте обращения через точку и отсутствие отбора по периоду

Итог

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

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

Частые вопросы о выборе регистратора в запросе 1С

Можно ли выбрать регистратор из таблицы остатков?

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

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

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

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

Поле регистратора составного типа, и платформа соединяет движения со всеми видами документов-регистраторов. Для строк, чей документ относится к другому виду, реквизит возвращается как NULL. Обработайте результат через ЕСТЬNULL или получайте реквизиты явным соединением с нужной таблицей документа.

Как вывести представление регистратора в отчёте СКД?

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

Чем отличается Регистратор от поля Документ в регистре бухгалтерии?

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

Быстрее ли отбор по регистратору, чем по периоду?

Отбор по равенству регистратора использует индекс и обычно очень быстр, но он не заменяет отбор по периоду: это разные условия. Оптимальный запрос ограничивает и период, и регистратора (или вид регистратора), чтобы СУБД читала минимальный объём данных.