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