Расширение управляемой формы для отчета. Несколько действий с параметром "Отбор".



Статья о том как открывать формы отчетов с параметром "Отбор" (платформа, на которой проводилось тестирование- 8.2.16).

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

Если мы откроем синтакс-помощник и введём на закладке «Индекс» слово «УправляемаяФорма», то увидим в разделе её свойств свойство «Параметры». Если перейти по гиперссылке к описанию свойства получим следующий текст:

УправляемаяФорма (ManagedForm)
Параметры (Parameters)

Использование:

Только чтение.

Описание:

Тип: ДанныеФормыСтруктура.
Содержит коллекцию параметров формы.

Доступность:

Тонкий клиент, веб-клиент, сервер, толстый клиент.

Таким образом у всех управляемых форм есть параметры. Но мы рассмотрим наиболее частое их применение (с моей точки зрения) — это открытие отчетов. Для тестирования была взята каркасная конфигурация для подготовки к экзамену «Специалист» по платформе(оф. сайт 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.

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

10 Comments

  1. bulpi

    Небольшое замечание (из вредности) :

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

    Reply
  2. olches

    Спасибо, учту, но условие наложения фильтра на вхождение номенклатуры всё равно применяется «ВСписке» а не «ВМассиве» =).

    Reply
  3. alexware

    Ну не знаю… Это есть во всех книгах, которые начинающие обязаны изучить.

    Reply
  4. Saipl

    Задача 5.8. подготовки на спеца по платформе !

    Reply
  5. Масянька

    Да ладно, человек старался писал….я из вредности поставлю «+», труд должен быть вознагражден!!!

    Reply
  6. olches

    Данная статья как-раз таки и освещает то, как решать подобные задачи с использованием параметров формы, я даже и каркасную конфигурацию взял для подготовки к аттестации на 1с-специалист!Saipl, верно подметил!Что касается спора массив-список, то необходимо не по наименованию работать с переменной, а по её типу данных-это основное понятие в конфигурировании 1С. И разработчик, который начинает знакомится с платформой, в первую очередь должен уяснить, что такое тип данных и как с ним работать, то есть первоначально хотя бы научиться работать с отладчиком (здесь же функция возвращает массив, а как начинающий поймёт, что это не СписокЗначений?). В типовых и не так назовут массив =)

    Reply
  7. klel

    Интересная статья для изучения =)

    Reply
  8. ziminavava

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

    Reply
  9. olches

    (8) ziminavava, это и имелось ввиду, согласен!

    Reply
  10. andogskiy

    Написано красиво, но у меня почему-то отбор совсем не работает…

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *