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