Как программно получить ключ записи регистра сведений для формирования навигационной ссылки

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

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

Для начала проанализируем ситуацию: почему начинающие разработчики часто путают ключ записи со ссылкой? В 1С справочники имеют уникальный идентификатор (GUID), который неизменен. В регистрах сведений уникальность строки определяется совокупностью всех её измерений. Ключ записи — это фактически «адрес» строки, состоящий из значений этих измерений.

Важно понимать, что ключ записи — это виртуальный объект. Он не хранится в базе данных как отдельное поле. Мы можем создать его «на лету», зная измерения, или получить из существующей записи. Рассмотрим способы его получения.

Способ 1: Использование метода СоздатьКлючЗаписи()

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

Выясним, как создать ключ, зная только ссылку на номенклатуру:


// Подготовим структуру, содержащую все измерения регистра
ПараметрыКлюча = Новый Структура();
ПараметрыКлюча.Вставить("Номенклатура", Объект.Ссылка);

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

// Теперь мы можем получить навигационную ссылку на ресурс "Картинка"
СсылкаНаКартинку = ПолучитьНавигационнуюСсылку(КлючЗаписи, "Картинка");

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

Способ 2: Использование конструктора Новый через массив

Проанализируем альтернативный метод, который часто встречается в старых решениях или при динамическом вызове типов. Он основан на прямом создании объекта РегистрСведенийКлючЗаписи.

Рассмотрим пример кода:


// Создаем массив и помещаем в него структуру с измерениями
МассивИзмерений = Новый Массив;
СтруктураКлюча = Новый Структура("Номенклатура", Объект.Ссылка);
МассивИзмерений.Добавить(СтруктураКлюча);

// Создаем объект ключа записи напрямую
ИмяРегистра = "КартинкиНоменклатуры";
КлючЗаписи = Новый("РегистрСведенийКлючЗаписи." + ИмяРегистра, МассивИзмерений);

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

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

Способ 3: Получение ключа из выборки или менеджера записи

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

Посмотрим на пример:


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

Если МенеджерЗаписи.Выбран() Тогда
    // Свойство КлючЗаписи доступно автоматически
    Ключ = МенеджерЗаписи.КлючЗаписи();
    СсылкаНаКартинку = ПолучитьНавигационнуюСсылку(Ключ, "Картинка");
КонецЕсли;

Важный момент: если вы используете метод Получить() менеджера регистра, он возвращает Структуру с ресурсами, а не объект записи. Из структуры получить навигационную ссылку нельзя — это и было основной ошибкой автора темы на форуме.

Особенности для разных типов регистров

При формировании ключа записи нужно учитывать архитектуру регистра, иначе платформа выдаст ошибку или вернет пустую ссылку. Разберем нюансы:

  1. Периодические регистры: Ключ обязательно должен содержать измерение Период. Если вы укажете только основные измерения, 1С не сможет идентифицировать конкретную запись во времени.
  2. Регистры, подчиненные регистратору: В таких регистрах уникальность записи часто связана с документом. В структуру ключа необходимо включать поле Регистратор.
  3. Состав измерений: В ключе должны быть указаны все измерения. Если в регистре три измерения, а вы указали в структуре только одно, созданный ключ будет невалидным для получения ссылки на конкретный ресурс.

Почему навигационная ссылка может не работать?

Если вы создали КлючЗаписи, но ПолучитьНавигационнуюСсылку возвращает пустую строку, проанализируем возможные причины:

Во-первых, проверьте, действительно ли запись с такими измерениями существует в базе данных. Как мы выяснили ранее, методы создания ключа не обращаются к БД, они просто формируют «указатель». Если данных по этому адресу нет, ссылка не сформируется.

Во-вторых, убедитесь, что имя ресурса (например, "Картинка") передано без опечаток и этот ресурс имеет тип ХранилищеЗначения — для этой задачи есть инструмент редактирования записей регистров. Навигационные ссылки чаще всего используются именно для двоичных данных.

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

Рекомендации по хранению медиа-данных

Как отметили участники обсуждения, использование регистра сведений для хранения картинок имеет свои минусы. Если значение измерения (например, ссылка на номенклатуру) изменится, ключ записи станет другим, и все старые навигационные ссылки перестанут работать. Если вам нужна стабильная ссылка, рассмотрите вариант хранения файлов в справочниках (например, через стандартную подсистему «Работа с файлами» из БСП).

Однако, если ваша задача жестко привязана к регистру, использование СоздатьКлючЗаписи() является стандартным и надежным способом решения проблемы.

← На главную