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