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

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

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

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

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

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

Ниже разобраны все рабочие способы с примерами кода на встроенном языке 1С, ограничениями каждого подхода и типичными ошибками, которые приводят к потере данных или неработающему коду.

Почему у регистра сведений нет обычной ссылки

В платформе 1С объекты делятся на ссылочные и нессылочные. Ссылочные (справочники, документы, планы видов характеристик) существуют как самостоятельные сущности с уникальным идентификатором GUID. Регистры — сведений, накопления, бухгалтерии, расчёта — хранят строки таблицы, и каждая строка идентифицируется не GUID, а комбинацией значений ключевых полей.

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

Из этого следует главное практическое правило: хранить «ссылку на запись регистра» в реквизите другого объекта штатным образом нельзя, потому что типа «ссылка на регистр сведений» в системе типов не существует. Если такая потребность возникает, сохраняют значения измерений в отдельных реквизитах или сериализуют ключ в строку.

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

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

Отбор = Новый Структура;

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

Отбор.Вставить("ТипЦены", ТипЦеныСсылка);

Отбор.Вставить("Период", Дата("20260115"));

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

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

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

Отбор = Новый Структура;

Отбор.Вставить("Регистратор", ДокументСсылка);

Отбор.Вставить("НомерСтроки", 3);

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

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

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

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

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

МенеджерЗаписи.ТипЦены = ТипЦеныСсылка;

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

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

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

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

Иначе

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

КонецЕсли;

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

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

Навигационная ссылка на запись регистра

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

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

// Результат вида: e1cib/data/РегистрСведений.ЦеныНоменклатуры?...

Такую строку можно передать в метод ПерейтиПоНавигационнойСсылке() или показать пользователю. Навигационная ссылка — это текстовое представление, пригодное для клиентского приложения; использовать её как универсальный идентификатор для обмена между системами не стоит, формат зависит от платформы.

Выбор способа под конкретную задачу

Разные сценарии требуют разных инструментов. Сводная таблица помогает выбрать подходящий:

ЗадачаИнструментОграничение
Прочитать/изменить одну записьМенеджер записиНе работает для регистров, подчинённых регистратору
Передать идентификатор записи в процедуруКлюч записиНе сериализуется в реквизиты объектов напрямую
Открыть запись пользователюНавигационная ссылкаФормат привязан к платформе
Массовое чтение по условиюЗапрос или выборкаВозвращает поля, а не ключи — ключ строится отдельно
Изменение записей регистратораНабор записей с отборомТребует установки отбора по регистратору

Сравнение подходов

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

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

Запрос

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

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

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

Типичные ошибки и риски

Самая распространённая ошибка — попытка объявить реквизит типа «ссылка на регистр сведений» в конфигураторе. Такого типа не существует, и попытки обойти это через хранение строки с навигационной ссылкой приводят к хрупким решениям: при изменении значений измерений записи сохранённая строка становится бессмысленной.

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

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

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

Проверка результата

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

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

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

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

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

Возвращает Истина, ресурсы заполнены ожидаемыми значениями

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

Возвращает Ложь — записи с таким ключом нет или измерения заполнены неверно

Свойства ключа записи
Норма

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

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

Часть свойств пуста — в структуре пропущены ключи

Навигационная ссылка
Норма

При переходе открывается форма нужной записи

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

Открывается пустая форма или ошибка — ключ не соответствует существующей записи

Часто задаваемые вопросы

Можно ли сохранить ссылку на запись регистра сведений в реквизите справочника?

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

Чем ключ записи отличается от менеджера записи?

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

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

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

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

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

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

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

Можно ли использовать навигационную ссылку для обмена между базами?

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

Итог

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

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