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

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

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

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

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

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

Базовый синтаксис в управляемом приложении

В управляемых формах (тонкий клиент, веб-клиент, такси-интерфейс) применяется глобальный метод ОткрытьФорму(). Первый параметр — строка с полным именем формы, второй — структура параметров. Минимальный вызов выглядит так:

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

Такой вызов откроет форму списка без отборов — пользователь увидит все записи регистра. Если у регистра создана собственная (основная) форма списка в конфигураторе, будет использована она; если нет — платформа сгенерирует форму автоматически. Задать конкретную форму можно полным путём: РегистрСведений.ЦеныНоменклатуры.Форма.МояФормаСписка.

Метод ОткрытьФорму() принимает также необязательные параметры: владельца формы, уникальность, окно, навигационную ссылку, описание оповещения о закрытии и режим открытия окна. На практике чаще всего указывают владельца — тогда форма списка закроется вместе с формой-родителем и не «потеряется» за другими окнами.

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

Открытие формы с отбором по измерению

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

&НаКлиенте

Процедура ПоказатьЦены(Команда)

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

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

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

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

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

ПараметрыФормы, ЭтотОбъект);

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

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

Отбор по нескольким условиям и по периоду

Для периодических регистров сведений отбор по измерениям работает так же, но дополнительно можно передать параметр Отображение или управлять режимом «Срез последних» через настройки списка. Стандартный параметр Отбор принимает несколько условий — они объединяются по «И»:

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

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

Отбор.Вставить("Сотрудник", ТекущийСотрудник);

Открытие с блокировкой окна владельца и обработкой закрытия

Когда форма списка используется как диалог выбора записи, удобно открыть её модально и получить результат. В управляемом приложении модальность реализуется через режим открытия окна и описание оповещения:

&НаКлиенте

Процедура ВыбратьЗапись(Команда)

Оповещение = Новый ОписаниеОповещения("ПослеВыбораЗаписи", ЭтотОбъект);

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

ЭтотОбъект, , , , Оповещение,

РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);

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

&НаКлиенте

Процедура ПослеВыбораЗаписи(Результат, ДопПараметры) Экспорт

Если Результат <> Неопределено Тогда

// обработка выбранного ключа записи

КонецЕсли;

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

Чтобы форма списка возвращала выбранную запись, в её свойствах должен быть установлен режим выбора — либо передаётся параметр РежимВыбора = Истина в структуре параметров. Без этого при нажатии на запись форма просто откроет её на редактирование, а не вернёт результат вызывающей стороне.

Порядок действий для выбора записи
  1. 1
    Передайте в параметрах формы РежимВыбора = Истина
  2. 2
    При необходимости добавьте Отбор по измерениям
  3. 3
    Укажите владельца и РежимОткрытияОкнаФормы.БлокироватьОкноВладельца
  4. 4
    Передайте ОписаниеОповещения для обработки результата
  5. 5
    В обработчике проверьте, что результат не Неопределено

Обычные формы: ПолучитьФормуСписка

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

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

ФормаСписка.Отбор.Номенклатура.Установить(ТекущаяНоменклатура);

ФормаСписка.Открыть();

Здесь отбор настраивается через свойство Отбор формы — оно содержит элементы по всем полям регистра. Метод Установить() одновременно задаёт значение и включает использование элемента отбора. Для модального открытия с возвратом значения используется ОткрытьМодально(), который возвращает выбранное значение после закрытия формы.

Сравнение подходов

ОткрытьФорму (управляемые формы)

Работает в тонком и веб-клиенте, отбор передаётся структурой; ограничение — нельзя напрямую обратиться к элементам формы до её создания

ПолучитьФормуСписка (обычные формы)

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

ОткрытьЗначение ключа записи

Подходит, когда нужно открыть не список, а конкретную запись регистра по известному ключу

Типичные ошибки и их признаки

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

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

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

Как проверить, что всё работает правильно

После внедрения вызова проверьте три вещи: форма открывается без исключений, список содержит только ожидаемые записи, а при закрытии формы-владельца форма списка тоже закрывается (если указан владелец). Для отладки удобно временно открывать форму без отбора и сравнивать состав записей.

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

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

Состав записей в открывшемся списке
Норма

Видны только записи, соответствующие переданному отбору

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

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

Поведение при закрытии владельца
Норма

Форма списка закрывается вместе с формой-родителем

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

Форма остаётся открытой — владелец не передан

Повторное нажатие команды
Норма

Активируется уже открытая форма или открывается новая по замыслу

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

Плодятся одинаковые окна — задайте ключ уникальности

Итог

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

В управляемом приложении используйте ОткрытьФорму с полным именем формы и структурой параметров, отбор передавайте ключом «Отбор». В обычных формах — ПолучитьФормуСписка с настройкой отбора до вызова Открыть(). Для выбора записи добавьте РежимВыбора и обработайте результат через ОписаниеОповещения.

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

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

Точно так же — метод ОткрытьФорму доступен на клиенте в модуле команды. Объявите обработчик с директивой &НаКлиенте и выполните вызов. Если команде нужен контекст объекта (например, ссылка на номенклатуру), используйте параметризуемую команду с типом параметра.

Можно ли открыть форму списка в режиме «только просмотр»?

Да. Передайте в структуре параметров ключ ТолькоПросмотр со значением Истина — форма откроется без возможности редактирования записей. Это полезно для справочного показа данных регистра пользователям без прав изменения.

Как открыть не список, а конкретную запись регистра сведений?

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

Почему отбор по реквизиту регистра не срабатывает?

В динамическом списке отбор через параметры формы надёжно работает по измерениям и полям, включённым в основную таблицу списка. Если поле недоступно для отбора, настройте отбор программно в обработчике ПриСозданииНаСервере формы списка через ЭлементыОтбора динамического списка.

Как запретить открытие нескольких одинаковых окон списка?

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

Работает ли ОткрытьФорму в веб-клиенте?

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