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

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

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

Основы архитектуры регистров сведений

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

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

Измерения регистра служат для группировки данных, аналогично ключам в справочниках. Ресурсы содержат сами числовые или текстовые значения, которые мы хотим получить.

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

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

Синтаксис запроса к виртуальным таблицам

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

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

ВЫБРАТЬ

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

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

ИЗ

РегистрСведений.КурсыВалют.СрезПоследних(

&ДатаЗапроса,

Валюта = &НужнаяВалюта

) КАК КурсыВалют

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

  • 📅 СрезПоследних — выбирает последние записи на указанную дату по каждому уникальному набору измерений.
  • 🚀 СрезПервых — выбирает самые первые записи, появившиеся в базе до указанной даты.
  • 🔄 АктуальныеСрезы — получает записи, действующие на текущий момент времени без указания конкретной даты.

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

💡

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

Выборка данных на конкретную дату и интервал

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

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

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

Тип выборки Виртуальная таблица Описание поведения
Срез последних СрезПоследних Одна запись на уникальные измерения, максимальная дата <= Период
Срез первых СрезПервых Одна запись на уникальные измерения, минимальная дата >= Период
История изменений Основная таблица Все записи, удовлетворяющие условию отбора по полю Период

Обратите внимание на работу с null-значениями в измерениях. Если в регистре есть записи, где измерение не заполнено, они могут участвовать в группировке иначе, чем ожидалось. Явная проверка на NULL в условии ГДЕ помогает избежать дублирования или потери данных.

📊 Какой способ выборки вы используете чаще всего?
Языком запросов
Объектным методом
Через СКД
Конструктором

Объектный метод выборки в коде 1С

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

Для инициализации выборки используется метод СоздатьВыборку() у объекта менеджера регистра. Вы можете установить отбор по необходимым полям и указать период.

Выборка = РегистрыСведений.ЦеныНоменклатуры.СоздатьВыборку();

Выборка.ПериодНачало = НачалоДня(ТекущаяДата());

Выборка.ПериодКонец = КонецДня(ТекущаяДата());

Выборка.Номенклатура = СсылкаНаТовар;

Пока Выборка.Следующий() Цикл

// Обработка каждой записи

Сообщить(Выборка.Цена);

КонецЦикла;

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

⚠️ Внимание: Объектная выборка загружает все поля регистра, даже те, которые вы не используете в коде. Это увеличивает трафик между клиентом и сервером. Всегда предпочитайте запросы, выбирая только необходимые колонки.

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

Работа с итогами и измерениями

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

Если в конфигураторе установлен флаг «Использовать итоги», платформа создает специальные служебные таблицы. При запросе к таким регистрам можно использовать ключевое слово ИТОГИ в тексте запроса. Это значительно ускоряет формирование сводных отчетов.

  • Агрегация — вычисление сумм, средних значений и количеств на лету.
  • 📊 Группировка — объединение данных по указанным измерениям в запросе.
  • 🔍 Фильтрация — отбор уже агрегированных данных с помощью оператора ИМЕЮЩИЕ.

Пример запроса с итогами выглядит следующим образом:

ВЫБРАТЬ

Регистр.Номенклатура,

СУММА(Регистр.Количество) КАК ОбщееКоличество

ИЗ

РегистрСведений.ОстаткиТоваров.СрезПоследних КАК Регистр

ИТОГИ ПО

Номенклатура

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

Особенности обновления итогов

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

Оптимизация производительности выборок

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

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

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

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

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

💡

Главный принцип оптимизации: всегда ограничивайте выборку минимально необходимым периодом и набором полей. Избегайте выборок «всего подряд» с последующей фильтрацией в коде.

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

В чем разница между СрезПоследних и СрезПервых?

СрезПоследних выбирает запись с максимальной датой, которая меньше или равна указанному периоду (актуальное состояние на момент). СрезПервых выбирает запись с минимальной датой, которая больше или равна периоду (первое появление после момента). Это важно для анализа истории возникновения событий.

Можно ли записывать данные через запрос?

Нет, язык запросов 1С предназначен только для чтения данных (оператор ВЫБРАТЬ). Для записи, изменения или удаления записей регистра сведений необходимо использовать объект ЗаписьРегистраСведений в коде встроенного языка или операции с документами.

Что делать, если СрезПоследних возвращает пустой результат?

Это означает, что на указанную дату в регистре еще не было записей с данными измерениями. Проверьте, не является ли дата слишком ранней для существования объекта, или убедитесь, что документы, создающие записи, были проведены корректно.

Как получить все записи за день при внутридневной периодичности?

Не используйте виртуальные таблицы срезов. Обращайтесь напрямую к основной таблице регистра: РегистрСведений.МойРегистр, устанавливая отбор Период МЕЖДУ НачалоДня(Дата) И КонецДня(Дата).

Влияет ли удаление записей на работу итогов?

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