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

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

Как получить параметры формы в 1С

Как получить параметры формы в 1С: обращение через Параметры в модуле формы, передача при открытии через ОткрытьФорму, ключ уникальности, типовые ошибки и примеры кода.

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

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

Ниже разобраны рабочие способы получения параметров в управляемых и обычных формах, передача значений при открытии, особенности стандартных параметров и типичные ошибки, из-за которых параметры «теряются».

Где форма хранит переданные параметры

В управляемой форме все переданные значения попадают в объект Параметры, доступный в модуле формы. Это объект типа «ДанныеФормыПараметры» — по сути, коллекция пар «имя — значение». Обратиться к конкретному параметру можно по имени: Параметры.Ключ, Параметры.РежимВыбора или Параметры.ИмяПользовательскогоПараметра.

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

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

Чтение параметров в модуле управляемой формы

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

&НаСервере

Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

Если Параметры.Свойство("Организация") Тогда

ОрганизацияОтбор = Параметры.Организация;

КонецЕсли;

Если Параметры.Свойство("ПоказыватьАрхив")

И Параметры.ПоказыватьАрхив = Истина Тогда

Элементы.ГруппаАрхив.Видимость = Истина;

КонецЕсли;

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

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

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

Как передать параметры при открытии формы

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

&НаКлиенте

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

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

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

Новый Структура("Организация", ТекущаяОрганизация));

ПараметрыФормы.Вставить("ПоказыватьАрхив", Ложь);

ОткрытьФорму("Документ.РеализацияТоваровУслуг.ФормаСписка",

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

Новый УникальныйИдентификатор);

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

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

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

Порядок действий
  1. 1
    Сформируйте структуру с параметрами в вызывающем коде
  2. 2
    Передайте структуру вторым аргументом в ОткрытьФорму()
  3. 3
    В модуле формы создайте обработчик ПриСозданииНаСервере
  4. 4
    Проверьте наличие параметра через Параметры.Свойство() и прочитайте значение
  5. 5
    Сохраните нужные значения в реквизиты формы для дальнейшего использования
  6. 6
    Проверьте открытие формы с параметрами и без них

Стандартные и пользовательские параметры: в чём разница

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

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

ПараметрНазначениеКто обрабатывает
КлючСсылка на редактируемый объектПлатформа
ОтборОтбор динамического спискаПлатформа (если отбор разрешён)
РежимВыбораОткрытие формы в режиме выбораПлатформа
ЗначенияЗаполненияЗначения реквизитов нового объектаПлатформа
Произвольное имяЛюбые данные для логики формыМодуль формы

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

Параметры в обычных формах и внешних обработках

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

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

Удобный приём — в начале ПриСозданииНаСервере вывести все переданные параметры в журнал регистрации или через Сообщить() на время отладки. Так сразу видно, какие имена реально дошли до формы, а какие потерялись при формировании структуры.
ПЗ
Практическое замечание

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

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

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

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

Как проверить, что параметры дошли до формы

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

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

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

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

Параметр читается в ПриСозданииНаСервере
Норма

Параметры.Свойство() возвращает Истина, значение корректно

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

Свойство() возвращает Ложь — параметр не передан или имя не совпадает

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

Создаётся новая форма с новыми параметрами

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

Активируется старая форма — совпадает ключ уникальности

Отбор в форме списка
Норма

Список отфильтрован по переданному значению

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

Отбор игнорируется — проверьте настройки списка и пользовательские настройки

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

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

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

Можно ли передать в параметрах таблицу значений или массив?

Да, структура параметров допускает значения любых сериализуемых типов, включая массивы, структуры и таблицы значений. Учитывайте, что при клиент-серверном вызове данные передаются между контекстами, поэтому объёмные таблицы стоит передавать через временное хранилище (ПоместитьВоВременноеХранилище) с передачей адреса.

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

Коллекция параметров очищается после создания формы. Читайте значения в ПриСозданииНаСервере и сохраняйте их в реквизиты формы — тогда они будут доступны и на клиенте в ПриОткрытии, и в любых последующих обработчиках.

Как открыть форму выбора и получить результат обратно?

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

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

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

Можно ли изменить параметры уже открытой формы?

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

Итог

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

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