Разработка и Конфигурация · 10 мин
Ключ записи регистра сведений в 1С: что это и как с ним работать
Ключ записи регистра сведений в 1С: что это такое, из чего состоит, как получить и использовать в запросах и коде. Разбор ошибок и практические примеры.
Ключ записи регистра сведений — это объект встроенного языка 1С, который однозначно идентифицирует конкретную запись в регистре сведений. Через него можно открыть запись на редактирование, получить её данные или удалить. Разработчики сталкиваются с ключом записи при работе с динамическими списками, обработкой записей регистра и построении интерфейсов.
Состав ключа зависит от структуры самого регистра: в него входят измерения регистра, а для периодических регистров — ещё и поле «Период», а для подчинённых регистратору — «Регистратор» и «НомерСтроки». Понимание этого состава критично: попытка создать ключ с неправильным набором полей приводит к ошибке выполнения.
Тип объекта во встроенном языке — РегистрСведенийКлючЗаписи. Он не содержит данных самой записи (ресурсов и реквизитов), а только значения, идентифицирующие её. Это принципиальное отличие от менеджера записи, который загружает запись целиком.
Из чего состоит ключ записи
Состав полей ключа определяется режимом регистра сведений, заданным в конфигураторе. Для непериодического независимого регистра ключ включает только значения всех измерений. Если измерение одно — ключ состоит из одного поля, если измерений три — из трёх.
Для периодического регистра к измерениям добавляется поле «Период» — дата, на которую действует запись. Для регистра, подчинённого регистратору, ключ формируется иначе: он состоит из полей «Регистратор» и «НомерСтроки», а измерения в ключ не входят, поскольку уникальность записи обеспечивается парой «документ + номер строки движения».
| Режим регистра | Состав ключа записи |
|---|---|
| Независимый непериодический | Все измерения |
| Независимый периодический | Все измерения + Период |
| Подчинённый регистратору | Регистратор + НомерСтроки |
Как программно создать ключ записи
Ключ создаётся через менеджер регистра методом СоздатьКлючЗаписи(), в который передаётся структура со значениями полей ключа. Имена полей в структуре должны точно совпадать с именами измерений в метаданных — иначе платформа выдаст ошибку о несоответствии полей.
Отбор = Новый Структура;
Отбор.Вставить("Номенклатура", СсылкаНоменклатура);
Отбор.Вставить("Период", Дата("20260115"));
КлючЗаписи = РегистрыСведений.ЦеныНоменклатуры.СоздатьКлючЗаписи(Отбор);
Проверить, существует ли запись с таким ключом, можно через менеджер записи: создать его, заполнить поля отбора теми же значениями и вызвать метод Прочитать(). Если после чтения свойство Выбран() равно Ложь — записи с таким ключом в базе нет.
Как получить ключ записи из формы и динамического списка
Типичная задача — открыть существующую запись регистра на редактирование из списка. В форме списка регистра сведений текущая строка элемента «Список» как раз и содержит ключ записи. Достаточно получить ТекущиеДанные или свойство ТекущаяСтрока табличного поля.
Чтобы открыть форму записи программно, используйте метод ОткрытьФорму() с параметром «Ключ»:
ПараметрыФормы = Новый Структура("Ключ", КлючЗаписи);
ОткрытьФорму("РегистрСведений.ЦеныНоменклатуры.ФормаЗаписи", ПараметрыФормы);
Если у регистра не создана собственная форма записи, платформа сгенерирует её автоматически — передача ключа работает одинаково в обоих случаях. Для управляемых форм этот способ является стандартным механизмом редактирования отдельной записи.
- 1Сформируйте структуру со значениями измерений (и периода для периодического регистра)
- 2Создайте ключ методом СоздатьКлючЗаписи() менеджера регистра
- 3Передайте ключ в параметр Ключ при вызове ОткрытьФорму формы записи
- 4Проверьте, что форма открылась с заполненными полями, а не как новая запись
Ключ записи в запросах и динамических списках
В языке запросов 1С нет отдельного поля «ключ записи» — запрос возвращает значения измерений, период и другие поля, из которых ключ можно собрать программно. Это частый источник путаницы у начинающих разработчиков: из результата запроса нужно взять поля отбора и передать их в СоздатьКлючЗаписи().
Динамические списки, построенные по таблице регистра сведений, работают с ключами записей автоматически. Именно поэтому для редактирования записи из такого списка не нужно писать дополнительный код — платформа сама передаёт ключ в форму записи при двойном щелчке по строке.
При программной обработке большого числа записей эффективнее работать не с ключами по одной записи, а с набором записей через отбор: установить отбор по измерениям, прочитать набор, изменить и записать. Обращение к каждой записи по отдельности через ключ заметно медленнее на больших объёмах данных.
При массовой обработке записей регистра сведений не перебирайте их по одной через ключ и менеджер записи — читайте и пишите набор записей с отбором. Это сокращает число обращений к базе и ускоряет обработку на порядки.
Ключ записи и менеджер записи: в чём разница
Эти два объекта часто путают. Ключ записи — только идентификатор: измерения и период (или регистратор и номер строки). Менеджер записи (РегистрСведенийМенеджерЗаписи) — объект, который содержит все поля записи, включая ресурсы и реквизиты, и умеет читать, записывать и удалять запись в базе.
Связь между ними прямая: ключ используется, чтобы указать, с какой записью работать, а менеджер — чтобы выполнить саму операцию. Менеджер записи создаётся методом СоздатьМенеджерЗаписи(), после чего его поля отбора заполняются значениями из ключа.
Ключ записи и менеджер записи
Только идентифицирует запись. Подходит для открытия формы записи и передачи ссылки на запись между объектами. Не содержит ресурсов и реквизитов.
Содержит все данные записи и методы Прочитать, Записать, Удалить. Используется для программного изменения одной записи. Требует обращения к базе.
Оптимален для массового чтения и записи по отбору. Работает с несколькими записями за одну транзакцию.
Типичные ошибки при работе с ключом записи
Самая частая ошибка — несовпадение состава полей структуры с составом ключа. Если регистр периодический, а в структуру не включили «Период», платформа выдаст ошибку о неверном составе полей ключа. Аналогично лишнее поле, не входящее в ключ, тоже вызовет ошибку.
Вторая группа ошибок связана с типами значений. Если измерение имеет составной тип (например, ссылка на один из нескольких справочников), а в ключ передано значение другого типа, запись не будет найдена даже при визуально «правильном» значении. Проверяйте типы значений измерений в конфигураторе.
Третья ошибка — попытка использовать ключ записи для регистра, подчинённого регистратору, по составу измерений. Для таких регистров ключ строится по регистратору и номеру строки, и передать туда измерения нельзя.
Проверка результата и отладка
Чтобы убедиться, что ключ сформирован корректно, выведите его поля в отладчике или через Сообщить(). Для проверки существования записи создайте менеджер записи, скопируйте в него значения полей ключа, вызовите Прочитать() и проверьте Выбран().
Если форма записи открывается пустой (как новая) вместо существующей записи — почти всегда причина в том, что запись с таким ключом не найдена: не совпало значение периода, тип измерения или само значение измерения. Сравните значения в ключе с фактическими данными записи через консоль запросов или список регистра.
Как проверить результат
Поля структуры в точности совпадают с измерениями и периодом регистра
Ошибка о неверном составе полей ключа при вызове СоздатьКлючЗаписи
После Прочитать() метод Выбран() возвращает Истина
Выбран() = Ложь — записи с таким ключом нет
Форма открывается с заполненными полями существующей записи
Форма открывается пустой как для новой записи
Часто задаваемые вопросы
Можно ли получить ключ записи из результата запроса напрямую?
Нет, запрос не возвращает объект ключа. Нужно выбрать в запросе поля измерений (и период, если регистр периодический), а затем собрать ключ программно через СоздатьКлючЗаписи, передав эти значения в структуре.
Чем ключ записи отличается от ссылки?
Ссылка идентифицирует объект в справочнике или документе и существует всегда, пока объект не удалён. Ключ записи — это составное значение из полей отбора регистра сведений; он не хранится как отдельная сущность и формируется из значений полей записи.
Как удалить запись, зная её ключ?
Создайте менеджер записи, заполните его поля отбора значениями из ключа, вызовите Прочитать(), убедитесь, что запись выбрана, и вызовите Удалить(). Альтернатива — набор записей с отбором по полям ключа и метод Записать() без добавления строк.
Почему СоздатьКлючЗаписи выдаёт ошибку, хотя все поля указаны?
Проверьте точность имён полей — они должны совпадать с именами измерений в метаданных с учётом регистра букв. Также убедитесь, что для периодического регистра добавлено поле Период, и что в структуре нет лишних полей, не входящих в ключ.
Работает ли ключ записи для регистров, подчинённых регистратору?
Да, но состав ключа другой: Регистратор и НомерСтроки. Измерения такого регистра в ключ не входят, поскольку уникальность записи определяется её положением в движениях документа-регистратора.
Можно ли изменить значения измерений существующей записи через ключ?
Напрямую нет — измерения входят в ключ и изменить их у существующей записи нельзя. Нужно удалить старую запись и создать новую с изменёнными значениями измерений, либо выполнить это через набор записей в одной транзакции.
Что важно запомнить
Ключ записи регистра сведений — это идентификатор записи из значений измерений (и периода) либо регистратора и номера строки. Он создаётся методом СоздатьКлючЗаписи без обращения к базе, используется для открытия формы записи и передачи ссылки на запись, а для чтения и изменения данных применяется менеджер записи или набор записей.