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