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