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

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

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

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

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

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

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

Что такое регистратор и почему его тип нужно указывать явно

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

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

Отбор движений по виду документа через ССЫЛКА

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

ВЫБРАТЬ

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

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

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

ИЗ

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

ГДЕ

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

Этот запрос вернёт только записи, регистратором которых является «ПриходнаяНакладная». Оператор ССЫЛКА проверяет тип ссылки, а не значение, поэтому конкретный документ указывать не нужно — достаточно имени вида из метаданных.

Если нужно несколько видов документов, условия объединяются через ИЛИ, а для исключения вида используется отрицание НЕ:

ГДЕ

(Движения.Регистратор ССЫЛКА Документ.ПриходнаяНакладная

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

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

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

Получение и сравнение типа через ТИПЗНАЧЕНИЯ

Функция ТИПЗНАЧЕНИЯ возвращает тип значения поля. Её применяют в двух случаях: для сравнения типа в условии и для вывода типа как отдельного поля — например, чтобы потом сгруппировать или отсортировать движения по видам регистраторов.

ВЫБРАТЬ

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

КОЛИЧЕСТВО(Движения.Номенклатура) КАК СтрокДвижений

ИЗ

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

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

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

Сравнение типа в условии выглядит так:

ГДЕ

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

Функционально это равнозначно оператору ССЫЛКА, но ССЫЛКА читается проще и, как правило, предпочтительнее в условиях отбора. ТИПЗНАЧЕНИЯ незаменима, когда тип нужен как значение — в списке выборки, в группировке или в параметре отчёта.

ССЫЛКА или ТИПЗНАЧЕНИЯ

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

Оптимально для отбора в ГДЕ: короткая запись, понятный план запроса. Не возвращает тип как значение.

ТИПЗНАЧЕНИЯ(Регистратор) = ТИП(Документ.Х)

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

Обращение к реквизитам регистратора через ВЫРАЗИТЬ

Когда из регистратора нужно достать реквизит, которого нет у всех видов документов-регистраторов, поле приводят к конкретному типу оператором ВЫРАЗИТЬ:

ВЫБРАТЬ

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

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

ИЗ

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

ГДЕ

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

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

Альтернатива ВЫРАЗИТЬ — соединение с таблицей документа:

ВЫБРАТЬ

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

Приходная.Контрагент

ИЗ

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

ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ПриходнаяНакладная КАК Приходная

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

ВНУТРЕННЕЕ СОЕДИНЕНИЕ само по себе отсекает движения других регистраторов, поэтому дополнительное условие ССЫЛКА здесь не обязательно. Такой вариант удобен, когда из документа нужно несколько реквизитов.

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

В схеме компоновки данных те же конструкции пишутся в тексте запроса набора данных. Дополнительно СКД позволяет вынести вид регистратора в параметр, чтобы пользователь выбирал его в отчёте без изменения запроса:

ГДЕ

ВЫБОР

КОГДА &ТипРегистратора = НЕОПРЕДЕЛЕНО

ТОГДА ИСТИНА

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

КОНЕЦ

Параметр объявляется с типом «Тип», и пользователь выбирает вид документа из списка. Это удобнее, чем передавать конкретные ссылки, когда нужен именно фильтр по виду.

В динамических списках произвольного запроса отбор по типу регистратора задаётся так же через ССЫЛКА в тексте запроса. Учтите: для динамического списка с основной таблицей регистра изменение запроса может отключить стандартные команды открытия и перепроведения — проверяйте поведение формы после правки.

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

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

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

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

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

Состав колонки Регистратор
Норма

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

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

Присутствуют другие виды документов — условие ССЫЛКА не сработало или потеряно при объединении

Суммы по регистру
Норма

Совпадают с контрольным отчётом за период

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

Суммы меньше — часть регистраторов отсечена лишним условием

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

Заполнены для всех строк

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

NULL в реквизитах — тип не приведён через ВЫРАЗИТЬ или регистратор другого вида

Типичные ошибки
01
Сравнение Регистратор = Документ.ИмяДокумента — синтаксическая ошибка: ссылку нельзя сравнить с объектом метаданных, используйте ССЫЛКА или ТИПЗНАЧЕНИЯ
02
Обращение к реквизиту регистратора без ВЫРАЗИТЬ — ошибка «Поле не найдено» на составном типе
03
Указание документа, который не является регистратором регистра, — запрос выполняется, но возвращает пустой результат без сообщения об ошибке
04
Отбор по типу внутри параметров виртуальной таблицы — такой параметр не поддерживается, фильтруйте в секции ГДЕ основного запроса

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

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

Перечислите условия через ИЛИ: Регистратор ССЫЛКА Документ.ПриходнаяНакладная ИЛИ Регистратор ССЫЛКА Документ.ВозвратТоваровОтПокупателя. Альтернатива — соединение с таблицей значений, переданной как параметр, если список видов формируется динамически из кода.

Чем отличается ССЫЛКА от ТИПЗНАЧЕНИЯ в условии отбора?

По результату оба варианта эквивалентны: оба проверяют тип ссылки. ССЫЛКА — специализированный оператор для условий, запись короче и читабельнее. ТИПЗНАЧЕНИЯ — функция, возвращающая тип как значение; она нужна там, где тип участвует в выборке, группировке или передаётся параметром.

Как вывести в отчёт название вида регистратора текстом?

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

Почему запрос с ВЫРАЗИТЬ возвращает NULL в реквизитах документа?

NULL появляется для строк, чей регистратор имеет другой тип: приведение не срабатывает, и поле считается неопределённым. Добавьте в условие ГДЕ отбор Регистратор ССЫЛКА на тот же вид документа, что и в ВЫРАЗИТЬ, — тогда NULL останутся только там, где реквизит действительно не заполнен.

Можно ли задать тип регистратора в параметрах виртуальной таблицы Обороты?

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

Итог

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

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