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