1с программно открыть форму выбора реквизита

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

А делается это при помощи уже знакомого нам метода ОткрытьФорму.

Для тех, кто не знаком с вышеприведенным методом, рекомендую первым делом ознакомиться с моими статьями, где я подробно о нем рассказываю:

Открытие управляемой формы 1С в отдельном окне

Для этой статьи я в конфигураторе 1С создам обработку, на форму этой обработки помещу команду, при выполнении которой, откроется форма выбора справочника Номенклатура, и запишу выбранное значение в реквизит формы обработки.

Управляемая форма обработки

Здесь и далее приведена конфигурация из книги «Основы разработки в 1С: Такси».

Программирование в 1С: Такси

Замечу, что в моей конфигурации нет формы выбора

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

 Выбор формы выбора

Для того, чтобы получить какое-то значение с формы нужно использовать шестой параметр метода ОткрытьФорму – ОписаниеОповещенияОЗакрытии, который имеет тип ОписаниеОповещение.

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

&НаКлиенте
Процедура ВыбратьНоменклатуру(Команда)

ОписаниеВыбора = Новый ОписаниеОповещения(«ОбработатьВыборНоменклатуры»,ЭтаФорма);

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

&НаКлиенте

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

Если Не ЗначениеЗаполнено(РезультатЗакрытия) Тогда
Возврат;
КонецЕсли;

ВыбраннаяНоменклатура = РезультатЗакрытия;

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

Где ВыбраннаяНоменклатура это реквизит формы.
Заметьте, процедура ОбработатьВыборНоменклатуры, которую мы указали в описании оповещения, обязательно должна быть экспортной.
Теперь нам осталась указать объект описание выбора в шестом параметре метода ОткрытьФорму

&НаКлиенте
Процедура ВыбратьНоменклатуру(Команда)

ОписаниеВыбора = Новый ОписаниеОповещения(«ОбработатьВыборНоменклатуры»,ЭтаФорма);

ОткрытьФорму(«Справочник.Номенклатура.ФормаВыбора»,,,,,,
ОписаниеВыбора,
РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);

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

И всё! Сейчас при выполнении команды, откроется форма выбора, и если какая-то номенклатура будет выбрана, то она запишется в реквизит формы в процедуре ОбработатьВыборНоменклатуры.

Открытие формы выбора

Изучайте управляемые формы 1С с моими статьями:

Открытие управляемой формы существующего объекта

Открытие управляемой формы 1С на основании другого объекта

Открытие обычной формы в управляемом приложении 1С

Очень подробно вопросы по работе с управляемыми формами в частности и с управляемым приложением в целом рассмотрены в книге «Основы разработки в 1С: Такси. Разработка управляемого приложения за 12 шагов». Эта книга станет настоящим подспорьем для тех, кто только начал знакомится с разработкой управляемого приложения.

Многие начинающие думают, что изучить язык программирование в 1С сложно и трудно. В действительности программировать в 1С — легко. Помогут Вам легко и быстро освоить программирование в 1С мои книги: «Программировать в 1С за 11 шагов» и «Основы разработки в 1С: Такси»

Книга «Основы разработки в 1С: Такси»

Книга «Основы разработки в 1С: Такси» отлично подойдёт тем, кто уже начал программировать и испытывает определенные сложности с этой темой и тем, кто уже давно программирует, но ни разу еще не работал с управляемыми формами 1С

  1. Без сложных технических терминов;
  2. Более 600 страниц практического материала;
  3. Каждый пример сопровождается рисунком (скриншот);
  4. Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!

Промо-код на скидку в 15% — 48PVXHeYu

Программировать в 1С за 11 шаговКнига «Программировать в 1С за 11 шагов»

Изучите программирование в 1С с помощью моей книги «Программировать в 1С за 11 шагов»

  1. Без сложных технических терминов. Написана понятным и простым языком — для новичка.
  2. Более 700 страниц практического материала.
  3. Каждое задание сопровождается рисунком (скриншот).
  4. Сборник задач для домашней проработки.
  5. Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!


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

можно оплатить вручную:

Яндекс.Деньги — 410012882996301
Web Money — R955262494655

Вступайте в мои группы в соцсетях, и будьте в курсе всех новостей

Вконтакте: https://vk.com/1c_prosto
Фейсбуке: https://www.facebook.com/groups/922972144448119/
ОК: http://ok.ru/group/52970839015518
Твиттер: https://twitter.com/signum2009

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

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

Давайте рассмотрим работу механизма на примере: в документе «Поступление товаров» при выборе контрагента необходимо выбирать только поставщиков (отбор будем производить по реквизиту Поставщик типа Булево справочника «Контрагенты»).

Для начала, проверим наличие поля отбора «Поставщик» в настройках отбора динамического списка. Для этого откроем форму выбора справочника «Контрагенты» и перейдем к настройкам динамического списка:Настройка отбора в форме выбора

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

Теперь нам осталось написать только код процедуры, который будет вызывать форму выбора:

ПараметрыОтбора = Новый Структура("Поставщик", Истина);
ПараметрыФормы = Новый Структура("Отбор", ПараметрыОтбора);
ОткрытьФорму("Справочник.Контрагенты.ФормаВыбора", ПараметрыФормы);

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

Читайте также:

  1. Функция ОткрытьФорму()
  2. Как открыть форму отчета с отбором?

Поделиться страницей в соц.сетях

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

ПолучитьФорму(«Документ.ПоступлениеТоваровУслуг.ФормаДокумента»).Открыть()

Это самый медленный метод открытия форм. Тем не менее, он позволяет программно обработать форму перед открытием. Для обработки код нужно немного изменить:

Форма=ПолучитьФорму(«Документ.ПоступлениеТоваровУслуг.ФормаДокумента»);
//Тут выполняем действия с формой
Форма.Открыть();

Надо учитывать, что при получении формы будет выполняться еще процедура события ПриСозданииНаСервере.

Рассмотрим другие методы, которые позволяют открывать формы в управляемом приложении 1С быстрее и удобнее. В зависимости от конкретной ситуации могут использоваться разные методы.

1. Как открыть форму объекта в управляемом приложении, если есть ссылка на него.

В этом случае все предельно просто.

СпрСсылка=Справочники.Номенклатура.НайтиПоКоду(«000000001»);
ОткрытьЗначение(СпрСсылка);

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

Для этого существует функция ВвестиЗначение(). У функции 3 параметра:

  • Переменная, в которую будет записано выбранное значение;
  • Подсказка, которая будет отображена в окне выбора;
  • Описание типов выбираемых значений. Может быть несколько типов, тогда перед выбором конкретного значения будет предложено выбрать тип.

В результате выполнения функции откроется форма выбора по умолчанию для объекта указанного типа.

Перем Значение;
Массив=новый массив;
Массив.Добавить(Тип(«СправочникСсылка.Номенклатура»));
Массив.Добавить(Тип(«СправочникСсылка.Контрагенты»));

ОписаниеТипов=новый ОписаниеТипов(Массив);

Рез=ВвестиЗначение(Значение, «Подсказка», ОписаниеТипов);

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

Эта функция имеет довольно много параметров. Рассмотрим некоторые из них:

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

Рассмотрим, как применяется функция ОткрытьФорму() в различных ситуациях.

3. Как открыть форму существующего объекта

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

&НаКлиенте
Процедура Команда1(Команда)
Параметр=новый структура;
Параметр.Вставить(«Ключ», НайтиС());
ОткрытьФорму(«Справочник.Контрагенты.ФормаОбъекта»,Параметр);
КонецПроцедуры

&НаСервере
Функция НайтиС();
Возврат Справочники.Контрагенты.НайтиПоРеквизиту («ИНН», «745107734623»)
КонецФункции

4. Как открыть форму нового объекта

Тут подойдет просто функция ОткрытьФорму() без всяких параметров.

&НаКлиенте
Процедура Команда1(Команда)
ОткрытьФорму(«Справочник.Контрагенты.ФормаОбъекта»);
КонецПроцедуры

5. Как открыть форму нового объекта и заполнить ее на основании чего-либо

Нужно передать параметр Основание, значением которого будет являться ссылка на объект-основание заполнения. При этом будет запущена процедура ОбработкаЗаполнения().

&НаКлиенте
Процедура Команда1(Команда)
Параметр=новый структура;
Параметр.Вставить(«Основание», СсылкаНаСчетПокупателю);
ОткрытьФорму(«Документ.РеализацияТоваровУслуг.ФормаОбъекта», Параметр);
КонецПроцедуры

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

6. Как открыть форму и задать на ней отбор

Отбор на формах 1С может быть простым и сложным. Простой отбор предусматривает выражения типа Организация = ООО «Рога и копыта». Сложный отбор предполагает и другие типы сравнения, например, В списке. В данной статье рассмотрим организацию простого отбора, а сложному будет посвящена отдельная статья.

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

Например, откроем форму списка справочника НомераГТД и сделаем там отбор по владельцу — элементу справочника Номенклатура.

&НаКлиенте
Процедура Команда1(Команда)
Параметр=новый структура;

Отбор=новый Структура;
Отбор.Вставить(«Владелец», СсылкаНаНоменклатуру);

Параметр.Вставить(«Отбор», Отбор);

ОткрытьФорму(«Справочник.НомераГТД.ФормаСписка», Параметр);
КонецПроцедуры

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

Для этого понадобится ключ записи регистра сведений.

Ключ записи — это значения всех измерений и период (если регистр периодический). То есть ключ записи — это параметры, по которым можно однозначно идентифицировать запись.

Алгоритм открытия следующий:

  1. Заносим в структуру данные ключа записи с необходимыми значениями.
  2. Помещаем полученную структуру в массив.
  3. Из массива создаем ключ записи.
  4. Передаем в открываемую форму параметр Ключ с ключом записи из п.3 в качестве значения.

&НаКлиенте
Процедура Команда1(Команда)
Параметр=новый структура;

ПараметрыКлюча=новый Структура;
ПараметрыКлюча.Вставить(«Номенклатура», СсылкаНаНоменклатуру);
ПараметрыКлюча.Вставить(«ТипЦены», СсылкаНаТипЦен);
ПараметрыКлюча.Вставить(«Период», Дата);

МассивКлюча = Новый Массив;
МассивКлюча.Добавить(ПараметрыКлюча);

КлючЗаписи = Новый(«РегистрСведенийКлючЗаписи.ЦеныНоменклатуры», МассивКлюча);

Параметр.Вставить(«Ключ», КлючЗаписи);

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

В статье будет рассказано о том, как в 1с открыть форму программно. Все описанное ниже, касается только управляемого приложения. Подробно рассмотрим метод глобального контекста ОткрытьФорму.

Также можете ознакомиться с более простыми, но менее гибкими способами открыть форму по ссылке: Как в 1с открыть ссылку.

Метод ОткрытьФорму по имени

Самый гибкий и настраиваемый способ программного открытия формы в 1с 8. Рассмотрим подробно его параметры, а также разберем несколько примеров его использования.

ОткрытьФорму(<ИмяФормы>, 
             <Параметры>, 
             <Владелец>, 
             <Уникальность>, 
             <Окно>, 
             <НавигационнаяСсылка>, 
             <ОписаниеОповещенияОЗакрытии>, 
             <РежимОткрытияОкна>)

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

Рассмотрим параметры метода и приведем необходимые примеры.

ИмяФормы

Содержит полный путь к форме. Можно указать, как путь к форме по умолчанию, так и путь к произвольной форме объекта метаданных. Имя формы указывается в следующих двух форматах:

<ТипОбъекта>.<ИмяОбъекта>.<ИмяФормыПоУмолчанию>

или

<ТипОбъекта>.<ИмяОбъекта>.Форма.<ИмяФормы>
  • ТипОбъекта. Наименование типа объекта метаданных, например: Справочник, Документ, РегистрСведений и т. д.;
  • ИмяОбъекта. Наименование объекта метаданных. Например для справочника: Пользователи, Номенклатура;
  • ИмяФормыПоУмолчанию. Стандартное имя формы, набор имен по умолчанию различается для различных объектов метаданных. Например для документа: ФормаВыбора, ФормаОбъекта, ФормаСписка. Полный набор имен по умолчанию можно найти в синтаксис помощнике, в описании метода ОткрытьФорму;
  • ИмяФормы. Произвольное имя формы, заданное при ее создании. Например у справочника Пользователи, форма СменаПочты.

Пример 1. Путь к форме выбора по умолчанию, справочника Номенклатура.

"Справочник.Номенклатура.ФормаВыбора"

Пример 2. Путь к форме СменаПочты справочника Пользователи, по ее имени.

"Справочник.Пользователи.Форма.СменаПочты"

Параметры

Содержит Структуру параметров, которые передаются в открываемую форму. Для каждого типа формы, существует набор стандартных параметров, которые не нужно дополнительно обрабатывать в самой форме. Также набор параметров может различаться и для объектов метаданных. Например, параметр Ключ, для форм объектов. В него можно передать ссылку на открываемый объект (если его не передать, будет открыта форма нового объекта).

Подробнее прочитать описание всех возможных стандартных параметров можно в синтаксис помощнике, в ветке Интерфейс (управляемый) -> Форма клиентского приложения (в старых версиях платформы Управляемая форма). Далее в ветках Расширение объектов, Расширение справочника  и т. д., можно найти Параметры формы. Там дается полный список возможных стандартных параметров с описаниями.

Также в структуру можно передавать произвольные параметры, которые можно обрабатывать программно, в открываемой форме. Например в обработчике события ПриСозданииНаСервере.

Рассмотрим примеры открытия различных форм с использованием параметров.

Пример 3. Открыть форму объекта справочника Пользователи, используя ссылку на объект.

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

Пример 4. Открыть форму списка справочника Номенклатура с отбором по реквизиту ВидНоменклатуры и по списку родителей.

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

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

Данным способом можно отобрать значения, используя вид сравнения Равно или ВСписке. Для отбора ВСписке следует добавить в структуру Массив, ФиксированныйМассив, либо СписокЗначений. Следует заметить, что отбор ВИерархии установить данным способом не выйдет.

Владелец

В данный параметр передается элемент формы или форма клиентского приложения (управляемая форма) полностью. Используется для указания подчинения открываемой формы.

Это может потребоваться для многих целей, например для:

  • Анализа владельца и выполнения определенных действий в открываемой форме;
  • Корректной работы события ОбработкаЗаписиНового, в форме владельце;
  • Самостоятельной реализации выбора в поле формы.

Пример 5. Реализовать программный выбор элемента Номенклатура, в поле ввода.

&НаКлиенте
Процедура НоменклатураНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	
    СтандартнаяОбработка = Ложь;
	
    ПараметрыФормы = Новый Структура;
    ПараметрыФормы.Вставить("ТекущаяСтрока", Номенклатура);	
	
    ОткрытьФорму("Справочник.Номенклатура.ФормаВыбора", ПараметрыФормы, Элемент);
	
КонецПроцедуры

В данном случае необходимо:

  • Создать обработчик события НачалоВыбора, для поля ввода;
  • Отменить стандартную обработку выбора;
  • В параметр Владелец передать элемент формы (поле).

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

Уникальность

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

По умолчанию, платформа сама генерирует ключ уникальности. Поэтому помимо использования собственного ключа, в параметре Уникальность, можно регулировать использование стандартного. Если передать в него значение Ложь, то будет использован стандартный ключ, если значение Истина, то ключ не будет использоваться совсем. Т.е. будет создаваться новая форма, при каждом использовании метода ОткрытьФорму. Значением по умолчанию является Ложь, поэтому специально задавать его не требуется.

Пример 6. Одновременно открыть две формы объекта справочника Пользователи, по одной и той же ссылке.

ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("Ключ", Пользователь);
	
ОткрытьФорму("Справочник.Пользователи.ФормаОбъекта", ПараметрыФормы,, "1");
ОткрытьФорму("Справочник.Пользователи.ФормаОбъекта", ПараметрыФормы,, "2");

Окно

В параметре можно указать окно, в котором будет открыта новая форма. Тип параметра ОкноКлиентскогоПриложения.

Пример 7. Реализовать программный выбор элемента Номенклатура, в поле ввода. Реализовать выбор в окне формы, на которой расположено поле.

&НаКлиенте
Процедура НоменклатураНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	
    СтандартнаяОбработка = Ложь;

    Окно = ЭтаФорма.Окно;
    ОткрытьФорму("Справочник._ДемоНоменклатура.ФормаВыбора",, Элемент,, Окно);
	
КонецПроцедуры

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

НавигационнаяСсылка

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

ОписаниеОповещенияОЗакрытии

В параметр передается описание процедуры, которая будет вызвана после закрытия открываемой формы. Тип параметра: ОписаниеОповещения.

Пример 8. В 1с открыть форму программно. Использовать форму объекта справочника Пользователи. После ее закрытия сообщить, что карточка пользователя закрыта.

&НаКлиенте
Процедура ОткрытьФормуПользователя(Пользователь)

    ДопПараметры = Новый Структура;
    ДопПараметры.Вставить("Пользователь", Пользователь);
	
    Оповещение = Новый ОписаниеОповещения("ПослеЗакрытияФормыПользователя", 
                                          ЭтаФорма, 
                                          ДопПараметры);
	
    ПараметрыФормы = Новый Структура;
    ПараметрыФормы.Вставить("Ключ", Пользователь);
	
    ОткрытьФорму("Справочник.Пользователи.ФормаОбъекта", 
                 ПараметрыФормы,,,,, 
                 Оповещение);	

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

&НаКлиенте
Процедура ПослеЗакрытияФормыПользователя(Результат, ДопПараметры) Экспорт

    Пользователь = ДопПараметры.Пользователь;
	
    ШаблонСообщения = "Карточка пользователя ""%1"" закрыта";	
    ТекстСообщения = СтрШаблон(ШаблонСообщения, Пользователь);
	
    Сообщить(ТекстСообщения);	

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

Используемые в примере параметры описания оповещения:

  • Первый: имя процедуры;
  • Второй: модуль, в котором она расположена (в данном случае текущая форма);
  • Третий: структура дополнительных параметров, которая будет передана в процедуру;

Описанная процедура обязательно должна иметь два параметра:

  • Результат. Значение, которое возвращает форма при закрытии. Форма объекта не возвращает значений (если это специально не прописать), поэтому в данном случае значение параметра будет Неопределено. А вот форма выбора, например, вернет массив выбранных значений.
  • ДопПараметры. Структура параметров, созданная в описании оповещения.

Также описанная процедура должна быть экспортной.

РежимОткрытияОкна

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

  • БлокироватьВеcьИнтерфейс;
  • БлокироватьОкноВладельца;
  • Независимый.

Метод ОткрытьФорму по форме

Существует еще один вариант синтаксиса метода ОткрытьФорму.

ОткрытьФорму(<Форма>, <Окно>)

Используется, если вы уже получили форму, произвели с ней какие-то действия и теперь ее необходимо открыть.

Пример 9. Получить форму списка справочника Номенклатура, а затем в 1с открыть форму программно.

Форма = ПолучитьФорму("Справочник._ДемоНоменклатура.ФормаСписка");
ОткрытьФорму(Форма);


В данной статье рассмотрены несколько способов программного открытия формы с установленным отбором.
У начинающих разработчиков достаточно часто возникает вопрос – как при открытии формы установить в ней отбор? Чаще всего речь идет о форме списка или форме выбора. Но в общем случае – описанные в статье механизмы можно применять к любым формам, в которых используется динамический список. Ниже – видео версия этой статьи, для тех кому больше нравится видео формат.

Итак, что же это за способы, и чем они отличаются?
Забегая вперед, скажу – с точки зрения пользователей, разные технические решения могут выглядеть и вести себя одинаково. И разница будет только в коде и используемых механизмах платформы. В разных случаях могут понадобиться разные варианты, поэтому ниже я привожу 6 самых распространенных.

Содержание

Использование параметризованной команды для указания отбора

Один из распространенных приемов – создать глобальную параметризуемую команду, и параметр этой команды передать в качестве отбора. В свойствах команды нужно указать тип параметра команды. Можно указать группу “Панель навигации формы”, тогда команда автоматически будет добавляться в командный интерфейс при открытии формы соответствующего объекта.

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

Текст команды будет следующий:

&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
	
	ОтборПоКонтрагенту = Новый Структура("Контрагент", ПараметрКоманды);
	ПараметрыФормы = Новый Структура("Отбор", ОтборПоКонтрагенту);
	ОткрытьФорму("Документ.ПоступленияТоваров.ФормаСписка",
		ПараметрыФормы,
		ПараметрыВыполненияКоманды.Источник,
		ПараметрыВыполненияКоманды.Уникальность,
		ПараметрыВыполненияКоманды.Окно,
		ПараметрыВыполненияКоманды.НавигационнаяСсылка);
	
КонецПроцедуры

Ключевой момент здесь – правильно упаковать параметры. Нужно поместить параметр команды в структуру, где ключ структуры будет соответствовать одному из полей отбора динамического списка. В нашем случае – Контрагент. А значение – сам параметр.
И уже эту структуру поместить в структуру ПараметрыФормы (это стандартное название, которое платформа генерирует при добавлении команды, но вы можете использовать любое другое).

Трюк в том, что у формы с основным реквизитом – динамическим списком платформа добавляет параметр Отбор, и на основании содержимого этого параметра, при открытии формы накладывает отбор динамического списка. Поэтому никакого кода дополнительно писать не надо – платформа все сделает за нас.

Параметризуемая команда и передача параметра

Второй вариант – передать параметр команды не в свойство “Отбор”, а в качестве параметра формы. В этом случае платформа не сможет сгенерировать отбор автоматически, и придется добавить немного кода.

&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
	
	ПараметрыФормы= Новый Структура("Контрагент", ПараметрКоманды);
	ОткрытьФорму("Документ.ПоступленияТоваров.ФормаСписка",
		ПараметрыФормы,
		ПараметрыВыполненияКоманды.Источник,
		ПараметрыВыполненияКоманды.Уникальность,
		ПараметрыВыполненияКоманды.Окно,
		ПараметрыВыполненияКоманды.НавигационнаяСсылка);
	
КонецПроцедуры
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	Список.Отбор.Элементы.Очистить();
	ЭлементОтбора = Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Контрагент");
	ЭлементОтбора.Использование = Истина;
	ЭлементОтбора.ПравоеЗначение = Параметры.Контрагент;
	
КонецПроцедуры

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

Получение ссылки через параметры выполнения команды

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

&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
	
	ОтборПоКонтрагенту = Новый Структура("Контрагент", ПараметрыВыполненияКоманды.Источник.Объект.Ссылка);
	ПараметрыФормы = Новый Структура("Отбор", ОтборПоКонтрагенту);
	ОткрытьФорму("Документ.ПоступленияТоваров.ФормаСписка",
	ПараметрыФормы,
	ПараметрыВыполненияКоманды.Источник,
	ПараметрыВыполненияКоманды.Уникальность,
	ПараметрыВыполненияКоманды.Окно,
	ПараметрыВыполненияКоманды.НавигационнаяСсылка);
	
КонецПроцедуры

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

Суть все та же – получаем ссылку, которую хотим использовать в качестве отбора, и передаем в открываемую форму. Как рассмотрено выше, можно поместить либо в отдельный параметр формы, либо в параметр Отбор.

&НаКлиенте
Процедура ВыбратьДокумент(Команда)
	
	ПараметрыФормы = Новый Структура("Контрагент", Объект.Ссылка);
	ОткрытьФорму("Документ.ПоступленияТоваров.Форма.ФормаВыбораПоКнопке", ПараметрыФормы, ЭтотОбъект);
	
КонецПроцедуры

Следует понимать, что мы можем передать в свойство “Отбор” структуру с несколькими ключами, на пример, мы хотим отфильтровать документы не только по контрагенту, но и по организации. И важно учитывать, что платформа стыкует передаваемые параметры и поля отбора по именам ключей. Если переданные ключи не будут соответствовать доступным полям отбора, то автоматически платформа фильтр наложить не сможет.

И еще один момент, о котором стоит упомянуть. Нам никто не запрещает передать больше одного параметра при открытии формы. Например, мы хотим отфильтровать документы по контрагенту и по организации, или реализовать какие-то более сложные фильтры.

Отбор при помощи связи параметров выбора

Кроме использования команд, есть и другие способы открыть форму с установленным отбором. Рассмотрим абстрактный пример. В форме контрагента у нас есть реквизит с типом Документ.ПоступлениеТоваров. И мы хотим при подборе документа в это поле, чтобы фильтровались только документы нужного контрагента.

Использование свойства СвязиПараметровВыбора

В свойствах элемента управления (либо в свойствах реквизита объекта, если мы хотим это сделать для всех форм, где доступен этот реквизит) находим СвязиПараметровВыбора, и настраиваем для отбора по текущей ссылке:

Суть работы этого механизма – точно такая же как с использованием параметризованной команды: мы в свойство Отбор.Контрагент помещаем нужную ссылку. Только в одном случае мы это делали через передачу структуры параметров, а в другом – с помощью настроек в конфигураторе.

Отбор при помощи программной установки параметров выбора

Ну и последний способ, которым можно воспользоваться – он более редкий, и его применяют не так часто. Речь пойдет о свойстве ПараметрыВыбора. Это свойство по своему использованию близко к СвязиПараметровВыбора, но цель у него другая. Связи параметров позволяют использовать данные текущей формы – например, текущую ссылку, или какой-то другой реквизит, который в разных формах будет иметь разные значения.
А вот параметры выбора изначально задаются в конфигураторе некоторыми фиксированными значениями. Например, значением предопределенных элементов справочника, значениями перечислений, и т.д. То есть, подразумевается, что они всегда будут одни и те же. Но, разумеется, мы можем их переопределить программно.

Делать это можно в обработчике НачалоВыбора. Например, так:

&НаКлиенте
Процедура ОсновнойДокумент2НачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	
	НовыйПараметр = Новый ПараметрВыбора("Отбор.Контрагент", Объект.Ссылка);
	НовыйМассив = Новый Массив();
	НовыйМассив.Добавить(НовыйПараметр);
	НовыеПараметры = Новый ФиксированныйМассив(НовыйМассив);
	Элементы.ОсновнойДокумент2.ПараметрыВыбора = НовыеПараметры;
	
КонецПроцедуры

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

Итак, мы рассмотрели шесть вариантов открытия формы с отбором в 1С 8. Какие-то проще, какие-то сложнее, но все находят свое применение. Пользуйтесь теми, какие удобнее!

На чтение 6 мин Просмотров 6.3к. Опубликовано 19.08.2021

Программное открытие форм в управляемом и обычном приложении 1С сильно отличается.

Содержание

  1. Программное открытие формы в обычном приложении
  2. Программное открытие формы в управляемом приложении
  3. Как открыть форму объекта в управляемом приложении, если есть ссылка на него?
  4. Как создать документ и открыть его форму?
  5. Как открыть форму выбора и получить потом выбранное значение?
  6. Функция ОткрытьФорму() в управляемом приложении 1С
  7. Как программно открыть форму существующего объекта?
  8. Как программно открыть форму нового объекта и заполнить ее на основании чего-либо?
  9. Как программно открыть форму и задать на ней отбор?
  10. Как программно открыть форму записи регистра сведений?

Программное открытие формы в обычном приложении

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

//Получаем форму документа ПоступлениеТоваровУслуг и открываем ее
ПолучитьФорму("Документ.ПоступлениеТоваровУслуг.ФормаДокумента").Открыть()

Это самый медленный метод открытия форм, но он позволяет программно обработать форму перед открытием. Для обработки формы перед открытием код нужно немного изменить:

//Получаем форму документа ПоступлениеТоваровУслуг
Форма=ПолучитьФорму("Документ.ПоступлениеТоваровУслуг.ФормаДокумента");
//Тут выполняем действия с формой
Форма.Открыть();

При этом при получении формы будет выполняться процедура события ПриСозданииНаСервере.

Рассмотрим другие методы открытия форм в управляемом приложении 1С.

Программное открытие формы в управляемом приложении

Как открыть форму объекта в управляемом приложении, если есть ссылка на него?

//Получаем ссылку на номенклатуру с кодом КодТовара
СправочникСсылка=Справочники.Номенклатура.НайтиПоКоду(КодТовара);
//Открываем форму номенклатуры с кодом КодТовара
ОткрытьЗначение(СправочникСсылка);

Метод глобально контекста ОткрытьЗначение() показывает в диалоге переданное значение. При этом, вид диалога зависит от типа переданного значения. Поскольку в данном примере мы передаем ссылку на элемент справочника, то метод открывает основную форму справочника Номенклатура.

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

В 1С для этих целей существует два возможных сценария работы:

  1. открыть форму нового документа и предоставить пользователю самому интерактивно записать данные объекта в базу данных.
  2. создать новый документ программно, программно заполнить его данными и программно записать. Затем, если нужно, показать его пользователю.

В первом сценарии проще всего использовать метод глобального контекста ОткрытьФорму().

Это можно сделать на клиенте.

//Открываем форму документа ПриходнаяНакладная
ОткрытьФорму("Документ.ПриходнаяНакладная.ФормаОбъекта");

При этом создается новый документ и открывается для редактирования основная форма этого документа.

При необходимости можно предварительно заполнить документ начальными данными, например с помощью свойств реквизитов документа ЗначениеЗаполненияЗаполнятьИзДанныхЗаполнения либо в обработчике события документа ОбработкаЗаполнения.

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

Например:

&НаКлиенте
Процедура ПриходнаяНакладная(Команда)

    СсылкаНаДокумент = СоздатьНовыйДокумент();
    ОткрытьЗначение(СсылкаНаДокумент);

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

&НаСервере
Функция СоздатьНовыйДокумент()

   НовыйДокумент = Документы.ПриходнаяНакладная.СоздатьДокумент();
   НовыйДокумент.Номер = "111";
   НовыйДокумент.Дата = ТекущаяДата();
   НовыйДокумент.Записать();

   Возврат НовыйДокумент.Ссылка;

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

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

Для этого воспользуемся функцией ВвестиЗначение(). 

ВвестиЗначение(<Значение>, <Подсказка>, <Тип>);

  • Значение — переменная, в которую будет помещено выбранное значение;
  • Подсказка — Текст заголовка окна диалога ввода значения. Может использоваться в качестве подсказки пользователю. Значение по умолчанию: Пустая строка.
  • Тип — тип вводимого значения. Если параметр не указан, используется тип параметра <Значение>. Может быть несколько типов, тогда перед выбором конкретного значения будет предложено выбрать тип.

В результате выполнения функции откроется форма выбора по умолчанию для объекта указанного типа.

Перем Значение;
Массив=новый массив;
Массив.Добавить(Тип("СправочникСсылка.Контрагенты"));
ОписаниеТипов = Новый ОписаниеТипов(Массив);
РезультатВыбора = ВвестиЗначение(Значение, "Выберете контрагента", ОписаниеТипов);

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

Функция ОткрытьФорму() в управляемом приложении 1С

Для открытия произвольной формы предназначена функция ОткрытьФорму(). Рассмотрим как она работает.

ОткрытьФорму(<ИмяФормы>, <Параметры>, <Владелец>, <Уникальность>, <Окно>, <НавигационнаяСсылка>, <ОписаниеОповещенияОЗакрытии>, <РежимОткрытияОкна>);

Некоторые параметры функции:

  • ИмяФормы — полный путь к объекту метаданных Форма, тут можно выбрать либо одну из стандартных форм объекта, например, ФормаВыбора или ФормаСписка. Или конкретную, созданную разработчиками форму.
  • Параметры — позволяет передать в форму в виде структуры некоторые параметры перед ее открытием, тем самым определив выводимые данные. Параметры могут представлять собой любые данные, которые можно передавать с клиента на сервер.
  • Владелец — владелец формы — форма или элемент управления другой формы.
  • РежимОткрытияОкна— имеет 3 варианта: независимый, блокировать весь интерфейс, блокировать форму владельца.

Переданные при открытии формы параметры можно обработать в процедуре ПриСозданииНаСервере() у открываемой формы.

Как программно открыть форму существующего объекта?

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

&НаКлиенте
Процедура КомандаОткрытьКонтрагентаПоИНН(Команда)
  Параметр=новый структура;
  Параметр.Вставить("Ключ", ПолучитьКонтрагентаПоИНН(ИннКонтрагента));
  ОткрытьФорму("Справочник.Контрагенты.ФормаОбъекта",Параметр);
КонецПроцедуры

&НаСервере
Функция ПолучитьКонтрагентаПоИНН(ИНН);
   Возврат Справочники.Контрагенты.НайтиПоРеквизиту("ИНН", ИНН);
КонецФункции

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

В качестве параметра Основание нужно передать ссылку на объект-основание заполнения. При этом будет запущена процедура ОбработкаЗаполнения().

&НаКлиенте
Процедура КомандаОткрытьФормуРТУ(Команда)
   Параметр = Новый Структура;
   Параметр.Вставить("Основание", СсылкаНаСчетПокупателю);
   ОткрытьФорму("Документ.РеализацияТоваровУслуг.ФормаОбъекта", Параметр);
КонецПроцедуры

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

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

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

&НаКлиенте
Процедура КомандаОткрытьНомераГТДСОтборомПоВладельцу(Команда)
  Параметр=новый структура;
  Отбор=новый Структура;
  Отбор.Вставить("Владелец", СсылкаНаНоменклатуру);
  Параметр.Вставить("Отбор", Отбор);
  ОткрытьФорму("Справочник.НомераГТД.ФормаСписка", Параметр);
КонецПроцедуры

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

Для этого понадобится ключ записи регистра сведений.

Ключ записи — это значения всех измерений и период (если регистр периодический). То есть ключ записи — это параметры, по которым можно однозначно идентифицировать запись.

Алгоритм открытия следующий:

  1. Заносим в структуру данные ключа записи с необходимыми значениями.
  2. Помещаем полученную структуру в массив.
  3. Из массива создаем ключ записи.
  4. Передаем в открываемую форму параметр Ключ с ключом записи из п.3 в качестве значения.
&НаКлиенте
Процедура ОткрытьЦеныНоменклатуры(Команда)
   ПараметрыКлюча = Новый Структура;
   ПараметрыКлюча.Вставить("Номенклатура", СсылкаНаНоменклатуру);
   ПараметрыКлюча.Вставить("ТипЦены", СсылкаНаТипЦен);
   ПараметрыКлюча.Вставить("Период", Дата);
   
   МассивКлюча = Новый Массив;
   МассивКлюча.Добавить(ПараметрыКлюча);
   
   КлючЗаписи = Новый("РегистрСведенийКлючЗаписи.ЦеныНоменклатуры", МассивКлюча);
   Параметр = Новый Структура("Ключ", КлючЗаписи);
   
   ОткрытьФорму("РегистрСведений.ЦеныНоменклатуры.ФормаЗаписи", Параметр);
КонецПроцедуры

Программное открытие управляемой формы выбора

Опубликовано в Статьи по 1С 12.08.2019

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

Делается это при помощи метода ОткрытьФорму.

Для этой статьи я в конфигураторе 1С создам обработку, на форму этой обработки помещу команду, при выполнении которой, откроется форма выбора справочника Номенклатура, и запишу выбранное значение в реквизит формы обработки.

Управляемая форма обработки

Замечу, что в моей конфигурации нет формы выбора

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

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

 Выбор формы выбора

Для того, чтобы получить какое-то значение с формы нужно использовать шестой параметр метода ОткрытьФорму – ОписаниеОповещенияОЗакрытии, который имеет тип ОписаниеОповещение.

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

&НаКлиенте
Процедура ВыбратьНоменклатуру(Команда)
ОписаниеВыбора = Новый ОписаниеОповещения(«ОбработатьВыборНоменклатуры»,ЭтаФорма);
КонецПроцедур
ы

&НаКлиенте
Процедура ОбработатьВыборНоменклатуры(РезультатЗакрытия,ДопПараметры) Экспорт
Если Не ЗначениеЗаполнено(РезультатЗакрытия) Тогда
Возврат;
КонецЕсли;
ВыбраннаяНоменклатура = РезультатЗакрытия;
КонецПроцедуры

Где ВыбраннаяНоменклатура это реквизит формы.
Заметьте, процедура ОбработатьВыборНоменклатуры, которую мы указали в описании оповещения, обязательно должна быть экспортной.
Теперь нам осталась указать объект описание выбора в шестом параметре метода ОткрытьФорму

&НаКлиенте
Процедура ВыбратьНоменклатуру(Команда)
ОписаниеВыбора = Новый ОписаниеОповещения(«ОбработатьВыборНоменклатуры»,ЭтаФорма);
ОткрытьФорму(«Справочник.Номенклатура.ФормаВыбора»,,,,,,
ОписаниеВыбора,
РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецПроцеду
ры

И всё! Сейчас при выполнении команды, откроется форма выбора, и если какая-то номенклатура будет выбрана, то она запишется в реквизит формы в процедуре ОбработатьВыборНоменклатуры.

Открытие формы выбора

Понравилась статья? Поделить с друзьями:

Другие крутые статьи на нашем сайте:

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии