Начинающие разработчики иногда не совсем верно понимают предназначения параметров управляемых форм. В данной статье я предприму попытку наглядно показать и объяснить для чего нужно данное свойство.
Если мы откроем синтакс-помощник и введём на закладке «Индекс» слово «УправляемаяФорма», то увидим в разделе её свойств свойство «Параметры». Если перейти по гиперссылке к описанию свойства получим следующий текст:
Использование:
Только чтение.
Описание:
Тип: ДанныеФормыСтруктура.
Содержит коллекцию параметров формы.
Доступность:
Тонкий клиент, веб-клиент, сервер, толстый клиент.
Таким образом у всех управляемых форм есть параметры. Но мы рассмотрим наиболее частое их применение (с моей точки зрения) — это открытие отчетов. Для тестирования была взята каркасная конфигурация для подготовки к экзамену «Специалист» по платформе(оф. сайт 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.
В итоге мы немного поработали с параметром формы отчета «Отбор». Увидели несколько приемов по его использованию. На самом деле аналогичные отборы можно накладывать не только на форму отчета и пользователь не будет видеть данную настройку отбора, иногда это является плюсом.




Небольшое замечание (из вредности) :
Если функция СформироватьОтборПоТоварам возвращает Массив, то и переменную нужно назвать не СписокНоменклатуры, а МассивНоменклатуры. Иначе ты вводишь в заблуждение следующих читателей программного текста.
Спасибо, учту, но условие наложения фильтра на вхождение номенклатуры всё равно применяется «ВСписке» а не «ВМассиве» =).
Ну не знаю… Это есть во всех книгах, которые начинающие обязаны изучить.
Задача 5.8. подготовки на спеца по платформе !
Да ладно, человек старался писал….я из вредности поставлю «+», труд должен быть вознагражден!!!
Данная статья как-раз таки и освещает то, как решать подобные задачи с использованием параметров формы, я даже и каркасную конфигурацию взял для подготовки к аттестации на 1с-специалист!Saipl, верно подметил!Что касается спора массив-список, то необходимо не по наименованию работать с переменной, а по её типу данных-это основное понятие в конфигурировании 1С. И разработчик, который начинает знакомится с платформой, в первую очередь должен уяснить, что такое тип данных и как с ним работать, то есть первоначально хотя бы научиться работать с отладчиком (здесь же функция возвращает массив, а как начинающий поймёт, что это не СписокЗначений?). В типовых и не так назовут массив =)
Интересная статья для изучения =)
Фраза «то на закладке «Отбор» — не будет отбора по номенклатуре» не точна.Задать отбор при изменении варианта настроек возможно, но при исполнении будет выдана ошибка.
(8) ziminavava, это и имелось ввиду, согласен!
Написано красиво, но у меня почему-то отбор совсем не работает…