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