gifts2017

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

Опубликовал Олег Чеснаков (olches) в раздел Программирование - Практика программирования

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

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

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

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

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

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

Описание:

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

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

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

Таким образом у всех управляемых форм есть параметры. Но мы рассмотрим наиболее частое их применение (с моей точки зрения) - это открытие отчетов. Для тестирования была взята каркасная конфигурация для подготовки к экзамену "Специалист" по платформе(оф. сайт 1с: http://www.1c.ru/rus/partners/training/questions.htm).

Конструктором движений сформируем движения по регистру "ОстаткиНоменклатуры" для документа "ПриходнаяНакладная", создадим обычный отчет с использованием данного регистра накопления, назовём его "ОстаткиНоменклатуры". В пользовательском режиме отчеты по умолчанию помещаются в панель "Сервис", поэтому от регистра накопления мы его отличим всегда. В конструкторе запроса будем использовать виртуальную таблицу "ОстаткиНоменклатуры.Остатки" и выберем все 2 поля данного регистра: http://infostart.ru/upload/iblock/9f8/2.JPG. На закладке условия наложем фильтр по ссылке на текущий документ.

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

В пользовательском режиме из номенклатуры мы будем использовать "Холодильники", введём 2 документа "приходная накладная"http://infostart.ru/upload/iblock/c63/3.JPG

Теперь создаём форму для документа "приходная накладная" и в контейнеры "Командный интерфес" в разделе "Перейти" укажем  галочку "видимость" у регистра "остатки номенклатуры".

Далее создадим команду и назовём её "ОткрытьОтчет" http://infostart.ru/upload/iblock/5d9/1.JPG и установим действие для данной команды.

После этого сгенерируем событие "УстановитьДействие" команды и получим в модуле формы процедуру:

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

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

Нам нужно обратиться к процедуре, которая открывает форму отчета. Ищем по индексу в синтакс-помощнике данную процедуру (на самом деле это функция) и находим следующее http://infostart.ru/upload/iblock/855/4.JPG. Про первый параметр - понятно, мы обращаемся к имени формы -обязательный параметр, а вот нас интересует параметр №2 "Параметры".

В клиентской процедуре мы попробуем открыть данный отчет без параметра №2:

&НаКлиенте
Процедура ОткрытьОтчет(Команда)
    ОткрытьФорму("Отчет.ОстаткиНоменклатуры.Форма");  
КонецПроцедуры

Теперь давайте поработаем с параметром "Параметры".

Найдём в синтакс помощнике на закладке "Содержание" раздел "Интерфейс(управляемый)" - "управляемаяФорма" - "РасширениеОтчета" и если мы раскроем данную веточку, то как раз и увидим наши "Параметры" http://infostart.ru/upload/iblock/1f9/5.JPG.

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

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

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

Ну давайте попробуем сформировать отчет по активному товару. Код процедуры примет вид:

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

 http://infostart.ru/upload/iblock/17a/6.JPG

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

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

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

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

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

В итоге получился код:

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

&НаСервереБезКонтекста
Функция СформироватьОтборПоТоварам(Ссылка)
 
 Запрос = Новый Запрос;
 Запрос.Текст =
  "ВЫБРАТЬ
  | ПриходнаяНакладнаяСписокНоменклатуры.Номенклатура
  |ИЗ
  | Документ.ПриходнаяНакладная.СписокНоменклатуры КАК ПриходнаяНакладнаяСписокНоменклатуры
  |ГДЕ
  | ПриходнаяНакладнаяСписокНоменклатуры.Ссылка = &Ссылка";

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

 Результат = Запрос.Выполнить();

 Таблица = результат.Выгрузить();
 
    Массив = Таблица.ВыгрузитьКолонку("Номенклатура");
 
 Возврат Массив;  
 
КонецФункции

Передадим полученный список в структуру "ПараметрыФормы". И если мы обратимся к синтакс-помощнику (расширение отчета), то увидим Параметр Формы  "Отбор" фразу внизу: "..Если значение является массивом или списком значений с не одним элементом, то отбор будет применяться с видом сравнения ВСписке".

То есть нам больше ничего делать не надо! Таким образом у нас формируется отчет по всем товарам в документе за период документа , а если таковых не будет, то они не отображаются http://infostart.ru/upload/iblock/3fd/7.JPG.

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

Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
Выгрузка итоговой ИБ
.dt 147,64Kb
02.10.12
45
.dt 147,64Kb 45 Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. bulpi bulpi (bulpi) 03.10.12 12:36
Небольшое замечание (из вредности) :
Если функция СформироватьОтборПоТоварам возвращает Массив, то и переменную нужно назвать не СписокНоменклатуры, а МассивНоменклатуры. Иначе ты вводишь в заблуждение следующих читателей программного текста.
2. Олег Чеснаков (olches) 03.10.12 13:03
Спасибо, учту, но условие наложения фильтра на вхождение номенклатуры всё равно применяется "ВСписке" а не "ВМассиве" =).
3. Алексей Верещагин (alexware) 03.10.12 18:48
Ну не знаю... Это есть во всех книгах, которые начинающие обязаны изучить.
4. Makc Saipl (Saipl) 05.10.12 07:14
Задача 5.8. подготовки на спеца по платформе !
5. Татьяна Беляева (Масянька) 05.10.12 14:21
Да ладно, человек старался писал....я из вредности поставлю "+", труд должен быть вознагражден!!!
6. Олег Чеснаков (olches) 05.10.12 15:37
Данная статья как-раз таки и освещает то, как решать подобные задачи с использованием параметров формы, я даже и каркасную конфигурацию взял для подготовки к аттестации на 1с-специалист!Saipl, верно подметил!Что касается спора массив-список, то необходимо не по наименованию работать с переменной, а по её типу данных-это основное понятие в конфигурировании 1С. И разработчик, который начинает знакомится с платформой, в первую очередь должен уяснить, что такое тип данных и как с ним работать, то есть первоначально хотя бы научиться работать с отладчиком (здесь же функция возвращает массив, а как начинающий поймёт, что это не СписокЗначений?). В типовых и не так назовут массив =)
7. Dimon (klel) 11.10.12 20:39
Интересная статья для изучения =)
8. Валентина Зимина (ziminavava) 12.10.12 11:13
Фраза "то на закладке "Отбор" - не будет отбора по номенклатуре" не точна.Задать отбор при изменении варианта настроек возможно, но при исполнении будет выдана ошибка.
Рамзес; +1 Ответить 1
9. Олег Чеснаков (olches) 12.10.12 13:46
(8) ziminavava, это и имелось ввиду, согласен!
10. Сергей Смирнов (andogskiy) 29.04.14 08:29
Написано красиво, но у меня почему-то отбор совсем не работает...
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа