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

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

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

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

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

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

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

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

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

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

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

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

&НаКлиенте

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

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

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

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

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

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

ПараметрыФормы, ЭтотОбъект, УникальныйИдентификатор);

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

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

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

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

Как открыть форму конкретной записи по ключу

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

&НаСервере

Функция ПолучитьКлючЗаписи(Номенклатура, ТипЦен)

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

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

ЗначенияКлюча.Вставить("ТипЦен", ТипЦен);

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

КонецФункции

&НаКлиенте

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

КлючЗаписи = ПолучитьКлючЗаписи(Объект.Номенклатура, Объект.ТипЦен);

ПараметрыФормы = Новый Структура("Ключ", КлючЗаписи);

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

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

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

Отбор через настройки динамического списка для сложных условий

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

&НаКлиенте

Процедура ОткрытьСОтборомПоПериоду(Команда)

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

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

ПараметрыФормы.Вставить("СформироватьПриОткрытии", Истина);

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

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

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

Способы передать отбор

Структура Отбор в параметрах формы

Простой и безопасный способ, не требует доработки конфигурации. Ограничение: только сравнение на равенство по полям списка.

Параметр Ключ с ключом записи

Открывает одну конкретную запись для просмотра или редактирования. Не подходит для показа списка.

Отбор в динамическом списке формы

Поддерживает любые виды сравнения и группы условий. Требует доработки формы, что усложняет обновление типовых решений.

Открытие формы регистра сведений в обычном приложении

В обычных формах (режим толстого клиента) логика похожа, но методы другие. Форму списка получают через РегистрыСведений.ИмяРегистра.ПолучитьФормуСписка(), после чего отбор устанавливается напрямую в свойства формы до её открытия.

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

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

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

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

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

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

Частые ошибки и как их диагностировать

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

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

Третья группа ошибок связана с контекстом: создание ключа записи возможно только на сервере, поэтому вызов СоздатьКлючЗаписи() в клиентской процедуре без директивы &НаСервере приведёт к ошибке компиляции или выполнения.

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

Проверка результата и ограничения подхода

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

Учитывайте права доступа. Если у пользователя нет права просмотра регистра сведений, программное открытие формы завершится ошибкой нарушения прав. В ролевой модели проверяйте доступность заранее через ПравоДоступа("Просмотр", Метаданные.РегистрыСведений.ИмяРегистра) и скрывайте команду, если доступа нет.

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

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

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

Содержимое открывшегося списка
Норма

Видны только записи с заданным значением измерения

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

Список полный или пустой при наличии данных в регистре

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

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

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

Накапливаются одинаковые окна

Пустое значение параметра отбора
Норма

Команда не выполняется или открывается весь список с предупреждением

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

Открывается пустой список без пояснения

Права пользователя
Норма

Форма открывается или команда скрыта заранее

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

Ошибка нарушения прав доступа при нажатии

FAQ

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

Да. Добавьте в структуру отбора несколько пар «имя поля — значение»: Новый Структура("Номенклатура, ТипЦен", Ном, Тип). Все условия объединяются по «И», то есть в списке останутся записи, удовлетворяющие всем переданным значениям одновременно.

Почему отбор срабатывает, но пользователь может его снять?

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

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

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

Чем отличается ОткрытьФорму от ОткрытьФормуМодально при отборе?

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

Можно ли передать отбор вида «в списке» через структуру параметров?

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

Работает ли этот подход в веб-клиенте и тонком клиенте?

Да, ОткрытьФорму с параметрами отбора работает во всех клиентах управляемого приложения. Ограничение касается обычных форм — они доступны только в толстом клиенте, поэтому код с ПолучитьФормуСписка в тонком или веб-клиенте выполняться не будет.

Итог

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

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