Работа с регистрами сведений в платформе 1С:Предприятие часто требует получения не только самих измерений и ресурсов, но и информации о том, какой именно документ вызвал запись. Регистратор является ключевым полем, связывающим движение регистра с конкретным объектом конфигурации, будь то документ, элемент справочника или план счетов.
Получение этого поля в запросе — стандартная, но требующая внимания задача для разработчика. Неправильное формирование условия или попытка выбрать поле из несуществующей таблицы может привести к ошибкам выполнения или некорректным данным в отчете. В этой статье мы подробно разберем синтаксис, особенности использования виртуальных таблиц и нюансы фильтрации по регистратору.
Понимание механизма работы регистратора позволяет строить сложные аналитические отчеты, отслеживать историю изменений и реализовывать механизмы контроля проведения документов. Мы рассмотрим как базовые примеры, так и продвинутые техники работы с этим полем.
Сущность поля Регистратор в регистрах 1С
В любой таблице движений регистра сведений автоматически создается системное поле Регистратор. Оно хранит ссылку на объект метаданных, который сформировал данную запись. Тип данных этого поля всегда соответствует типу ссылки на документ или другой объект, указанный в свойствах регистра.
Важно понимать, что регистратор — это не просто текстовое поле, а полноценная ссылка. Это означает, что к нему можно применять стандартные операторы сравнения, а также использовать его для соединений (JOIN) с другими таблицами документов. Значение может быть пустым, если запись была внесена программно без указания объекта-источника.
При проектировании конфигурации разработчик явно указывает, какие документы могут быть регистраторами. Если в регистр может записывать данные только один вид документов, тип поля будет конкретным. Если документов несколько — тип станет составным, что нужно учитывать при написании запросов.
⚠️ Внимание: Попытка выбрать поле
Регистраториз виртуальной таблицы среза последних или первых, где оно не предусмотрено явно в параметрах, может привести к ошибке синтаксиса. Всегда проверяйте структуру виртуальной таблицы в конфигураторе.
Если тип регистратора составной, при фильтрации в запросе используйте оператор В (IN) для перечисления всех возможных типов документов, чтобы не потерять часть данных.
Базовый синтаксис выбора регистратора
Для получения данных о регистраторе в обычном запросе к физической таблице движений достаточно просто включить это поле в список выбираемых полей. Синтаксис предельно прост и не требует специальных конструкций.
Рассмотрим пример запроса к регистру сведений ЦеныНоменклатуры. Нам необходимо получить текущую цену, период действия и документ, установивший эту цену.
ВЫБРАТЬ
ЦеныНоменклатуры.Период,
ЦеныНоменклатуры.Номенклатура,
ЦеныНоменклатуры.Цена,
ЦеныНоменклатуры.Регистратор
ИЗ
РегистрСведений.ЦеныНоменклатуры.Движения КАК ЦеныНоменклатуры
В данном примере мы обращаемся к таблице Движения, которая хранит всю историю изменений. Поле Регистратор выбирается наравне с обычными измерениями и ресурсами. Результатом выполнения будет таблица, где в колонке регистратора будут ссылки на документы, изменившие цену.
Если вам нужно отфильтровать результаты только по определенному документу, используйте условие в блоке ГДЕ. Это часто применяется для анализа истории изменений конкретного приказа или накладной.
- 📄 Используйте псевдонимы таблиц для упрощения чтения кода запроса.
- 🔍 Проверяйте тип данных поля перед сравнением, чтобы избежать неявных преобразований.
- 🚀 Индексы по полю регистратора обычно создаются автоматически, что ускоряет выборку.
Работа с виртуальными таблицами и срезами
Наиболее частая сложность возникает при работе с виртуальными таблицами, такими как СрезПоследних или СрезПервых. Эти таблицы предназначены для получения актуального состояния на момент времени и по умолчанию могут не включать поле регистратора в свой состав, если оно не запрошено явно через параметры.
Чтобы получить регистратор в срезе последних, необходимо передать специальное параметрическое выражение. Платформа 1С позволяет динамически формировать состав полей виртуальной таблицы. Для этого используется конструкция с фигурными скобками в имени таблицы.
ВЫБРАТЬ
СрезПоследних.Период,
СрезПоследних.Номенклатура,
СрезПоследних.Цена,
СрезПоследних.Регистратор
ИЗ
РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Период, {Регистратор}) КАК СрезПоследних
Обратите внимание на синтаксис {Регистратор} в имени таблицы. Это указывает системе, что в результирующий набор нужно включить поле регистратора соответствующей последней записи. Без этого указания поле будет недоступно для выбора.
В некоторых версиях платформы или при определенных настройках конфигурации может потребоваться явное перечисление полей в параметрах виртуальной таблицы. Всегда сверяйтесь со справкой по синтаксису вашего конкретного релиза 1С:Предприятие.
⚠️ Внимание: Параметры виртуальных таблиц чувствительны к регистру и наличию пробелов. Ошибка в написании
{Регистратор}приведет к тому, что запрос просто не найдет такое поле в структуре результата.
Особенности составных типов в срезах
Если регистратор имеет составной тип, убедитесь, что в срезе не происходит усечения типа данных. Виртуальная таблица должна корректно обрабатывать все возможные ссылки.
Фильтрация и группировка по регистратору
Часто требуется не просто вывести документ, а отобрать записи только от определенных документов или сгруппировать итоги по источнику данных. Операторы фильтрации работают с полем Регистратор так же, как и с любыми другими ссылочными полями.
Для фильтрации по конкретному документу используется оператор =. Если документов несколько, удобно применять оператор В (IN). Это позволяет гибко настраивать отчеты, исключая, например, документы определенных типов или авторов.
| Оператор | Описание | Пример использования |
|---|---|---|
= |
Равенство конкретной ссылке | ГДЕ Регистратор = &ДокументСсылка |
В |
Вхождение в список значений | ГДЕ Регистратор В (&СписокДокументов) |
ЕСТЬ NULL |
Проверка на отсутствие документа | ГДЕ Регистратор ЕСТЬ NULL |
ПОДОБНО |
Поиск по части номера (для строк) | ГДЕ Регистратор.Номер ПОДОБНО "%А%" |
При группировке данных в запросе поле регистратора часто становится измерением. Это позволяет увидеть, какой документ внес наибольший вклад в изменение остатков или цен. Однако стоит помнить, что группировка по уникальным ссылкам может сильно увеличить размер промежуточных наборов данных.
Если вы используете агрегатные функции, такие как СУММА или КОЛИЧЕСТВО, убедитесь, что регистратор включен в секцию СГРУППИРОВАТЬ ПО, если он есть в списке выбора. Иначе запрос завершится ошибкой.
Группировка по регистратору эффективна для анализа авторства изменений, но может замедлить запрос на больших объемах данных из-за уникальности ссылок.
Обработка составных типов регистратора
В реальных конфигурациях регистратор часто имеет составной тип, например, ДокументСсылка.ПоступлениеТоваров или ДокументСсылка.КорректировкаРегистра. Работа с такими полями требует понимания того, как платформа хранит и сравнивает разнородные ссылки.
При выборе составного поля в запросе оно возвращается как единое значение. Однако при фильтрации или соединении могут возникать нюансы. Если вы сравниваете регистратор с параметром, тип параметра должен быть совместим или приведен к общему типу.
Иногда возникает необходимость определить тип документа программно или в запросе. В языке запросов 1С нет прямой функции ТИПЗНАЧЕНИЯ внутри текста запроса, поэтому фильтрация по типу объекта часто реализуется через проверку принадлежности к конкретному справочнику документов или через временные таблицы с приведением типов.
- 🛠 Используйте временные таблицы для приведения составных типов к единому виду.
- 📊 При выводе в макет убедитесь, что поле документа имеет достаточную ширину для отображения всех типов.
- ⚡ Избегайте частых преобразований типов в циклах обработки результатов запроса.
Особое внимание стоит уделить случаю, когда регистратор может быть не только документом, но и, например, планом счетов или элементом справочника. Логика обработки таких записей должна предусматривать проверку на пустое значение или неподдерживаемый тип объекта.
⚠️ Внимание: Интерфейс и возможности работы с составными типами могут различаться в разных версиях платформы. Всегда тестируйте запросы на актуальной версии релиза, используемой в вашей базе.
☑️ Проверка запроса с составным регистратором
Оптимизация производительности запросов
Выбор поля регистратора, особенно в больших регистрах с миллионами записей, может существенно влиять на скорость выполнения запроса. Поле является индексированным, но неправильное использование условий может привести к полному сканированию таблицы.
Для ускорения работы старайтесь сужать область выборки по периоду или другим измерениям перед обращением к регистратору. Использование виртуальных таблиц срезов обычно эффективнее, чем выборка из таблицы движений с последующим отбором последних записей программно.
Если запрос выполняется медленно, проанализируйте план выполнения. Убедитесь, что условие по регистратору используется для поиска по индексу, а не для пост-фильтрации уже выбранного набора данных. В сложных случаях может потребоваться создание дополнительного индекса, хотя стандартные индексы регистра обычно покрывают основные сценарии.
// Пример оптимизированного запроса с отбором по периоду
ВЫБРАТЬ
Движения.Регистратор,
СУММА(Движения.Количество) КАК Итого
ИЗ
РегистрНакопления.Товары.Движения КАК Движения
ГДЕ
Движения.Период МЕЖДУ &НачПериода И &КонПериода
И Движения.Регистратор = &Документ
СГРУППИРОВАТЬ ПО
Движения.Регистратор
Помните, что каждый лишний Join с таблицей документов для получения дополнительных реквизитов (например, номера или даты) увеличивает нагрузку. Если возможно, получайте эти данные отдельным запросом или используйте временные таблицы.
Используйте оператор СУЩЕСТВУЕТ (EXISTS) вместо соединения, если вам нужно только проверить наличие записей от определенного регистратора, не выбирая сами записи.
Можно ли получить регистратор в регистре накопления?
Да, регистры накопления также имеют поле Регистратор в таблице движений. Механизм работы идентичен регистрам сведений, однако чаще всего в отчетах по накоплениям используют срезы остатков, где регистратор не доступен напрямую без обращения к таблице движений.
Что будет, если запись внесена через консоль запросов?
При вставке данных через консоль запросов или внешние обработки без указания объекта-источника, поле Регистратор будет иметь значение NULL (пустое). Это допустимое состояние для регистра.
Как отличить документы разных типов в одном поле?
В запросе напрямую различить типы составного поля сложно. Обычно это делают на уровне клиентского приложения, анализируя метаданные ссылки, или используют временные таблицы для разделения данных по типам документов перед выводом.
Замедляет ли выбор регистратора работу отчета?
Сам по себе выбор одного поля незначителен. Однако если из-за этого система вынуждена менять план выполнения запроса или отказываться от использования оптимального индекса, производительность может упасть. Всегда тестируйте на реальных данных.
Можно ли изменить регистратор после проведения документа?
Нет, поле Регистратор является системным и заполняется автоматически в момент записи движения. Изменить его напрямую через обновление таблицы движений нельзя, это нарушит целостность данных. Для исправления нужно перепровести документ.