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

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

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

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

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

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

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

Непериодический регистр сведений не имеет системного поля «Период», поэтому уникальность записи определяется только комбинацией значений измерений. Если регистр имеет измерения «Организация» и «Склад», то одна запись — это одна конкретная пара этих значений. Прочитать запись, не указав все измерения, через менеджер записи нельзя.

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

Получение записи через менеджер записи

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

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

МенеджерЗаписи.Валюта = ВалютаСсылка; // заполняем все измерения

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

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

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

Иначе

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

КонецЕсли;

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

Порядок чтения одной записи
  1. 1
    Откройте регистр в конфигураторе и выпишите все измерения
  2. 2
    Создайте менеджер записи через СоздатьМенеджерЗаписи()
  3. 3
    Заполните каждое измерение значением нужного типа
  4. 4
    Вызовите Прочитать() и проверьте Выбран()
  5. 5
    Обратитесь к ресурсам записи только если Выбран() = Истина

Получение записи запросом

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

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

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

"ВЫБРАТЬ

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

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

|ИЗ

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

|ГДЕ

| КурсыВалют.Валюта = &Валюта";

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

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

Если Выборка.Следующий() Тогда

Курс = Выборка.Курс;

КонецЕсли;

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

Чтение через набор записей и выборку

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

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

НаборЗаписей.Отбор.Валюта.Установить(ВалютаСсылка);

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

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

Сообщить(Запись.Курс);

КонецЦикла;

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

Сравнение способов

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

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

Запрос

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

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

Объектная работа с несколькими записями и пакетная запись. Тяжелее по памяти.

Выбрать() менеджера

Быстрый обход записей только на чтение без загрузки набора.

Чтение подчинённого регистра и особенности режимов

Если регистр сведений подчинён регистратору, его записи создаются документами, и ключ включает реквизит «Регистратор». Получить такую запись менеджером записи можно, дополнительно указав документ-регистратор. Чаще для подчинённых регистров используют запрос с отбором по регистратору или по измерениям.

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

Типичные ошибки и их признаки

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

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

Типичные ошибки
01
Не заполнено одно из измерений — Прочитать() не находит запись без ошибки
02
Нет проверки Выбран() — пустые ресурсы принимаются за данные
03
Передача значения неверного типа в измерение — отбор молча не срабатывает
04
Попытка получить срез последних у непериодического регистра — виртуальной таблицы СрезПоследних нет
05
Запись в регистр, подчинённый регистратору, в обход документа — рассинхронизация данных

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

После чтения убедитесь, что данные получены именно из базы, а не остались значениями по умолчанию. Для менеджера записи контрольная точка — Выбран() = Истина. Для запроса — непустой результат и совпадение значений измерений в выборке с заданным отбором.

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

Контрольные точки

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

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

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

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

Выбран() = Ложь — ключ не найден

Запрос
Норма

Результат не пустой, измерения совпадают с отбором

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

Пустой результат при существующей записи — проверить типы параметров

Данные в базе
Норма

Значения в списке регистра совпадают с полученными кодом

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

Расхождения — читался другой ключ или другой регистр

Итог

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

Одну запись читайте менеджером записи с полным ключом измерений и проверкой Выбран(); выборки по условиям — запросом; пакетную объектную работу — набором записей с отбором. У непериодического регистра нет среза последних, а подчинённые регистры правьте только через документы.

FAQ

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

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

Почему Прочитать() не выдаёт ошибку, но запись пустая?

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

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

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

Что быстрее — менеджер записи или запрос?

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

Как проверить существование записи без чтения ресурсов?

Выполните запрос с выборкой только измерений и проверьте РезультатЗапроса.Пустой — это не переносит лишние поля. Альтернатива — Прочитать() менеджера записи с проверкой Выбран().

Можно ли читать регистр в фоновом задании?

Да, все описанные способы работают на сервере и в фоновых заданиях. Учитывайте только, что в фоновом задании недоступен интерактивный контекст — параметры передавайте явно.