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

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

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

Природа поля Регистратор в конфигурациях 1С

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

Важно понимать, что физически в таблице базы данных (SQL) это поле хранится как ссылка на конкретную запись в таблице документов. Однако в языке запросов 1С мы работаем с логической моделью. Доступ к регистратору возможен только в том случае, если в запросе участвует таблица регистра, а не только его виртуальное представление с агрегацией.

Многие начинающие разработчики путают понятие регистратора и периода. Период указывает время действия записи, а регистратор указывает на событие, которое привело к появлению этой записи. Если в регистре сведений допускается несколько записей с одинаковыми измерениями в один момент времени (непериодический регистр), то знание регистратора становится единственным способом различить эти дубли.

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

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

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

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

ВЫБРАТЬ

КурсыВалют.Валюта,

КурсыВалют.Курс,

КурсыВалют.Регистратор

ИЗ

РегистрСведений.КурсыВалют КАК КурсыВалют

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

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

💡

Если вам нужно вывести только регистратор последней актуальной записи, используйте срез последних («СрезПоследних») с параметром «Выводить регистратор = Истина», если такая опция предусмотрена в вашей версии платформы, либо соединяйтесь с основной таблицей по максимальному периоду.

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

Виртуальные таблицы в 1С созданы для упрощения работы с историческими данными. Наиболее популярными являются СрезПервых и СрезПоследних. Однако, по умолчанию, эти виртуальные таблицы возвращают только измерения и ресурсы. Поле Регистратор в них скрыто, если не указано иное.

Чтобы получить регистратор через срез, необходимо воспользоваться параметрами виртуальной таблицы. В языке запросов параметры передаются в скобках после имени таблицы. Для среза последних существует специальный параметр, позволяющий включить основание записи в выборку. Это более производительный способ, чем ручное соединение.

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

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

ВЫБРАТЬ

СрезПоследних.Валюта,

СрезПоследних.Курс,

СрезПоследних.Регистратор

ИЗ

РегистрСведений.КурсыВалют.СрезПоследних(&, ВыводитьРегистратор = Истина) КАК СрезПоследних

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

📊 Какой способ получения регистратора вы используете чаще?
Прямой запрос к таблице регистра
Виртуальная таблица СрезПоследних
Вложенный запрос с МАКСИМУМ(Период)
Соединение через ВНЕШНЕЕ СОЕДИНЕНИЕ

Соединение таблиц для получения detailed-информации

Частой задачей является не просто вывод ссылки на документ, а получение его дополнительных реквизитов, таких как номер, дата или комментарий. Для этого необходимо выполнить соединение (JOIN) таблицы регистра с таблицей документов. Тип соединения зависит от бизнес-логики: требуется ли получить данные только для записей, у которых есть регистратор, или нужно показать все записи регистра.

Если мы используем ВНУТРЕННЕЕ СОЕДИНЕНИЕ, то из результата будут исключены все строки регистра, где поле «Регистратор» пусто. Это типичная ситуация для начальных остатков, введенных обработкой загрузки данных без создания документов. В таких случаях безопаснее использовать ЛЕВОЕ СОЕДИНЕНИЕ.

Рассмотрим пример, где мы хотим вывести номер документа-регистратора рядом с курсом валюты. Нам потребуется соединить регистр сведений с регистром документов (или общей таблицей документов, в зависимости от задачи). Прямое соединение с конкретным видом документа дает лучшую производительность, если тип регистратора известен и един.

ВЫБРАТЬ

Курсы.Валюта,

Курсы.Курс,

ДОКУМЕНТ.Номер КАК НомерДокумента,

ДОКУМЕНТ.Дата КАК ДатаДокумента

ИЗ

РегистрСведений.КурсыВалют.СрезПоследних(&, ВыводитьРегистратор = Истина) КАК Курсы

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

ПО Курсы.Регистратор = ДОКУМЕНТ.Ссылка

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

⚠️ Внимание: При соединении с таблицей документов учитывайте, что в распределенных информационных базах (РИБ) ссылки на документы могут иметь разную структуру. Убедитесь, что ваш запрос корректно работает в узлах распределенной базы, если таковая используется.

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

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

Группировка по регистратору позволяет агрегировать данные в разрезе документов-оснований. Это полезно при построении отчетов типа «Движения документов», где нужно показать суммарное влияние каждого документа на остатки. При использовании оператора ГРУППИРОВКА ПО поле Регистратор ведет себя как обычное измерение.

Однако стоит помнить о производительности. Группировка по ссылкам на документы в больших массивах данных (миллионы записей) может быть ресурсоемкой операцией. Если документов-регистраторов очень много, база данных может создать временную таблицу для обработки группировки, что увеличит время выполнения запроса.

  • 🔍 Используйте фильтрацию по регистратору для отладки: найдите все записи, созданные ошибочным документом, и проанализируйте их.
  • 📊 Группируйте по регистратору только при необходимости: если отчет строится по контрагентам, лишняя группировка по документам только замедлит его.
  • ⚡ Проверяйте план выполнения запроса: убедитесь, что фильтр по регистратору использует индекс, а не вызывает полный перебор таблицы.

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

☑️ Оптимизация запроса с регистратором

Выполнено: 0 / 4

Типичные ошибки и способы их устранения

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

Другая частая проблема возникает при попытке присвоить полю Регистратор значение вручную в операторе ВСТАВИТЬ или ОБНОВИТЬ. Поле регистратора является служебным и доступно только для чтения в контексте выборки. Попытка записать в него данные приведет к ошибке выполнения. Запись в регистр сведений должна производиться через движения документа или объект менеджера регистра.

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

⚠️ Внимание: Конфигурация и структура регистров могут меняться при обновлении типовых конфигураций. Всегда проверяйте свойства регистра после обновления платформы, чтобы убедиться, что флаг «Периодический» или состав регистраторов не изменились, что может повлиять на логику вашего запроса.

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

Секрет высокой производительности

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

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

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

Нет, поле «Регистратор» заполняется автоматически в момент проведения документа и является неизменяемым через прямые SQL-запросы или стандартные механизмы 1С. Для изменения источника данных необходимо сторнировать старый документ и провести новый.

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

Это возможно, если запись в регистр сведений была внесена не документом, а напрямую через форму списка регистра (при наличии прав на редактирование) или через внешнюю обработку, которая не указывала регистратора. Также это характерно для некоторых видов срезов, если не включен соответствующий параметр вывода.

Как получить регистратор, если используется регистр накопления?

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

Влияет ли выборка регистратора на скорость работы отчета?

Да, может влиять. Выборка дополнительного поля увеличивает объем передаваемых данных. Более существенно влияние оказывает использование регистратора в условиях соединения или группировки без надлежащей индексации. Всегда проверяйте план выполнения запроса.