К статье
Практический материал

Разработка и Конфигурация · 11 мин

Как программно открыть форму регистра сведений в 1С

Способы программного открытия формы списка, записи и набора записей регистра сведений в 1С: ОткрытьФорму, ОткрытьЗначение, параметры отбора и типичные ошибки.

Регистр сведений в 1С не имеет единственной «главной» формы: у него есть форма списка, форма записи, а для регистров, подчинённых регистратору, — ещё и форма набора записей. Поэтому первый шаг при программном открытии — решить, какую именно форму требуется показать пользователю, а второй — правильно передать параметры, чтобы открылась нужная запись или отфильтрованный список.

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

Ниже разобраны все практические сценарии: открытие списка с отбором, открытие конкретной записи по ключу, создание новой записи с заполненными измерениями, работа с регистрами, подчинёнными регистратору, а также проверка результата и типичные ошибки, из-за которых форма открывается пустой или не открывается вовсе.

Какие формы есть у регистра сведений

Прежде чем писать код, полезно чётко понимать состав форм объекта. Независимый регистр сведений имеет форму списка (таблица всех записей) и форму записи (карточка одной строки регистра). Регистр, подчинённый регистратору, дополнительно имеет форму набора записей — таблицу движений конкретного документа, а отдельная форма записи у него обычно не используется, потому что строки существуют только внутри набора.

Имя формы для метода ОткрытьФорму() строится по шаблону: РегистрСведений.<ИмяРегистра>.ФормаСписка или РегистрСведений.<ИмяРегистра>.ФормаЗаписи. Если в конфигураторе создана своя основная форма списка или записи, платформа подставит её автоматически; явное имя конкретной формы указывают через РегистрСведений.ИмяРегистра.Форма.ИмяФормы.

Открытие формы списка регистра

Самый простой сценарий — показать пользователю полный список записей. Достаточно одной строки кода в клиентском контексте, например в команде формы или обработчике нажатия кнопки:

ОткрытьФорму("РегистрСведений.КурсыВалют.ФормаСписка");

Чаще требуется открыть не весь список, а только записи по конкретному объекту — например, цены одной номенклатуры или ответственных одной организации. Для этого в параметры формы передаётся структура Отбор, где ключ — имя измерения, а значение — отбираемое значение:

ПараметрыФормы = Новый Структура;

Отбор = Новый Структура;

Отбор.Вставить("Номенклатура", ТекущаяНоменклатура);

ПараметрыФормы.Вставить("Отбор", Отбор);

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

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

Открытие существующей записи по ключу

Чтобы открыть карточку конкретной записи, сначала формируют ключ записи. Для независимого периодического регистра в ключ входят период и все измерения, для непериодического — только измерения:

ЗначенияКлюча = Новый Структура;

ЗначенияКлюча.Вставить("Период", ДатаКурса);

ЗначенияКлюча.Вставить("Валюта", ВалютаСсылка);

КлючЗаписи = РегистрыСведений.КурсыВалют.СоздатьКлючЗаписи(ЗначенияКлюча);

ОткрытьЗначение(КлючЗаписи);

Метод ОткрытьЗначение() удобен тем, что сам определяет, какую форму использовать для переданного объекта. Альтернатива — снова ОткрытьФорму(), но уже для формы записи с параметром Ключ:

ПараметрыФормы = Новый Структура;

ПараметрыФормы.Вставить("Ключ", КлючЗаписи);

ОткрытьФорму("РегистрСведений.КурсыВалют.ФормаЗаписи", ПараметрыФормы);

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

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

Открытие формы новой записи с заполнением

Когда пользователь должен создать запись, но часть полей уже известна из контекста (текущий контрагент, выбранная дата), используют параметр ЗначенияЗаполнения. Форма записи откроется в режиме создания, а указанные поля будут заполнены:

ЗначенияЗаполнения = Новый Структура;

ЗначенияЗаполнения.Вставить("Организация", ТекущаяОрганизация);

ЗначенияЗаполнения.Вставить("Период", ТекущаяДатаСеанса());

ПараметрыФормы = Новый Структура;

ПараметрыФормы.Вставить("ЗначенияЗаполнения", ЗначенияЗаполнения);

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

Обратите внимание на разницу между Отбор и ЗначенияЗаполнения. Отбор ограничивает список и подставляет значения в новые строки, создаваемые из этого списка; ЗначенияЗаполнения работает только при создании новой записи и никак не фильтрует данные. Для сценария «показать список цен товара и дать добавить новую» правильнее открыть форму списка с отбором — тогда добавленная из списка запись автоматически получит измерение номенклатуры.

Открытие набора записей регистра, подчинённого регистратору

Для регистров, подчинённых регистратору, отдельной записи без документа не существует, поэтому открывают набор записей с отбором по регистратору. Типичный код из формы документа или из команды интерфейса:

Отбор = Новый Структура;

Отбор.Вставить("Регистратор", ДокументСсылка);

ПараметрыФормы = Новый Структура;

ПараметрыФормы.Вставить("Отбор", Отбор);

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

Отбор по регистратору — особый случай: платформа распознаёт его и открывает форму набора записей, связанную с документом. При записи такого набора движения будут привязаны к указанному регистратору. Если регистратор ещё не записан (новый документ), открывать набор бессмысленно — сначала нужно записать документ, иначе набор окажется пустым и не сможет сохраниться корректно.

Дополнительные параметры: владелец, уникальность и режим окна

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

ОткрытьФорму("РегистрСведений.КурсыВалют.ФормаСписка",

ПараметрыФормы, ЭтаФорма, Истина);

Для модального или блокирующего открытия в современных версиях платформы используют РежимОткрытияОкнаФормы.БлокироватьОкноВладельца либо метод ОткрытьФормуМодально() (последний считается устаревшим и не работает в веб-клиенте). Если после закрытия формы нужно продолжить логику — например, обновить данные на исходной форме, — передавайте описание оповещения через Новый ОписаниеОповещения и метод ОткрытьФорму() с последним параметром-оповещением.

Типичные ошибки
01
Передача в отбор поля, которого нет среди измерений и ресурсов регистра, — форма открывается без отбора или с ошибкой
02
Формирование ключа записи без всех измерений или без периода — запись не находится, открывается пустая форма создания
03
Использование ОткрытьФормуМодально в тонком или веб-клиенте — код не выполняется
04
Открытие набора записей по незаписанному регистратору — пустой набор, который нельзя осмысленно сохранить
05
Вызов ОткрытьФорму в серверном контексте — интерактивные методы доступны только на клиенте

Проверка результата и отладка

Признак корректной работы — форма открылась, отбор отображается в панели настроек списка, а в карточке записи заполнены ожидаемые измерения и ресурсы. Если форма открылась пустой, первым делом проверьте, совпадают ли типы значений в ключе с типами измерений: строка вместо ссылки, дата без времени вместо даты с временем — частые причины «невидимых» несовпадений.

Для отладки полезно временно вывести значения ключа через Сообщить() или просмотреть их в отладчике непосредственно перед вызовом открытия. Если запись заведомо существует, но по ключу не находится, выполните запрос к регистру с теми же условиями — расхождение покажет, какое поле заполнено иначе.

Контрольные точки

Как проверить результат

Открывшаяся форма списка
Норма

В панели отображается отбор, записи соответствуют условию

Тревожный признак

Список полный, отбора нет — проверьте имена полей в структуре Отбор

Карточка записи
Норма

Измерения и ресурсы заполнены значениями существующей записи

Тревожный признак

Поля измерений заполнены, ресурсы пустые — открылась форма создания вместо существующей записи

Повторный вызов команды
Норма

Активируется уже открытое окно при заданной уникальности

Тревожный признак

Открываются дубликаты окон — уникальность не задана

Частые вопросы

Можно ли открыть форму регистра сведений на сервере?

Нет. ОткрытьФорму и ОткрытьЗначение — интерактивные методы, они доступны только в клиентском контексте (директивы &НаКлиенте). На сервере можно лишь подготовить данные: сформировать ключ записи или проверить существование записи, а затем вернуть результат на клиент и открыть форму там.

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

В структуру значений ключа дополнительно включите поле Период с точной датой записи. Для регистров с периодичностью «в пределах секунды» дата должна совпадать с точностью до секунды, иначе запись не найдётся и откроется форма создания.

Чем ОткрытьЗначение лучше ОткрытьФорму?

ОткрытьЗначение сам выбирает подходящую форму по типу объекта, поэтому код короче и не привязан к имени формы. ОткрытьФорму даёт больше контроля: параметры, владелец, уникальность, режим окна и оповещение о закрытии.

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

Структура Отбор поддерживает только равенство. Для отбора по списку значений откройте форму, получите её динамический список и программно добавьте элемент отбора с видом сравнения «В списке» в настройки компоновки данных.

Почему форма записи открывается пустой, хотя ключ сформирован?

Чаще всего запись с таким сочетанием измерений не существует, и платформа открывает форму создания. Проверьте запись запросом с теми же условиями и убедитесь, что типы значений ключа точно совпадают с типами измерений регистра.

Итог

Что важно запомнить

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