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

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

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

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

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

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

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

Что такое ключ записи регистра сведений и где его взять

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

Чаще всего ключ приходит «сам» — из параметров формы. Когда пользователь открывает строку регистра из формы списка, платформа передаёт в форму записи параметр Ключ типа РегистрСведенийКлючЗаписи. Тот же ключ можно получить программно из текущей строки табличного поля или сохранить в переменной для последующего использования.

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

ПараметрыКлюча = Новый Структура;

ПараметрыКлюча.Вставить("Номенклатура", СсылкаНоменклатура);

ПараметрыКлюча.Вставить("Склад", СсылкаСклад);

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

НавСсылка = ПолучитьНавигационнуюСсылку(КлючЗаписи);

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

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

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

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

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

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

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

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

Иначе

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

КонецЕсли;

Критически важный момент — проверка Выбран() после чтения. Если записи с указанным ключом нет, метод Прочитать() не вызывает ошибку: менеджер остаётся заполнен значениями измерений, а ресурсы содержат значения по умолчанию (нули, пустые ссылки). Без проверки вы рискуете молча принять нулевой курс или пустое значение за реальные данные.

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

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

Отбор = Новый Структура("Валюта", СсылкаВалюта);

ЗначенияКурса = РегистрыСведений.КурсыВалют.ПолучитьПоследнее(ТекущаяДатаСеанса(), Отбор);

Курс = ЗначенияКурса.Курс; // структура с ресурсами

Работа с ключом записи, полученным извне

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

// КлючЗаписи — значение типа РегистрСведенийКлючЗаписи

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

МенеджерЗаписи.Номенклатура = КлючЗаписи.Номенклатура;

МенеджерЗаписи.Склад = КлючЗаписи.Склад;

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

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

Обработчик ОбработкаПолученияФормы и параметр Ключ

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

Выборка набором записей и запросом

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

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

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

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

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

Сообщить(Строка(Запись.Период) + " — " + Запись.Цена);

КонецЦикла;

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

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

Менеджер записи + Прочитать()

Одна запись по точному ключу; позволяет изменять и удалять запись. Не подходит для массового чтения.

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

Несколько записей по условию на измерения; можно редактировать и записывать обратно. Тяжелее запроса.

Запрос

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

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

Актуальные значения ресурсов на дату для периодического регистра. Не даёт конкретную историческую запись.

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

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

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

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

МенеджерЗаписи.Выбран() после Прочитать()
Норма

Возвращает Истина — запись существует

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

Ложь — записи с таким ключом нет, ресурсы содержат пустые значения

Значения измерений прочитанной записи
Норма

Совпадают с ключом поиска

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

Отличаются — проверьте заполнение всех измерений и периода

Ресурсы записи
Норма

Осмысленные значения, соответствующие данным в форме списка

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

Нули и пустые ссылки при Выбран() = Ложь — запись не найдена

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

Ограничения и безопасная модификация

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

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

Итог

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

Точечное чтение по ключу — через СоздатьМенеджерЗаписи() с полным заполнением измерений (и периода) и обязательной проверкой Выбран() после Прочитать(). Ключ записи даёт доступ к значениям измерений напрямую. Для массового чтения и поиска по условиям используйте запрос или набор записей с отбором.

Частые вопросы

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

Выполните Прочитать() у менеджера записи и проверьте Выбран() — это стандартный способ. Если нужна только проверка факта наличия и данные не требуются, эффективнее запрос с условием на измерения и выборкой ПЕРВЫЕ 1.

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

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

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

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

Чем отличается Получить(КлючЗаписи) от СоздатьМенеджерЗаписи()?

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

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

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

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

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