В разработке на платформе 1С:Предприятие часто возникает задача получить навигационную ссылку на данные, хранящиеся в регистре сведений. Чаще всего это требуется для отображения картинок или файлов, которые лежат в ресурсах регистра. Однако, в отличие от справочников или документов, у регистра сведений нет привычной ссылки (Ref). Вместо неё используется специальный объект — КлючЗаписи. Разберем подробно, как его получить и правильно использовать.
Для начала проанализируем ситуацию: почему начинающие разработчики часто путают ключ записи со ссылкой? В 1С справочники имеют уникальный идентификатор (GUID), который неизменен. В регистрах сведений уникальность строки определяется совокупностью всех её измерений. Ключ записи — это фактически «адрес» строки, состоящий из значений этих измерений.
Важно понимать, что ключ записи — это виртуальный объект. Он не хранится в базе данных как отдельное поле. Мы можем создать его «на лету», зная измерения, или получить из существующей записи. Рассмотрим способы его получения.
Это наиболее правильный и читаемый метод. Он доступен у менеджера конкретного регистра сведений. Рассмотрим ситуацию, когда у нас есть регистр КартинкиНоменклатуры, где измерением является Номенклатура, а ресурсом — Картинка.
Выясним, как создать ключ, зная только ссылку на номенклатуру:
// Подготовим структуру, содержащую все измерения регистра
ПараметрыКлюча = Новый Структура();
ПараметрыКлюча.Вставить("Номенклатура", Объект.Ссылка);
// Создаем ключ записи через менеджер регистра
КлючЗаписи = РегистрыСведений.КартинкиНоменклатуры.СоздатьКлючЗаписи(ПараметрыКлюча);
// Теперь мы можем получить навигационную ссылку на ресурс "Картинка"
СсылкаНаКартинку = ПолучитьНавигационнуюСсылку(КлючЗаписи, "Картинка");
В данном примере СоздатьКлючЗаписи принимает структуру, где имена ключей должны в точности совпадать с именами измерений в конфигураторе. Если регистр периодический, в структуру обязательно нужно добавить поле Период.
Проанализируем альтернативный метод, который часто встречается в старых решениях или при динамическом вызове типов. Он основан на прямом создании объекта РегистрСведенийКлючЗаписи.
Рассмотрим пример кода:
// Создаем массив и помещаем в него структуру с измерениями
МассивИзмерений = Новый Массив;
СтруктураКлюча = Новый Структура("Номенклатура", Объект.Ссылка);
МассивИзмерений.Добавить(СтруктураКлюча);
// Создаем объект ключа записи напрямую
ИмяРегистра = "КартинкиНоменклатуры";
КлючЗаписи = Новый("РегистрСведенийКлючЗаписи." + ИмяРегистра, МассивИзмерений);
// Получаем ссылку
СсылкаНаКартинку = ПолучитьНавигационнуюСсылку(КлючЗаписи, "Картинка");
Этот метод работает идентично первому, но позволяет динамически подставлять имя регистра в строку конструктора, что может быть удобно в универсальных обработках — для их реализации пригодится универсальный инструментарий разработчика для 1С.
Иногда нам не нужно создавать ключ вручную, так как мы уже работаем с данными регистра. Если мы используем РегистрСведенийМенеджерЗаписи для чтения данных, объект ключа уже доступен в его свойствах после метода Прочитать().
Посмотрим на пример:
МенеджерЗаписи = РегистрыСведений.КартинкиНоменклатуры.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Номенклатура = Объект.Ссылка;
МенеджерЗаписи.Прочитать();
Если МенеджерЗаписи.Выбран() Тогда
// Свойство КлючЗаписи доступно автоматически
Ключ = МенеджерЗаписи.КлючЗаписи();
СсылкаНаКартинку = ПолучитьНавигационнуюСсылку(Ключ, "Картинка");
КонецЕсли;
Важный момент: если вы используете метод Получить() менеджера регистра, он возвращает Структуру с ресурсами, а не объект записи. Из структуры получить навигационную ссылку нельзя — это и было основной ошибкой автора темы на форуме.
При формировании ключа записи нужно учитывать архитектуру регистра, иначе платформа выдаст ошибку или вернет пустую ссылку. Разберем нюансы:
Период. Если вы укажете только основные измерения, 1С не сможет идентифицировать конкретную запись во времени.Регистратор.Если вы создали КлючЗаписи, но ПолучитьНавигационнуюСсылку возвращает пустую строку, проанализируем возможные причины:
Во-первых, проверьте, действительно ли запись с такими измерениями существует в базе данных. Как мы выяснили ранее, методы создания ключа не обращаются к БД, они просто формируют «указатель». Если данных по этому адресу нет, ссылка не сформируется.
Во-вторых, убедитесь, что имя ресурса (например, "Картинка") передано без опечаток и этот ресурс имеет тип ХранилищеЗначения — для этой задачи есть инструмент редактирования записей регистров. Навигационные ссылки чаще всего используются именно для двоичных данных.
В-третьих, учитывайте контекст исполнения. Навигационная ссылка на данные регистра сведений на клиенте и на сервере может вести себя по-разному в зависимости от прав доступа пользователя. Разобраться в особенностях взаимодействия клиента и сервера при передаче двоичных данных поможет руководство по работе с файлами в управляемом интерфейсе.
Как отметили участники обсуждения, использование регистра сведений для хранения картинок имеет свои минусы. Если значение измерения (например, ссылка на номенклатуру) изменится, ключ записи станет другим, и все старые навигационные ссылки перестанут работать. Если вам нужна стабильная ссылка, рассмотрите вариант хранения файлов в справочниках (например, через стандартную подсистему «Работа с файлами» из БСП).
Однако, если ваша задача жестко привязана к регистру, использование СоздатьКлючЗаписи() является стандартным и надежным способом решения проблемы.