Список работ

1С:Предприятие 8.3. Простой отчет с компоновкой данных

Содержание

Постановка задачи

В конфирации Бухгалтерия предприятия 3.0 создаются 2 варианта внешнего отчета, выводящего следующие поля справочника Номенклатура:

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

Результат с отбором

Рис. 1. Результат с отбором

Во втором вариате данные выводятся с группировками по номенклатурной группе и виду номенклатуры. Результат представлен на рис. 2.

Результат с группировками

Рис. 2. Результат с группировками

В обоих случаях используется схема компоновки данных. В первом случаен вдобавок употребляется макет Номенклатура (рис. 3).

Состав отчета Номенклатура

Рис. 3. Состав первого варианта отчета Номенклатура

В обоих вариантах не выводятся записи-группы справочника Номенклатура. Так же не показывается номенклатура, для которой не указана номенклатурная группа. Эти условия записываются рассматриваемым ниже конструктором запроса следующим образом:

ГДЕ
  Номенклатура.ЭтоГруппа = ЛОЖЬ
  И Номенклатура.НоменклатурнаяГруппа.Ссылка <> &ПустаяСсылка

Отчет с отборами

Макет отчета

В конструкторе отчета (см. рис. 3) добавим макет типа "Табличный документ" и дадим макету имя Номенклатура (рис. 4).

Добавляем макет отчета

Рис. 4. Добавление макета отчета

Далее сформируем макет, используя приведенные на рис. 5 сведения.

Макет отчета

Рис. 5. Макет отчета

Для вывода заголовка и отборов используем заполнение Шаблон. В строке отчета – заполнение Параметр. Для каждого параметра строки установим в окне свойств значение поля Параметр расшифровки такое же, как и значение поля Параметр (рис. 6).

 Параметр НоменклатурнаяГруппа

Рис. 6. Параметр НоменклатурнаяГруппа

Это позволит открывать в отчете форму соответствующего справочника с данными об интересующем элементе (если Результат.Защита = Истина;).

Имена параметров совпадают с именами полей (псевдонимов) текста запроса, сформированного в ниже расматриваемой схеме компоновки данных.

Схема компоновки данных

Схема компоновки данных в первом варианте отчета используется для формирования следующего запроса к справочнику Номенклатура (приводится вариант с одним псевдонимом):

ВЫБРАТЬ
  НоменклатурнаяГруппа, ВидНоменклатуры, Ссылка КАК НоменклатураСсылка, НомерГТД
ИЗ
  Справочник.Номенклатура
ГДЕ
  ЭтоГруппа = ЛОЖЬ
  И НоменклатурнаяГруппа.Ссылка <> &ПустаяСсылка

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

Воспользуемся в конструкторе отчета (см. рис. 3) кнопкой "Открыть схему комопоновки данных" и добавим в отчет эту схему (рис. 7).

Основная схема компоновки данных

Рис. 7. Добавление схемы компоновки данных

В открывшейся схеме на вкладке "Наборы данных" добавим набор данных Запрос (ему дано имя НаборДанных) (рис. 8).

Схема компоновки данных (этап 1)

Рис. 8. Создание набора данных

Затем на той же вкладке нажимается кнопка Конструктор запроса и в открывшемся диалоге на вкладке Таблицы в ветви Справочники списка База данных выбирается справочник Номенклатура и в списке Таблицы выбираются поля НоменклатурнаяГруппа, ВидНоменклатуры, Ссылка и НомерГТД (рис. 9).

Поля запроса

Рис. 9. Выбор полей запроса

На вкладке Условия вводим указанные на рис. 10 данные.

Условия запроса

Рис. 10. Условия запроса

Заметим, что для задания первого условия установлен флажок Произвольное.

В результате после выхода из конструктора запроса получаем приведенный на рис. 11 текст запроса.

Запрос к справочнику Номенклатура

Рис. 11. После выхода из конструктора запроса

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

Заметим, что в строке запроса

Номенклатура.Ссылка КАК НоменклатураСсылка

псевдоним НоменклатураСсылка поля Ссылка добавлен вручную.

На вкладе Параметры создаваемой схемы компоновки данных после выхода из конструктора запроса появятся на показанные рис. 12 сведения.

Конструктор запроса закрыт

Рис. 12. После выхода из конструктора запроса

Этот параметр присутствует в условии

НоменклатурнаяГруппа.Ссылка <> &ПустаяСсылка.

Заметим, что значение Справочник.НоменклатурныеГруппы.ПустаяСсылка() параметра добавлено вручную. Хотя в данном случае это значение можно было бы и не определять - пустое значение в нашем случае эквивалентно пустой ссылке.

На вкладке Настройки в ветви Отчет мы добавляем новую группировку, но значение Поле в диалоге, показанном на рис. 13, оставляем пустым.

Детальные записи отчета

Рис. 13. Детальные записи

Это означает переход к детальным записям (в первом варианте группировки отсутствуют).

В нижеследующей группе Настройки выбираем поле Отчет и на вкладке Выбранные поля перечисляем выводимые в Результат (табличный документ) данные (рис. 14).

Поля отчета

Рис. 14. Поля отчета

На вкладке Отбор формируем отборы в сооответствии с рис. 15 (по-прежнему выбрана настройка Отчет).

Отборы отчета

Рис. 15. Отборы отчета

На вкладке Сортировка указываем поля в сооответствии с рис. 16.

Сортировка данных

Рис. 16. Сортировка данных

Этим и завершаем работу со схемой компоновки данных.

Форма отчета

Форма отчета, открытая в кофигураторе, показана на рис. 17.

Форма отчета

Рис. 17. Форма отчета, открытая в конфигураторе

В свойствах формы указан заголовок Номенклатура и установлен флажок АвтоматическоеСохранениеДанныхВНастройках.

В свойствах группы ОсновнаяКоманднаяПанель в качестве источника команд указан Результат (рис. 18).

Источник команд

Рис. 18. Выбор источника команд

Кнопка Сформировать имеет одноименное действие, отсылающее нас к следующему коду:

&НаКлиенте
Процедура Сформировать(Команда)
  если СформироватьНаСервере() = 0 тогда сообщить("Пусто") конецЕсли;
КонецПроцедуры

&НаСервере
функция СформироватьНаСервере()
  настройки = отчет.КомпоновщикНастроек.Настройки;
  //
  // Установка отбора
  естьОтбор_0 = не номенклатурнаяГруппа.Пустая();
  естьОтбор_1 = не видНоменклатуры.Пустая();
  отбор = настройки.Отбор;
  УстановитьОтбор(естьОтбор_0, отбор, 0, номенклатурнаяГруппа);
  УстановитьОтбор(естьОтбор_1, отбор, 1, видНоменклатуры);
  //
  отчетОбъект = РеквизитФормыВЗначение("Отчет");
  //
  // Вывод заголовка отчета, отборов (если имеются) и заголовка таблицы
  макет = отчетОбъект.получитьМакет("Номенклатура");
  ОбластьЗаголовок = макет.ПолучитьОбласть("Заголовок");  
  ОбластьЗаголовок.Параметры.дата = формат(текущаяДата(), "ДЛФ = Д");
  Результат.Очистить();
  Результат.Вывести(ОбластьЗаголовок);
  если естьОтбор_0 или естьОтбор_1 тогда
    ОбластьОтбор = макет.ПолучитьОбласть("Отбор");
    Результат.Вывести(ОбластьОтбор);
    если естьОтбор_0 тогда
      ОбластьОтбор = макет.ПолучитьОбласть("ОтборНГ");
      ОбластьОтбор.Параметры.номенклатурнаяГруппа = номенклатурнаяГруппа;
      Результат.Вывести(ОбластьОтбор);
    конецЕсли;
    если естьОтбор_1 тогда
      ОбластьОтбор = макет.ПолучитьОбласть("ОтборВН");
      ОбластьОтбор.Параметры.видНоменклатуры = видНоменклатуры;
      Результат.Вывести(ОбластьОтбор);
    конецЕсли;
  конецЕсли;
  ОбластьЗаголовокТаблицы = макет.ПолучитьОбласть("Заголовок2");
  Результат.Вывести(ОбластьЗаголовокТаблицы);
  //
  // Вывод результата запроса в таблицу значений
  скд = отчетОбъект.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
  тп = Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений");
  КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
  МакетКомпоновки = КомпоновщикМакета.Выполнить(скд, настройки, , , тп);
  ПроцессорКомпоновкиДанных = новый ПроцессорКомпоновкиДанных;
  ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки);
  ПроцессорВывода = новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
  тз = Новый ТаблицаЗначений;
  ПроцессорВывода.УстановитьОбъект(тз);
  ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
  //
  // Перенос таблицы значений в табличный документ (Результат)
  ОбластьСтрокаОтчета = макет.ПолучитьОбласть("Строка");
  для каждого стр из тз цикл
    ОбластьСтрокаОтчета.Параметры.Заполнить(стр);
    Результат.Вывести(ОбластьСтрокаОтчета);
  конецЦикла;
  // или
  //прм = ОбластьСтрокаОтчета.параметры;
  //для каждого стр из тз цикл
    //прм.НоменклатурнаяГруппа = стр.НоменклатурнаяГруппа;
    //прм.видНоменклатуры = стр.видНоменклатуры;
    //прм.номенклатураСсылка = стр.номенклатураСсылка;
    //прм.номерГТД = стр.номерГТД;
    //Результат.Вывести(ОбластьСтрокаОтчета);
  //конецЦикла;
  Результат.АвтоМасштаб = Истина;
  Результат.Защита = Истина;
  Результат.ОриентацияСтраницы = ОриентацияСтраницы.Портрет;
  возврат тз.количество();
конецФункции

&НаСервере
Процедура УстановитьОтбор(естьОтбор, отбор, индекс, значениеОтбора)
  отбор.Элементы[индекс].Использование = естьОтбор;
  если естьОтбор тогда
    отбор.Элементы[индекс].ПравоеЗначение = значениеОтбора;
  конецЕсли;
КонецПроцедуры

Кроме того, в модуле формы имеется процедура ПриОткрытии, призванная для формирования отчета при его открытии и подавления предупреждения о том, что отчет не сформирован (рис. 19). Отчет не сформирован

Рис. 19. Отчет не сформирован

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

Элементы формы отчета НоменклатурнаяГруппа и ВидНоменклатуры имеют обработчик события ПриИзменении, вызывающий процедуру Сформировать (на клиенте). Обработчик задается в группе События окна редактирования свойств элемента (рис. 20)

Обработчик события ПриИзменении

Рис. 20. Обработчик события ПриИзменении элемента НоменклатурнаяГруппа

Заметим, что значение параметра отчета можно установить следующим образом:

  настройки = отчет.КомпоновщикНастроек.Настройки;
  //
  // Параметр запроса
  настройки.ПараметрыДанных.Элементы[0].Значение = справочники.НоменклатурныеГруппы.ПустаяСсылка();

Отчет с группировками

Схема компоновки данных

В этом варианте отчета результат получается автоматически по схеме компоновке данных без единой строчки кода (используется Автозаполнение).
Текст запроса такой же, как и в первом вариане, но используется автозаголовок Номенклатура для поля НоменклатураСсылка (рис. 21).

Набор данных

Рис. 21. Употребляются Автозаполнение и Автозаголовок

Второе отличие схемы компоновки данных от прежнего варианта находим на вкладке Настройки (рис. 22).

Вкладка Настройки

Рис. 22. Вкладка Настройки с двумя группировками

Для группировок используется Автосортировка (возрастающая по алфавиту). В детальных записях задана возрастающая сортировка по полю НоменклатураСсылка, то есть по Наименованию (рис. 23).

Сортировка детальных записей

Рис. 23. Сортировка детальных записей

Форма отчета с группировками

Форму отчета с результатом можно посмотреть на рис. 2. Форма, открытая в конфигураторе, показана на рис. 24.

Вкладка Реквизиты

Рис. 24. Форма отчет. Вкладка Реквизиты

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

В свойствах группы ОсновнаяКоманднаяПанель в качестве источника команд указана Форма (рис. 25).

Форма как источник команд

Рис. 25. Источником команд является форма

Вкладки Реквизиты (см. рис. 24), Команды и Параметры не модифицируются (две последние пусты).
В модуле формы нет ни единой строчки кода.
Результат (см. рис. 2) получается после нажатия на кнопку Сформировать.

Заключение

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

&НаКлиенте
Процедура ПриОткрытии(Отказ)
  // Формируем отчет при его открытии
  сформировать("");
КонецПроцедуры

&НаКлиенте
Процедура Сформировать(Команда)
  если СформироватьНаСервере() = 0 тогда сообщить("Пусто") конецЕсли;
КонецПроцедуры

&НаСервере
функция СформироватьНаСервере()
  запрос = новый запрос;
  текстЗапроса = "ВЫБРАТЬ НоменклатурнаяГруппа, ВидНоменклатуры, Ссылка КАК НоменклатураСсылка, НомерГТД
  | ИЗ Справочник.Номенклатура
  | ГДЕ ЭтоГруппа = ЛОЖЬ";
  естьОтбор_0 = не номенклатурнаяГруппа.Пустая();
  естьОтбор_1 = не видНоменклатуры.Пустая();
  если естьОтбор_0 тогда
    текстЗапроса = текстЗапроса + " И НоменклатурнаяГруппа = &НоменклатурнаяГруппа"
  иначе
    текстЗапроса = текстЗапроса + " И НоменклатурнаяГруппа <>> &ПустаяСсылка"
  конецЕсли;
  если естьОтбор_1 тогда
    текстЗапроса = текстЗапроса + " И ВидНоменклатуры = &ВидНоменклатуры"
  конецЕсли;
  запрос.Текст = текстЗапроса;
  запрос.УстановитьПараметр("ПустаяСсылка", справочники.НоменклатурныеГруппы.ПустаяСсылка());
  запрос.УстановитьПараметр("НоменклатурнаяГруппа", НоменклатурнаяГруппа);
  запрос.УстановитьПараметр("ВидНоменклатуры", ВидНоменклатуры);
  результатЗапроса = запрос.Выполнить();
  //
  // Передаем результаты запроса в таблицу значений
  тз = результатЗапроса.Выгрузить();
  тз.сортировать("НоменклатурнаяГруппа, ВидНоменклатуры, НоменклатураСсылка");
  // Вывод заголовка отчета, отборов (если имеются) и заголовка таблицы
  отчетОбъект = РеквизитФормыВЗначение("Отчет");
  макет = отчетОбъект.получитьМакет("Номенклатура");
  ОбластьЗаголовок = макет.ПолучитьОбласть("Заголовок");  
  ОбластьЗаголовок.Параметры.дата = формат(текущаяДата(), "ДЛФ = Д");
  Результат.Очистить();
  Результат.Вывести(ОбластьЗаголовок);
  если естьОтбор_0 или естьОтбор_1 тогда
    ОбластьОтбор = макет.ПолучитьОбласть("Отбор");
    Результат.Вывести(ОбластьОтбор);
    если естьОтбор_0 тогда
      ОбластьОтбор = макет.ПолучитьОбласть("ОтборНГ");
      ОбластьОтбор.Параметры.номенклатурнаяГруппа = номенклатурнаяГруппа;
      Результат.Вывести(ОбластьОтбор);
    конецЕсли;
    если естьОтбор_1 тогда
      ОбластьОтбор = макет.ПолучитьОбласть("ОтборВН");
      ОбластьОтбор.Параметры.видНоменклатуры = видНоменклатуры;
      Результат.Вывести(ОбластьОтбор);
    конецЕсли;
  конецЕсли;
  ОбластьЗаголовокТаблицы = макет.ПолучитьОбласть("Заголовок2");
  Результат.Вывести(ОбластьЗаголовокТаблицы);
  //
  // Перенос таблицы значений в табличный документ
  ОбластьСтрокаОтчета = макет.ПолучитьОбласть("Строка");
  для каждого стр из тз цикл
    ОбластьСтрокаОтчета.Параметры.Заполнить(стр);
    Результат.Вывести(ОбластьСтрокаОтчета);
  конецЦикла;
  Результат.АвтоМасштаб = Истина;
  Результат.Защита = Истина;
  Результат.ОриентацияСтраницы = ОриентацияСтраницы.Портрет;
  возврат тз.количество();
конецФункции

Литература

  1. Синтаксис-помощник 1С:Предприятие.

Список работ

Рейтинг@Mail.ru