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

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

Как прочитать запись регистра сведений в 1С

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

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

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

Как определить структуру регистра перед чтением

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

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

Чтение одной записи через менеджер записи

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

МенеджерЗаписи = РегистрыСведений.КурсыВалют.СоздатьМенеджерЗаписи();

МенеджерЗаписи.Валюта = ВалютаUSD;

МенеджерЗаписи.Период = ТекущаяДатаСеанса();

МенеджерЗаписи.Прочитать();

Если МенеджерЗаписи.Выбран() Тогда

Курс = МенеджерЗаписи.Курс;

Иначе

// записи с таким ключом нет

КонецЕсли;

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

Чтение нескольких записей набором записей с отбором

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

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

НаборЗаписей.Отбор.Номенклатура.Установить(Товар);

НаборЗаписей.Прочитать();

Для Каждого Запись Из НаборЗаписей Цикл

Сообщить(Запись.Штрихкод);

КонецЦикла;

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

Чтение запросом к таблице регистра

Запрос — универсальный и самый производительный способ чтения, особенно для выборок с условиями, соединениями с другими таблицами и группировками. Физическая таблица регистра сведений доступна в запросе по имени РегистрСведений.ИмяРегистра.

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| Штрихкоды.Штрихкод КАК Штрихкод,

| Штрихкоды.Номенклатура КАК Номенклатура

|ИЗ

| РегистрСведений.ШтрихкодыНоменклатуры КАК Штрихкоды

|ГДЕ

| Штрихкоды.Номенклатура = &Номенклатура";

Запрос.УстановитьПараметр("Номенклатура", Товар);

Выборка = Запрос.Выполнить().Выбрать();

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

// обработка строки

КонецЦикла;

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

Сравнение способов чтения

Менеджер записи

Одна запись по всем измерениям. Позволяет изменять и удалять. Не работает с регистрами, подчинёнными регистратору.

Набор записей с отбором

Несколько записей по отбору на равенство. Поддерживает изменение и запись. Отбор только на равенство.

Запрос к таблице

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

СрезПоследних / СрезПервых

Актуальные значения периодического регистра на дату. Только для периодических независимых регистров.

Чтение периодического регистра через срез последних

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

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

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

| Курсы.Курс КАК Курс

|ИЗ

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

Запрос.УстановитьПараметр("Период", ДатаДокумента);

Запрос.УстановитьПараметр("Валюта", ВалютаUSD);

Важные правила производительности: период и условия отбора передавайте в параметрах виртуальной таблицы (в скобках после имени), а не в секции ГДЕ — тогда платформа ограничит выборку на этапе построения среза. Если дату не указывать, срез строится на максимальную дату, что тоже допустимо, но фильтр по измерениям всё равно лучше задавать в параметрах виртуальной таблицы.

Чтение регистра, подчинённого регистратору

Если регистр подчинён регистратору, записи создаются только движениями документов, и ключом строки фактически является регистратор плюс номер строки. Менеджер записи здесь неприменим. Чтобы прочитать движения конкретного документа, используйте набор записей с отбором по регистратору или свойство Движения объекта документа.

// Вариант 1: набор записей

НаборЗаписей = РегистрыСведений.ЗначенияСвойствОбъектов.СоздатьНаборЗаписей();

НаборЗаписей.Отбор.Регистратор.Установить(СсылкаНаДокумент);

НаборЗаписей.Прочитать();

// Вариант 2: через движения документа

ДокументОбъект = СсылкаНаДокумент.ПолучитьОбъект();

Движения = ДокументОбъект.Движения.ЗначенияСвойствОбъектов;

Движения.Прочитать();

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

Порядок выбора метода чтения
  1. 1
    Определите режим записи регистра: независимый или подчинён регистратору
  2. 2
    Для одной записи независимого регистра используйте менеджер записи
  3. 3
    Для группы записей по отбору на равенство — набор записей
  4. 4
    Для сложных условий и соединений — запрос к таблице
  5. 5
    Для актуальных значений периодического регистра — СрезПоследних
  6. 6
    Проверьте результат: Выбран() для менеджера, Количество() для набора, ЕстьДанные через выборку запроса

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

Главная ошибка — отсутствие проверки, что данные действительно прочитаны. У менеджера записи вызывайте Выбран(), у набора — проверяйте Количество(), у запроса — используйте Выборка.Следующий() или Результат.Пустой. Обращение к ресурсу непрочитанной записи вернёт значение по умолчанию (ноль, пустую ссылку), что легко принять за реальные данные.

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

Типичные ошибки
01
Обращение к ресурсам без проверки Выбран() — получаете пустые значения и не замечаете ошибки
02
Менеджер записи внутри цикла — каждое чтение обращается к базе отдельно, выборка из тысячи строк работает в разы медленнее запроса
03
Прочитать() набора без отбора — в память загружается вся таблица регистра
04
Условия в секции ГДЕ вместо параметров СрезПоследних — срез строится по всей таблице до фильтрации
05
Поиск периодической записи по дате без времени — ключ не совпадает, запись не находится
Контрольные точки

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

Менеджер записи
Норма

Выбран() возвращает Истина, ресурсы заполнены

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

Выбран() = Ложь — записи с таким ключом нет или ключ заполнен неверно

Набор записей
Норма

Количество() больше нуля, строки соответствуют отбору

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

Количество() = 0 — проверьте значения отбора

Запрос
Норма

Выборка.Следующий() возвращает Истина хотя бы раз

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

Результат пуст — проверьте параметры и права доступа

Срез последних
Норма

Поле Период близко к запрошенной дате

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

Период сильно старше даты — вернулось устаревшее значение

FAQ

Можно ли прочитать запись регистра сведений без программирования?

Да. В режиме предприятия откройте регистр через меню «Все функции» → «Регистры сведений» и найдите строку отбором по колонкам. Для разового просмотра этого достаточно; программное чтение нужно для обработок, отчётов и обменов.

Почему менеджер записи не находит строку, которая видна в списке регистра?

Чаще всего не совпадает ключ: не заполнено одно из измерений, отличается время в поле «Период» или используется неверное представление ссылки. Сравните значения всех измерений из списка с теми, что присваиваете в коде, включая точность даты до секунды.

Чем СрезПоследних отличается от обычного запроса с отбором по максимальному периоду?

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

Как прочитать записи регистра сведений в СКД?

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

Влияет ли режим разделения данных на чтение регистра?

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

Можно ли изменить запись сразу после чтения?

Да, если читали менеджером записи или набором: измените ресурсы и вызовите Записать(). Результат запроса изменить нельзя — он доступен только для чтения, для модификации получите ключи записей запросом и обработайте их отдельно.

Итог

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

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