Особенности создания отчетов (1Cv8). Как сделать отчет с разворотом по колонкам

Однажды, когда делал новый документ, столкнулся с необходимостью сделать к документу несколько печатных форм. Причем пользователи не могли точно сказать как данные должны быть сгруппированы в печатной форме. Была противоречивая информация. Часть пользователей хотела группировать по одним реквизитам, часть по другим. То есть в перспективе вырисовывалась необходимость создания порядка шести различных макетов для вывода на печать, что не устраивало меня. В итоге решение было найдено — вывод на печать документа с использованием схемы компоновки данных. В документ был добавлен макет с типом «Схема компоновки данных», а также форма с настройками СКД. Собственно в настройках было только поле, где отображалось дерево с группировками СКД (КомпоновщикНастроек.Настройки). То есть по нажатию на кнопку «Печать» у пользователя автоматом раскрывалось окошко с предустановлеными (наиболее часто используемыми) настройками группировки. И при необходимости он сам мог задать группировки в разрезе нужных ему реквизитов. Ну и далее происходила непосредственно печать с учетом настроек заданных пользователем. В технические детали вдаваться не буду. Главное, что хотелось донести — это сама идея.

2 комментария на «“Использование СКД для печати документов”»

    Мои пользователи справлялись. Правда это были не бухгалтера, а управляющие подразделениями компании. Ну плюс инструкция была написана. А понимания «кто-такие» документы, справочники, регистры и т.д. от них не требовалось, т.к. печать вызывалась непосредственно из диалогового окна документа по нажатию на стандартную кнопку «Печать»

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

Рассмотрим свойства и методы табличного документа, относящиеся к настройкам печати (в приведенных примерах «ТабДок» это объект типа «Табличный документ»).

Свойство «ИмяПринтера» позволяет задать для печати принтер, отличный от установленного по умолчанию. Имя должно совпадать с именем принтера, заданным в системе:

ТабДок.ИмяПринтера="Canon iR1133";

При печати пакета документов можно сэкономить время, установив признак разбора по копиям:

ТабДок.РазборПоКопиям=Истина;

Число копий можно указать так:

ТабДок.КоличествоЭкземпляров=5;

Разумеется, можно задать поля:

ТабДок.ПолеСлева=20;//Поле слева 20мм, остальные поля 10мм (по умолчанию)

Еще несколько свойств страницы:

ТабДок.ОриентацияСтраницы=ОриентацияСтраницы.Ландшафт; ТабДок.ЭкземпляровНаСтранице=2; //на листе будет размещено 2 страницы ТабДок.Автомасштаб=истина; //аналогично настройкам масштаба «по ширине страницы»

При необходимости можно указать конкретное значение масштабирования в процентах (свойство «МасштабПечати» ).

Свойство «РазмерСтраницы» позволяет задать стандартные форматы страницы – “A3”, “A4”, “A5” (полный список вариантов доступен в справке 1С).

ТабДок.РазмерСтраницы="A3";// буква А должна быть английской

Для нестандартного размера бумаги (Custom) можно указать значения высоты и ширины страницы (в мм):

ТабДок.РазмерСтраницы="Custom";//нестандартный размер ТабДок.ВысотаСтраницы=350; ТабДок.ШиринаСтраницы=350;

Также в табличном документе доступно управление выводом колонтитулов и их содержимым. Для этого служат свойства«ВерхнийКолонтитул» и «НижнийКолонтитул». Например:

ТабДок.ВерхнийКолонтитул.Выводить=истина; //будет напечатан верхний колонтитул ТабДок.РазмерКолонтитулаСверху=7; //размер колонтитула 7мм (по умолчанию 10мм) ТабДок.ВерхнийКолонтитул.ВертикальноеПоложение=ВертикальноеПоложение.Верх; ТабДок.ВерхнийКолонтитул.НачальнаяСтраница=2;//колонтитул выводится со второй страницы ШрифтКолонтитула=Новый Шрифт("Courier New", 8,Истина); ТабДок.ВерхнийКолонтитул.Шрифт=ШрифтКолонтитула; //наклонный шрифт ТабДок.ВерхнийКолонтитул.ТекстВЦентре="Верхний колонтитул"; ТабДок.ВерхнийКолонтитул.ТекстСправа="Стр.[&НомерСтраницы] из [&СтраницВсего]"; //нумерация страниц ТабДок.ВерхнийКолонтитул.ТекстСлева="[&Дата]";//текущая дата

Сформированный документ отправляется на печать с помощью метода «Напечатать()». Возможно два варианта вызова.

1) Непосредственно на принтер:

ТабДок.Напечатать(РежимИспользованияДиалогаПечати.НеИспользовать); ТабДок.Напечатать(истина);

2) Перед печатью будет выведен диалог печати:

ТабДок.Напечатать(РежимИспользованияДиалогаПечати.Использовать); ТабДок.Напечатать(ложь);

Кроме того можно управлять и разбиением документа на страницы. Оценить количество страниц в документе по настройкам текущего принтера можно так:

ТабДок.КоличествоСтраниц();

С помощью методов «ПроверитьВывод()» и «ПроверитьПрисоединение()» можно определить, умещается ли табличный документ или массив областей табличного документа на странице в высоту и в ширину при текущих настройках принтера.

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

Принудительно вставить разрывы страниц позволяют методы «ВывестиВертикальныйРазделительСтраниц()» и «ВывестиГоризонтальныйРазделительСтраниц()» .

Таким образом, можно управлять постраничным выводом на печать и контролировать заполнение страницы:

Если Не ТабДок.ПроверитьВывод(МассивВыводимыхОбластей) Тогда ТабДок.ВывестиГоризонтальныйРазделительСтраниц(); КонецЕсли

Важной характеристикой платформы «1С:Предприятие 8.2» является строгое разделение свойств и методов по контексту исполнения. Если все приведенные выше свойства доступны в любом контексте, то перечисленные методы недоступны на тонком клиенте. Исключением является метод «Напечатать()», доступность которого по понятным причинам ограничена клиентской частью. Это означает, что формирование табличного документа должно происходить на сервере, а отправлять его на печать следует в клиентской процедуре.

Создадим внешний отчет, который будет выводить отчетную информацию об остатках номенклатуры и её обороте. Требуемая информация запрашивается запросом с помощью набор данных типа "Запрос", который содержит текст запроса:
ВЫБРАТЬ
_ДемоНоменклатура.Ссылка КАК Номенклатура
ПОМЕСТИТЬ АктуальнаяНоменклатура
ИЗ
Справочник._ДемоНоменклатура КАК _ДемоНоменклатура
ГДЕ
НЕ _ДемоНоменклатура.ПометкаУдаления
И НЕ _ДемоНоменклатура.ЭтоГруппа
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
АктуальнаяНоменклатура.Номенклатура,
_ДемоОстаткиТоваровВМестахХраненияОстаткиИОбороты.МестоХранения,
_ДемоОстаткиТоваровВМестахХраненияОстаткиИОбороты.КоличествоНачальныйОстаток,
_ДемоОстаткиТоваровВМестахХраненияОстаткиИОбороты.КоличествоКонечныйОстаток,
_ДемоОстаткиТоваровВМестахХраненияОстаткиИОбороты.КоличествоПриход,
_ДемоОстаткиТоваровВМестахХраненияОстаткиИОбороты.КоличествоРасход,
_ДемоОстаткиТоваровВМестахХраненияОстаткиИОбороты.КоличествоОборот
ИЗ
АктуальнаяНоменклатура КАК АктуальнаяНоменклатура
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления._ДемоОстаткиТоваровВМестахХранения.ОстаткиИОбороты КАК _ДемоОстаткиТоваровВМестахХраненияОстаткиИОбороты
ПО АктуальнаяНоменклатура.Номенклатура = _ДемоОстаткиТоваровВМестахХраненияОстаткиИОбороты.Номенклатура

В итоге отчет содержит следующие поля (см. рисунок 1):

Так как информация берется из виртуальной таблицы "ОстаткиИОбороты", то СКД автоматически создает два параметра данных НачалоПериода и КонецПериода, которые необходимы для задания пределов периода выборки данных. Я предпочитаю с такими параметрами не работать напрямую, а задавать их значения через другой параметр, который будет доступен пользователю для редактирования (см. рисунок 2).
Отчет со своей задачей справляется, но шапка отчета довольно сухая. За время работы, я нашел несколько способов оформления шапки отчета:

  1. Настройка заголовков полей на вкладке СКД "Наборы данных";
  2. Настройка заголовков полей на вкладке СКД "Настройки";
  3. Программная установка заголовков полей;
  4. Задание шапки отчета с помощью макета;
  5. Доработка результата (табличного документа);
Рассмотрим их подробно.

1. Настройка заголовков на вкладке СКД "Наборы данных"

Здесь все просто, ставим галочку напротив свойства поля "Заголовок" (т.е. отменяем автозаголовок) и вводим необходимый текст заголовка (см. рисунок 4).
Если требуется задать оформление для всего поля, а не только для его заголовка, то существует свойство поля "Оформление", с помощью которого можно задать некое оформление поля, например, изменить шрифт или задать цвет фона (см. рисунок 5).
На этом мои знания про вкладку "Наборы данных" заканчиваются.

2. Настройка заголовков полей на вкладке СКД "Настройки"

Для задания заголовка поля, необходимо выделить нужное поле, правой кнопкой мыши вызвать контекстное меню и выбрать пункт "Установить заголовок" (см. рисунок 6)
Что бы сгруппировать поля (например, по типу информации), нужно добавить группировочное поле и поместить в него требуемые поля (см. рисунок 7), вложенность неограниченная.
Так же можно поиграться со свойством группировочного поля "Расположение", от которого зависит вид группировки полей.

Данные действия можно производить и в режиме 1С:Предприятия, открыв настройки отчета, НО, в состав настроек отчета должен быть включен пункт "Выбранные поля" (см. рисунок 8).
На этом легкая часть по настройке шапки отчета закончена. Из плюсов выше перечисленных действий: вся настройка выполняется стандартными средствами. Из минусов: отсутствие возможности задания многострочного заголовка поля.

3. Программная установка заголовков полей

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

Для этого в модуле отчета определим процедуру ПриКомпоновкеРезультата . В этой процедуре напишем код по заданию заголовка полей.

// 1. Получаем пользовательские настройки.
НастройкиКД = ЭтотОбъект.КомпоновщикНастроек.ПолучитьНастройки();

// 2. Получаем значение параметра "Период" из которого определяем дату начала и окончания периода.
ПараметрПериод = Новый ПараметрКомпоновкиДанных("Период");
Период = НастройкиКД.ПараметрыДанных.НайтиЗначениеПараметра(ПараметрПериод).Значение;
НачалоПериода = Период.ДатаНачала;
КонецПериода = Период.ДатаОкончания;

// 3. Подготовим информацию о переопределении заголовка полей. Для этого, создадим
// массив, который будет содержать информацию: ИмяПоля - значения свойства "Путь" в
// наборе данных (см. рисунок 1), Заголовок - текст заголовка.
СписокПолей = Новый Массив;
стрНачалоПериода = Формат(НачалоПериода, "ДФ=dd.MM.yyyy; ДП="Пустая дата"");
ПолеНачальныйОстаток = Новый Структура("ИмяПоля, Заголовок", "КоличествоНачальныйОстаток", "Остаток на " + Символы.ПС + стрНачалоПериода);
СписокПолей.Добавить(ПолеНачальныйОстаток);
стрКонецПериода = Формат(КонецПериода, "ДФ=dd.MM.yyyy; ДП="Пустая дата"");
ПолеКонечныйОстаток = Новый Структура("ИмяПоля, Заголовок", "КоличествоКонечныйОстаток", "Остаток на " + Символы.ПС + стрКонецПериода);
СписокПолей.Добавить(ПолеКонечныйОстаток);

// 4. Получим список полей, который находятся в группировке "Остатки" (см. рисунок 7) и
// зададим новый заголовок, обойдя элементы в цикле.
ВыбранныеПоля = НастройкиКД.Выбор.Элементы; // Первый уровень полей.
ВыбранныеПоляОстатки = ВыбранныеПоля.Элементы; // Поля группировки остатки.
Для каждого ВыбранноеПоле Из ВыбранныеПоляОстатки Цикл
Для Каждого ЭлементМассива Из СписокПолей Цикл
ПолеКомпоновки = Новый ПолеКомпоновкиДанных(ЭлементМассива.ИмяПоля);
Если ВыбранноеПоле.Поле = ПолеКомпоновки Тогда
ВыбранноеПоле.Заголовок = ЭлементМассива.Заголовок;
КонецЕсли;
КонецЦикла;
КонецЦикла;

// 5. Загрузим измененный пользовательские настройки обратно.
ЭтотОбъект.КомпоновщикНастроек.ЗагрузитьНастройки(НастройкиКД);

Результат отчета (см. рисунок 10):
Способ потяжелее, чем все выше перечисленные, но мне нравится.

4. Задание шапки отчета с помощью макета

Для более гибкой настройки внешнего вида отчета в СКД предусмотрено создание макетов. В настройках отчета создадим еще одну группировку "детальные записи" и установим имя "СтрокаДЗ" для этой группировки (см. рисунок 11).
На вкладке "Макеты" добавим макет заголовка группировки. Для макета в табличном документе создадим шапку отчета (шапка отчета должна содержать столько заголовков полей, сколько выводит полей детальная запись) и укажем область табличного документа для макета (см. рисунок 12).
В итоге отчет имеет следующего вида шапку(см. рисунок 13):

Рисунок 13. Макет СКД в качестве шапки отчета
По моему мнению, макеты имеют один большой минус, это невозможность перестраиваться под заданную пользовательскую группировку, поэтому их следует использовать в том случае, если отчетная форма регламентированная и не может быть изменена. Попробуйте задать группировку для группировки "СтрокаДЗ" и увидите, что макет сбился.

На сайте информационно-технологического сопровождения приведена статья Использование предопределенных макетов , которая подробно описывает приемы использования макетов в СКД.

5. Доработка результата (табличного документа)

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

Приступим. Отключаем стандартное формирование, для этого в модуле отчета для события ПриКомпоновкеРезультата установим переменную СтандартнаяОбработка в значение Ложь и напишем собственную компоновку результата:
СтандартнаяОбработка = Ложь;
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(
ЭтотОбъект.СхемаКомпоновкиДанных,
ЭтотОбъект.КомпоновщикНастроек.Настройки,
ДанныеРасшифровки);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, ДанныеРасшифровки, Истина);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
Более подробно программная компоновка результата отчета описана в статье

Скомпонованный результат выводится в табличный документ - это переменная ДокументРезультат. Далее, после формирования результата и вывода его в табличный документ пишем код для замены одного текста ячейки на другой. Например, изменим в шапке отчета название группировки "Остатки" на "Остатки номенклатуры" (см. рисунок 14):
Ячейка = ДокументРезультат.НайтиТекст("Остатки");
Если Ячейка <> Неопределено Тогда
Ячейка.Текст = "Остатки номенклатуры";
КонецЕсли;

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

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

P.S. может быть у вас в арсенале имеется еще способ оформления заголовков полей?

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

Для наглядного представления реализации части трюков я сделал небольшие заготовки в виде внешних схем СКД. Описание трюков и скриншоты постарался делать так, чтобы суть и техника реализации трюка были понятны без необходимости скачивания схем. Для кого-то этого будет вполне достаточно, но если что-то непонятно, то всегда можно скачать соответствующую схему и посмотреть непосредственно реализацию.

Трюк №1. Многоликость правого значения.

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

Пример.
В качестве примера я не стал изобретать велосипед, а взял самую обычную оборотно-сальдовую ведомость по счету 60 из демо-версии 1С:Бухгалтерии (я использую ред. 2.0.). Кто не знает, начиная с редакции 2.0 этот отчёт сделан на базе СКД.

Итак, зададим прямо в ней отбор для строк с условием "БУ Дт (оборот)" Равно "БУ Кт (оборот)", а также применим к отчёту условное оформление, подсветив жёлтым цветом ячейки строк, где "БУ Кт (кон. сальдо)" Больше "БУ Кт (оборот)". Если кто не знает, как включить панель "Оформление" - найдите кнопку "Параметры панели настроек" справа от надписи "Панель настроек".

Конечный результат должен получиться примерно таким:

Трюк №2. Отбор на группировках.

Все знают, что такое Отбор в СКД, но не все знают, что его можно применять не только для отчета в целом, но и на отдельных группировках строк и колонок. Прикладных задач для задействования такого средства много. Например, условная детализация (ограничение для каких группировок верхнего уровня выводить детализацию, а для каких нет), или вариативная детализация (для разных значений группировок верхнего уровня выводить разные расшифровки). На одном из проектов УПП, к примеру, пришлось делать форму калькуляции себестоимости с фиксированной структурой (отдельный справочник) и для разных статей калькуляции выводить расшифровки или по статьям затрат, или по конкретным затратам или не выводить ничего. Благодаря этому трюку не пришлось отказываться от СКД при разработке отчёта.

Пример.
Цель примера: отобразить ОСВ, в которой для взаиморасчетных счетов (60,62,76) показать расшифровку по контрагентам, а для затратных (20,23,25,26) - по статьям затрат.

Сама СКД реализована в виде набора данных, где используется запрос к виртуальной таблице остатков и оборотов регистра бухгалтерии "Хозрасчетный".
Размещаем вложенные группировки "Организация" и "Счет". В группировке "Счет" параллельно размещаем 2 группировки "Субконто1" и "Субконто2", для которых задаем соответствующие отборы.
Иллюстрацию настройки привожу в скриншоте:


Если в основных настройках отчёта на закладке "Другие настройки" вы не отключали вывод отборов, то это обязательно нужно будет сделать в "других настройках" наших группировок "Субконто1" и "Субконто2"

Трюк №3. Шапка-невидимка

Следующий трюк можно представить, как продолжение предыдущего. Если вы обратили внимание, в получившемся отчёте несмотря на то, что фактически у нас выводится только одно субконто, в шапку попадают оба (и "Субконто1" и "Субконто2"). К сожалению разработчики СКД не предусмотрели возможность регулирования видимостью шапки или использования какого-нибудь служебного символа, при установке которого в качестве заголовка, шапка поля бы не формировалась. Но, как вы уже, наверное, догадались есть трюк, который в какой-то степени поможет обойти данное ограничение.

При разработке схемы в предопределённом макете оформления добавьте макет группировки, с определением по имени группировки "Невидимка" так, как показано на скриншоте. Обратите внимание, что поле "Область" должно остаться пустым!

А затем задайте для группировки "Субконто2" имя "Невидимка":

И вуаля... шапка группировки "Субконто2" исчезает, а отчёт становится вот таким:

Спросите, почему макет оформления задаётся через имя, а не через указание конкретного поля группировки? Просто так получается более универсальное решение и впоследствии это имя группировки можно задать в вариантах отчёта на любой группировке, а вот менять предопределённый макет в вариантах уже не получится.

Да, есть ещё один ньюанс этого трюка: учитывайте, что "шапка-невидимка" накрывает не только эту группировку, но и все нижестоящие! Т.е. если вы назначите имя "Невидимка" группировке "Субконто1", то в шапке не будет видно ни "Субконто1", ни "Субконто2"!

Трюк №4. Называй меня как хочешь

Большинство разработчиков СКД знают, как можно задать заголовок поля запроса. На закладке СКД "Наборы данных", достаточно поставить галочку отмены автозаголовка и внести в поле "Заголовок" необходимый текст. Минус состоит в том, что в пользовательском режиме, этот способ недоступен, а переименовать заголовок хочется не прибегая к помощи конфигуратора. Так вот в настройках вариантов отчёта есть не только способ переименовать заголовки полей, но и "накрыть" их группировочной "шапкой". Для этого на закладке "Выбранные поля" необходимо выделить нужные поля и нажать правую кнопку мыши. Как видно на скриншоте для полей доступны опции "Установить заголовок" и "Сгруппировать поля".
Обратите внимание, что для полей группировок установку заголовка необходимо делать также именно через закладку "Выбранные поля", а не через контекстное меню "Установить имя" в верхней (структурной) части настройки варианта!



После всех настроек вариант отчёта выглядит вот так:



P.S.
Небольшая подсказка для тех, кто будет качать схему. Схема - одна, но все трюки выполнены в виде отдельных вариантов настроек отчёта этой схемы:

Продолжение следует...

Понравилась статья? Поделиться с друзьями: