Начинающие разработчики иногда не совсем верно понимают предназначения параметров управляемых форм. В данной статье я предприму попытку наглядно показать и объяснить для чего нужно данное свойство.
Если мы откроем синтакс-помощник и введём на закладке "Индекс" слово "УправляемаяФорма", то увидим в разделе её свойств свойство "Параметры". Если перейти по гиперссылке к описанию свойства получим следующий текст:
Использование:
Только чтение.
Описание:
Тип: ДанныеФормыСтруктура.
Содержит коллекцию параметров формы.
Доступность:
Тонкий клиент, веб-клиент, сервер, толстый клиент.
Таким образом у всех управляемых форм есть параметры. Но мы рассмотрим наиболее частое их применение (с моей точки зрения) - это открытие отчетов. Для тестирования была взята каркасная конфигурация для подготовки к экзамену "Специалист" по платформе(оф. сайт 1с: http://www.1c.ru/rus/partners/training/questions.htm).
Конструктором движений сформируем движения по регистру "ОстаткиНоменклатуры" для документа "ПриходнаяНакладная", создадим обычный отчет с использованием данного регистра накопления, назовём его "ОстаткиНоменклатуры". В пользовательском режиме отчеты по умолчанию помещаются в панель "Сервис", поэтому от регистра накопления мы его отличим всегда. В конструкторе запроса будем использовать виртуальную таблицу "ОстаткиНоменклатуры.Остатки" и выберем все 2 поля данного регистра: //infostart.ru/upload/iblock/9f8/2.JPG. На закладке условия наложем фильтр по ссылке на текущий документ.
Не забудем в командном интерфейсе рабочего стола конфигурации указать видимость для регистра "Остатки номенклатуры".
В пользовательском режиме из номенклатуры мы будем использовать "Холодильники", введём 2 документа "приходная накладная"//infostart.ru/upload/iblock/c63/3.JPG
Теперь создаём форму для документа "приходная накладная" и в контейнеры "Командный интерфес" в разделе "Перейти" укажем галочку "видимость" у регистра "остатки номенклатуры".
Далее создадим команду и назовём её "ОткрытьОтчет" //infostart.ru/upload/iblock/5d9/1.JPG и установим действие для данной команды.
После этого сгенерируем событие "УстановитьДействие" команды и получим в модуле формы процедуру:
&НаКлиенте
Процедура ОткрытьОтчет(Команда)
КонецПроцедуры
Нам нужно обратиться к процедуре, которая открывает форму отчета. Ищем по индексу в синтакс-помощнике данную процедуру (на самом деле это функция) и находим следующее //infostart.ru/upload/iblock/855/4.JPG. Про первый параметр - понятно, мы обращаемся к имени формы -обязательный параметр, а вот нас интересует параметр №2 "Параметры".
В клиентской процедуре мы попробуем открыть данный отчет без параметра №2:
&НаКлиенте
Процедура ОткрытьОтчет(Команда)
ОткрытьФорму("Отчет.ОстаткиНоменклатуры.Форма");
КонецПроцедуры
Теперь давайте поработаем с параметром "Параметры".
Найдём в синтакс помощнике на закладке "Содержание" раздел "Интерфейс(управляемый)" - "управляемаяФорма" - "РасширениеОтчета" и если мы раскроем данную веточку, то как раз и увидим наши "Параметры" //infostart.ru/upload/iblock/1f9/5.JPG.
Давайте поработаем с параметром "СформироватьПриОткрытии", мы видим, что это тип данных булево. Логично, что отчет при открытии формы будет формироваться сразу. Так как параметры - это структура, то создадим новую структуру. То есть процедура примет следующий вид:
&НаКлиенте
Процедура ОткрытьОтчет(Команда)
ПараметрыФормы = Новый Структура();
ПараметрыФормы.Вставить("СформироватьПриОткрытии", Истина);
ОткрытьФорму("Отчет.ОстаткиНоменклатуры.Форма", ПараметрыФормы);
КонецПроцедуры
В итоге отчет сразу формируется, как мы и ожидали. По всем товарам за весь период. Да, это хорошо, но я не думаю, что будет интересен отчет по всем товарам, обычно интересует, например товар, на котором мы спозиционированы. Для того, чтобы отфильтровать данные используется Параметр формы отчета "Отбор" который "...используется для установки отбора и параметров данных в форме отчета" (фраза из синтакс-помощника) .То есть это тоже структура.
Ну давайте попробуем сформировать отчет по активному товару. Код процедуры примет вид:
&НаКлиенте
Процедура ОткрытьОтчет(Команда)
ТекДанные= Элементы.СписокНоменклатуры.ТекущиеДанные; //Получаем текущую позицию
Отбор = Новый Структура(); //Создаём отбор
Отбор.Вставить("Номенклатура", ТекДанные.Номенклатура); //По полю "Номенклатура" в отчете, а в значение отбора передаём текущую номенклатуру
ПараметрыФормы = Новый Структура();
ПараметрыФормы.Вставить("СформироватьПриОткрытии", Истина);
ПараметрыФормы.Вставить("Отбор", Отбор); //Вставляем наш параметр
ОткрытьФорму("Отчет.ОстаткиНоменклатуры.Форма", ПараметрыФормы);
КонецПроцедуры
//infostart.ru/upload/iblock/17a/6.JPG
И если мы попробуем изменить вариант в пользовательском режиме, то на закладке "Отбор" - не будет отбора по номенклатуре. Теперь давайте поработаем с периодом. Как известно, период - это параметр данных отчета, согласно синтакс-помощника " Отбор используется для установки отбора и параметров данных в форме отчета". То есть попробуем сформировать отчет с анализом остатков номенклатуры на дату документа. Добавим в отбор наш период:
&НаКлиенте
Процедура ОткрытьОтчет(Команда)
ТекДанные= Элементы.СписокНоменклатуры.ТекущиеДанные;
Отбор = Новый Структура();
Отбор.Вставить("Номенклатура", ТекДанные.Номенклатура);
Отбор.Вставить("Период", Объект.Дата);
ПараметрыФормы = Новый Структура();
ПараметрыФормы.Вставить("Отбор", Отбор);
ПараметрыФормы.Вставить("СформироватьПриОткрытии", Истина);
ОткрытьФорму("Отчет.ОстаткиНоменклатуры.Форма", ПараметрыФормы);
КонецПроцедуры
Отчет также формируется и остаток проверяется на момент не включая время записи нашего документа - будем считать это то, что нам нужно.
Теперь давайте попробуем сформировать отчет по всем товарам в документе, то есть отбор должен накладываться на все товары.
Можно конечно обходить элементы формы, но, я считаю, это не очень оптимально, мы создадим функцию и обратимся запросом к базе данных, выгрузим результат запроса в Таблицу значений и загрузим колонку "Номенклатура" в массив.
В итоге получился код:
&НаКлиенте
Процедура ОткрытьОтчет(Команда)
СписокНоменклатуры = СформироватьОтборПоТоварам(Объект.Ссылка);
//ТекДанные= Элементы.СписокНоменклатуры.ТекущиеДанные;
Отбор = Новый Структура();
Отбор.Вставить("Номенклатура", СписокНоменклатуры);
Отбор.Вставить("Период", Объект.Дата);
ПараметрыФормы = Новый Структура();
ПараметрыФормы.Вставить("Отбор", Отбор);
ПараметрыФормы.Вставить("СформироватьПриОткрытии", Истина);
ОткрытьФорму("Отчет.ОстаткиНоменклатуры.Форма", ПараметрыФормы);
КонецПроцедуры
&НаСервереБезКонтекста
Функция СформироватьОтборПоТоварам(Ссылка)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПриходнаяНакладнаяСписокНоменклатуры.Номенклатура
|ИЗ
| Документ.ПриходнаяНакладная.СписокНоменклатуры КАК ПриходнаяНакладнаяСписокНоменклатуры
|ГДЕ
| ПриходнаяНакладнаяСписокНоменклатуры.Ссылка = &Ссылка";
Запрос.УстановитьПараметр("Ссылка", Ссылка);
Результат = Запрос.Выполнить();
Таблица = результат.Выгрузить();
Массив = Таблица.ВыгрузитьКолонку("Номенклатура");
Возврат Массив;
КонецФункции
Передадим полученный список в структуру "ПараметрыФормы". И если мы обратимся к синтакс-помощнику (расширение отчета), то увидим Параметр Формы "Отбор" фразу внизу: "..Если значение является массивом или списком значений с не одним элементом, то отбор будет применяться с видом сравнения ВСписке".
То есть нам больше ничего делать не надо! Таким образом у нас формируется отчет по всем товарам в документе за период документа , а если таковых не будет, то они не отображаются //infostart.ru/upload/iblock/3fd/7.JPG.
В итоге мы немного поработали с параметром формы отчета "Отбор". Увидели несколько приемов по его использованию. На самом деле аналогичные отборы можно накладывать не только на форму отчета и пользователь не будет видеть данную настройку отбора, иногда это является плюсом.