В конфирации Бухгалтерия предприятия 3.0 создаются 2 варианта внешнего отчета, выводящего следующие поля справочника Номенклатура:
В первом вариате используются отборы по номенклатурной группе и виду номенклатуры. Результат представлен на рис. 1.
Рис. 1. Результат с отбором
Во втором вариате данные выводятся с группировками по номенклатурной группе и виду номенклатуры. Результат представлен на рис. 2.
Рис. 2. Результат с группировками
В обоих случаях используется схема компоновки данных. В первом случаен вдобавок употребляется макет Номенклатура (рис. 3).
Рис. 3. Состав первого варианта отчета Номенклатура
В обоих вариантах не выводятся записи-группы справочника Номенклатура. Так же не показывается номенклатура, для которой не указана номенклатурная группа. Эти условия записываются рассматриваемым ниже конструктором запроса следующим образом:
ГДЕ
Номенклатура.ЭтоГруппа = ЛОЖЬ
И Номенклатура.НоменклатурнаяГруппа.Ссылка <> &ПустаяСсылка
В конструкторе отчета (см. рис. 3) добавим макет типа "Табличный документ" и дадим макету имя Номенклатура (рис. 4).
Рис. 4. Добавление макета отчета
Далее сформируем макет, используя приведенные на рис. 5 сведения.
Рис. 5. Макет отчета
Для вывода заголовка и отборов используем заполнение Шаблон. В строке отчета – заполнение Параметр. Для каждого параметра строки установим в окне свойств значение поля Параметр расшифровки такое же, как и значение поля Параметр (рис. 6).
Рис. 6. Параметр НоменклатурнаяГруппа
Это позволит открывать в отчете форму соответствующего справочника с данными об интересующем элементе (если Результат.Защита = Истина;).
Имена параметров совпадают с именами полей (псевдонимов) текста запроса, сформированного в ниже расматриваемой схеме компоновки данных.
Схема компоновки данных в первом варианте отчета используется для формирования следующего запроса к справочнику Номенклатура (приводится вариант с одним псевдонимом):
ВЫБРАТЬ
НоменклатурнаяГруппа, ВидНоменклатуры, Ссылка КАК НоменклатураСсылка, НомерГТД
ИЗ
Справочник.Номенклатура
ГДЕ
ЭтоГруппа = ЛОЖЬ
И НоменклатурнаяГруппа.Ссылка <> &ПустаяСсылка
Так же нужно задать отборы по номенклатурной группе и виду номенклатуры и установить сортировку по номенклатурной группе, виду номенклатуры и номенклатуре.
Значения отборов по номенклатурной группе и виду номенклатуры задаются в форме отчета.
Воспользуемся в конструкторе отчета (см. рис. 3) кнопкой "Открыть схему комопоновки данных" и добавим в отчет эту схему (рис. 7).
Рис. 7. Добавление схемы компоновки данных
В открывшейся схеме на вкладке "Наборы данных" добавим набор данных Запрос (ему дано имя НаборДанных) (рис. 8).
Рис. 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");
Результат.Вывести(ОбластьЗаголовокТаблицы);
//
// Перенос таблицы значений в табличный документ
ОбластьСтрокаОтчета = макет.ПолучитьОбласть("Строка");
для каждого стр из тз цикл
ОбластьСтрокаОтчета.Параметры.Заполнить(стр);
Результат.Вывести(ОбластьСтрокаОтчета);
конецЦикла;
Результат.АвтоМасштаб = Истина;
Результат.Защита = Истина;
Результат.ОриентацияСтраницы = ОриентацияСтраницы.Портрет;
возврат тз.количество();
конецФункции