Отбор на управляемых формах в 1С 8.3

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

  • Установка отбора в конфигураторе

Установка отбора в пользовательском режиме

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

Для установки отбора в режиме предприятия необходимо вызвать команду «Настроить список».

Откроется окно.


На вкладке «отбор» представлен список полей, который есть в текущем списке. Выбираем поля списка, по которым будем фильтровать. Сделать это можно двойным кликом или используя drag and drop.


Задаем вид сравнения и значение, жмем «Завершить редактирование», отбор установлен.


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


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


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

Установка отбора в конфигураторе

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

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


Откроется окно.


Отбор задается так же, как в пользовательском режиме.

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


Динамический (программный) отбор

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

Методы

Если в разрабатываемой конфигурации присутствует подсистема БСП «БазоваяФункциональность», программный отбор в динамическом списке можно установить используя типовой метод:

ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка()

Сигнатура данного метода:

ДинамическийСписок Тип: ДинамическийСписок – Список, в котором требуется установить отбор.

ИмяПоля Тип: Строка – Поле, по которому необходимо установить отбор.

ПравоеЗначение Тип: Произвольный – Значение отбора (Необязательный. Значение по умолчанию: Неопределено. Внимание! Если передать Неопределено, то значение не будет изменено).

ВидСравнения Тип: ВидСравненияКомпоновкиДанных – Условие отбора.

Представление Тип: Строка – Представление элемента компоновки данных (Необязательный. Значение по умолчанию: Неопределено. Если указано, то выводится только флажок использования с указанным представлением (значение не выводится). Для очистки, чтобы значение снова выводилось, следует передать пустую строку).

Использование Тип: Булево – Флажок использования этого отбора (Необязательный. Значение по умолчанию: Неопределено).

РежимОтображения Тип: РежимОтображенияЭлементаНастройкиКомпоновкиДанных – Способ отображения этого отбора пользователю. Возможные значения:

  • РежимОтображенияЭлементаНастройкиКомпоновкиДанных.БыстрыйДоступ – В группе быстрых настроек над списком.
  • РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Обычный – В настройка списка (в подменю Еще).
  • РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный – Запретить пользователю менять этот отбор.

ИдентификаторПользовательскойНастройки Тип: Строка – Уникальный идентификатор этого отбора (Используется для связи с пользовательскими настройками).

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

ОбщегоНазначенияКлиентСервер. УдалитьЭлементыГруппыОтбораДинамическогоСписка ()

Сигнатура данного метода:

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

ИмяПоля Тип: Строка – имя поля компоновки (не используется для групп).

Представление Тип: Строка – представление поля компоновки.

В случае отсутствие в системе БСП отбор можно установить самостоятельно, используя объект ПолеКомпоновкиДанных.

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

Данный отбор отберет строки, в которых значение «ФИО» = «Иванов».

Для использования логических «И», «ИЛИ», «НЕ» предназначен тип данных ГруппаЭлементовОтбораКомпоновкиДанных

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

Данный отбор отберет строки, в которых значение «ФИО» = «Иванов» или «Петров».

Отбор в динамическом списке также можно производить через изменение текста запроса динамического списка. Этот вариант работает, когда динамический список сделан через «произвольный запрос».


Для этого к тексту запроса добавляем условие «ГДЕ Истина»…


Как видно, такой подход более компактный с точки зрения написания кода. Чем сложнее условия отбора в табличной части мы хотим установить, тем более громоздким будет вариант с использованием отбора через ЭлементОтбораКомпоновкиДанных. Однако у примера с изменением текста запроса есть свои недостатки – эта реализация не устойчива к изменениям кода. Например, вы сделали такую реализацию и забыли, но если в будущем вы захотите модифицировать текст запроса, добавив в него какой-либо оператор после ГДЕ (УПОРЯДОЧИТЬ, СГРУППИРОВАТЬ), вам нужно не забыть про то, что в программном коде есть:

Список.ТекстЗапроса = Список.ТекстЗапроса + " И СправочникПользователи.ФИО В(""Иванов"",""Петров"")";

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

ГДЕ (НЕ &ОтборУстановлен ИЛИ СправочникПользователи.ФИО В (&РазрешенныеФИО))

Список.Параметры.УстановитьЗначениеПараметра("ОтборУстановлен", ФИО.Количество() > 0); Список.Параметры.УстановитьЗначениеПараметра("РазрешенныеФИО", ФИО);

Тут ФИО – массив.

Ка видно, 2 строчки кода против 10. Какой из способов выбрать, зависит от конкретной прикладной задачи.

Как открыть форму списка с некоторым отбором?

Есть несколько способов для того, чтобы открыть форму списка с некоторым, заранее установленным отбором. Рассмотрим их по-порядку:

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

В процессе открытия формы будет установлен отбор по указанному полю. Например, в следующем примере открывается список приходных накладных с отбором по полю Номер , равному 333.

ЗначениеОтбора = Новый Структура("Номер", "333");

ПараметрыВыбора = Новый Структура("Отбор", ЗначениеОтбора);

ОткрытьФорму("Документ.ПриходнаяНакладная.ФормаСписка",ПараметрыВыбора);

2. Можно открыть форму списка без параметров:

ОткрытьФорму("Документ.ПриходнаяНакладная.ФормаСписка");

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

&НаСервере

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

ЭлементОтбора = Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));

ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Номер");

ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Больше;

ЭлементОтбора.Использование = Истина;

ЭлементОтбора.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный;

ЭлементОтбора.ПравоеЗначение = "000000001";

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

Преимущества данного метода в том, что ВидСравнения у отбора можно задавать не только Равно , как в первом случае, а и Больше , Меньше и т.п.

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

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

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

Обработчик выполнения этой команды заполним следующим образом:

&НаКлиенте

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

ФормаСписка = ПолучитьФорму("Документ.ПриходнаяНакладная.ФормаСписка");

ФормаСписка.ФильтрПоТовару = Элементы.Список.ТекущаяСтрока;

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

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

В этом обработчике мы получаем форму списка приходных накладных и передаем в параметр формы ФильтрПоТовару ссылку на текущий элемент в списке номенклатуры и открываем форму с этим параметром.

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

В поле Запрос введем следующий текст запроса:

ВЫБРАТЬ

ДокументПриходнаяНакладная.Номер,

ДокументПриходнаяНакладная.Дата

ИЗ

Документ.ПриходнаяНакладная КАК ДокументПриходнаяНакладная

ГДЕ

ДокументПриходнаяНакладная.Товары.Товар = &Товар

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

&НаКлиенте

Процедура ПриОткрытии(Отказ)

Список.Параметры.УстановитьЗначениеПараметра("Товар", ФильтрПоТовару);

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

Здесь Список.Параметры - это список параметров запроса динамического списка для реквизита Список . Значение параметра Товар устанавливается равным значению параметра формы ФильтрПоТовару .

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

Демонстрационный пример для 3-го варианта находится в каталоге 1CITS/EXE/FAQ/ОткрытьФормуСОтбором.dt. Пример выполнен на версии платформы 8.2.9.356.

Данный код позволяет открыть список документов с установленным отбором, также можно открыть список элементов справочника с нужным отбором

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

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

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

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

Например, в следующем примере открывается список приходных накладных с отбором по полю Номер, равному 333.

Код 1C v 8.2 УП ЗначениеОтбора = Новый Структура("Номер", "333");
ПараметрыВыбора = Новый Структура("Отбор", ЗначениеОтбора);
ОткрытьФорму("Документ.ПриходнаяНакладная.ФормаСписка", ПараметрыВыбора);

Второй способ

Можно открыть форму списка без параметров:

Код 1C v 8.2 УП ОткрытьФорму("Документ.ПриходнаяНакладная.ФормаСписка");

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

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

Преимущества данного метода в том, что ВидСравнения у отбора можно задавать не только Равно, как в первом случае, а и Больше, Меньше и т.п.

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

Третий способ

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

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

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

Обработчик выполнения этой команды заполним следующим образом:

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

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

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

Теперь откроем палитру свойств основного реквизита формы Список. Установим флаг ПроизвольныйЗапрос и в строке Настройка списка нажмём Открыть.

В поле Запрос введём следующий текст запроса:

Код 1C v 8.2 УП ВЫБРАТЬ
ДокументПриходнаяНакладная.Номер,
ДокументПриходнаяНакладная.Дата
ИЗ
Документ.ПриходнаяНакладная КАК ДокументПриходнаяНакладная
ГДЕ
ДокументПриходнаяНакладная.Товары.Товар = &Товар

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

Для этого в обработчике события формы списка ПриСозданииНаСервере напишем код для установки значения параметра запроса Товар:

Код 1C v 8.2 УП &НаКлиенте
Процедура ПриОткрытии(Отказ)
Список.Параметры.УстановитьЗначениеПараметра("Товар", Параметры.ФильтрПоТовару);
КонецПроцедуры

Здесь Список.Параметры - это список параметров запроса динамического списка для реквизита Список. Значение параметра Товар устанавливается равным значению параметра формы ФильтрПоТовару.

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

Добрый день.

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

Раньше в "обычном приложении" мы писали так:

форма = Справочник.номенклатура.ПолучитьФормуВыбора();

результатВыбора = форма.открытьМодальНО();

Между этими операторами мы могли изменить свойства формы, например задать отбор. Мы могли указать конкретную форму по имени. Могли изменять её внешний вид, обращаясь к свойствам элементав формы по их имени через точку (форма.Кнопка1.Видимость = Ложь;)

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

Итак приступим.

1. Самый простой случай, когда нам не нужно управлять выбором (настраивать отборы, передавать параметры в открывшуюся форму выбора).

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

Вот пример использования:

Перем ВыбТМЦ;

МассивТипов = Новый Массив;

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

Если ВвестиЗначение(ВыбТМЦ, "Выберите номенклатуру", ОписаниеТиповТМЦ) Тогда

//Обрабаботка выбранного значения

КонецЕсли;

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

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

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

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

Сразу оговорюсь, что это плохой путь для web-интерфейса, т.к. модальные окна открываются в новом окне браузера, которые обычно заблокированы. Но если пользователю заранее разъяснить, что к чему, то я думаю он справится с этой проблемой))

Итак, смотрим описание процедуры, у неё 4 параметра. В первом мы указываем строку с полным путём к форме "Справочник.ДоговорыКонтрагентов.ФормаВыбора". Во втором мы указываем параметры выбора, о них чуть ниже. В третий - владельца, это форма или поле выбора, которое получит в себя результат выбора, мы его не заполняем. Четвертый параметр в нашем слечае тоже не используется.

Итак, для простого выбора нам подойдет строка:

&НаКлиенте

Процедура Команда1(Команда)

рез = ОткрытьФормуМодально("Справочник.ДоговорыКонтрагентов.ФормаВыбора");

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

Но это полный аналог медода №1, и мы увидим форму выбора всех договоров, без отбора по владельцу. Т.е. так делать можно, только если мы хотим конкретизировать имя формы выбора.

Чтобы задать отбор, нам поможет второй параметр.

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

В моем примере я нарисовал в обработке поле выбора, ссылающееся на реквизит формы обработки "контрагент" с типом данных "СправочникСсылка.Контрагенты ". и написал следующий кусок кода:

&НаКлиенте

Процедура Команда1(Команда)

Отборы = Новый Структура("Владелец", Контрагент);

ПараметрыВыбора = Новый Структура("Отбор", Отборы);

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

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

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

На сегодня все, спасибо за внимание.

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

ПолучитьФорму() . Открыть()

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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