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