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