Как открыть запись регистра сведений для редактирования из формы справочника?

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

При разработке конфигураций в среде 1С:Предприятие часто возникает задача открыть форму конкретной записи регистра сведений прямо из формы связанного объекта — например, элемента справочника. В обычном приложении (толстый клиент) разработчики нередко сталкиваются с тем, что вызов метода ОткрытьФорму с передачей параметров открывает пустую форму новой записи вместо считывания существующей. Разберем причины такого поведения и рассмотрим корректные способы открытия записи регистра для редактирования.

Проанализируем типовую ситуацию: в конфигурации существует независимый непериодический регистр сведений ИнформационныеСистемы с единственным измерением ОбъектОИС (ссылка на элемент справочника). На форме элемента справочника по нажатию кнопки требуется открыть существующую запись данного регистра для изменения ресурсов.

Почему стандартный метод ОткрытьФорму открывает пустую запись?

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

Для корректного позиционирования на существующей записи необходимо либо использовать объект РегистрСведенийМенеджерЗаписи, либо получать ключ записи с передачей всех ключевых измерений регистра.

Способ 1. Использование объекта РегистрСведенийМенеджерЗаписи (Рекомендуемый)

Рассмотрим основной и самый надежный способ работы с отдельными записями регистра сведений в обычных формах. Объект РегистрСведенийМенеджерЗаписи позволяет явно задать измерения, прочитать данные из базы и открыть привязанную форму.

Разберем по шагам алгоритм реализации:

  1. Создаем экземпляр менеджера записи с помощью метода СоздатьМенеджерЗаписи().
  2. Заполняем все измерения регистра сведений (для периодических регистров также обязательно задается Период).
  3. Вызываем метод Прочитать() для загрузки текущих данных из базы.
  4. Проверяем существование записи с помощью метода Выбран().
  5. Получаем форму методом ПолучитьФорму() и открываем её через Форма.Открыть().

Посмотрим на пример программного кода обработчика нажатия кнопки на форме элемента:


Процедура КнопкаХарактеристикиОбъектаНажатие(Элемент)

    МЗ = РегистрыСведений.ИнформационныеСистемы.СоздатьМенеджерЗаписи();
    МЗ.ОбъектОИС = Ссылка;
    МЗ.Прочитать();

    Если МЗ.Выбран() Тогда
        // Запись существует в базе данных, открываем ее для редактирования
        ФормаЗаписи = МЗ.ПолучитьФорму();
        ФормаЗаписи.Открыть();
    Иначе
        // Записи еще нет: открываем форму для создания новой записи с заполненным измерением
        ФормаЗаписи = МЗ.ПолучитьФорму();
        ФормаЗаписи.Открыть();
    КонецЕсли;

КонецПроцедуры

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

Способ 2. Открытие записи через системную функцию ОткрытьЗначение

Если требуется открыть уже гарантированно существующую запись через ключ, можно сформировать объект РегистрСведенийКлючЗаписи и передать его в системную функцию ОткрытьЗначение.

Рассмотрим пример формирования ключа записи:


Процедура КнопкаХарактеристикиОбъектаНажатие(Элемент)

    СтруктураОтбора = Новый Структура("ОбъектОИС", Ссылка);
    КлючЗаписи = РегистрыСведений.ИнформационныеСистемы.СоздатьКлючЗаписи(СтруктураОтбора);
    
    // Системная функция выполняет поиск и открывает основную форму записи
    ОткрытьЗначение(КлючЗаписи);

КонецПроцедуры

При использовании этого способа следует учитывать, что если запись с переданным набором измерений отсутствует в таблице базы данных, платформа вызовет исключение об отсутствии объекта.

Способ 3. Открытие записи в управляемых формах (для сравнения)

Если в дальнейшем проект будет переводиться на управляемые формы (или вы работаете в режиме тонкого клиента), синтаксис открытия формы записи будет отличаться. В управляемом приложении ключ записи передается в структуру параметров формы.

Посмотрим на пример кода для управляемой формы:


&НаКлиенте
Процедура КнопкаХарактеристикиОбъекта(Команда)

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

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

КонецПроцедуры

Ключевые правила и ограничения

При работе с формами записей регистров сведений необходимо строго соблюдать несколько правил:

  1. Полнота измерений: для однозначной идентификации строки в структуре отбора или в свойствах менеджера записи должны быть указаны значения абсолютно всех измерений регистра. Если указана только часть измерений, платформа не сможет однозначно сопоставить строку.
  2. Периодичность: для периодических регистров сведений в состав ключа обязательно входит поле Период с точным значением даты и времени среза.
  3. Подчинение регистратору: если регистр сведений подчинен регистратору, отдельная запись не может существовать сама по себе вне набора записей конкретного документа. В таких регистрах ключевым полем выступает документ-регистратор.
← На главную