Как открыть форму записи регистра сведений, если у нее нет УИД?

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

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

Почему у записи регистра сведений нет УИД?

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

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

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

Рассмотрим основной способ открытия формы, который заложен в платформу. Для этого используется объект РегистрСведенийКлючЗаписи.ИмяВашегоРегистра. Ключ записи — это структура, содержащая значения всех измерений, которые однозначно определяют строку.

Разберем по шагам, как это реализовать в коде:

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

Посмотрим на пример кода для непериодического регистра «ЦеныТоваров», где измерениями являются Номенклатура и Склад:


// 1. Формируем структуру с измерениями
ПараметрыОтбора = Новый Структура;
ПараметрыОтбора.Вставить("Номенклатура", СсылкаНаТовар);
ПараметрыОтбора.Вставить("Склад", СсылкаНаСклад);

// 2. Создаем Ключ записи
// Имя типа строится как: "РегистрСведенийКлючЗаписи." + ИмяРегистра
КлючЗаписи = РегистрыСведений.ЦеныТоваров.СоздатьКлючЗаписи(ПараметрыОтбора);

// 3. Формируем параметры для открытия формы
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("Ключ", КлючЗаписи);

// 4. Открываем форму
ОткрытьФорму("РегистрСведений.ЦеныТоваров.ФормаЗаписи", ПараметрыФормы);

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

Способ 2: Получение ключа через запрос (если известны не все данные)

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

Проанализируем алгоритм действий:

  1. Выполняем запрос к регистру сведений с отбором по известным нам данным.
  2. В результате запроса обязательно выбираем все поля, являющиеся измерениями.
  3. Из результата запроса формируем структуру и далее — ключ записи.

Пример реализации такой логики:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |   ЦеныТоваров.Номенклатура,
    |   ЦеныТоваров.Склад,
    |   ЦеныТоваров.Период
    |ИЗ
    |   РегистрСведений.ЦеныТоваров КАК ЦеныТоваров
    |ГДЕ
    |   ЦеныТоваров.СпецИдентификатор = &СпецИдентификатор";

Запрос.УстановитьПараметр("СпецИдентификатор", НужныйНамИдентификатор);
Выборка = Запрос.Выполнить().Выбрать();

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

Способ 3: Добавление искусственного УИД (Кастомный идентификатор)

Если бизнес-логика системы требует, чтобы вы могли обращаться к записи регистра именно по GUID (например, при интеграции с внешними системами или веб-сайтом), можно прибегнуть к архитектурной хитрости.

Выясним, как это сделать правильно:

Осторожно: если вы сделаете это поле Ресурсом или Реквизитом, вы сможете найти по нему запись запросом, но напрямую передать его в ОткрытьФорму как ключ не получится.

Особенности периодических и подчиненных регистров

Рассмотрим специфические случаи, которые часто вызывают ошибки:

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

Работа с навигационными ссылками

Посмотрим на еще один инструмент — Навигационные ссылки (формат e1cib/...). Даже у записи регистра сведений есть навигационная ссылка. Вы можете получить ее методом ПолучитьНавигационнуюСсылку(КлючЗаписи). Эту строку можно сохранить и использовать позже для перехода к записи методом ПерейтиПоНавигационнойСсылке(). Однако помните: если значения измерений в записи изменятся, старая навигационная ссылка станет недействительной, так как она генерируется на основе данных самой записи.

Таким образом, хотя прямого УИД у записи регистра не существует, механизм Ключа записи полностью компенсирует эту особенность, позволяя точно и быстро открывать нужные формы программно.

← На главную