Top.Mail.Ru
онлайн-митап
19 декабря в 17:00 МСК
Матрица компетенций: как инструмент для развития разработчика

Макеты в 1С СКД

Макет в СКД: когда он нужен

В этой статье мы разберем использование макетов в 1С СКД. При разработке отчетов  иногда возникает необходимость в более сложной компоновке результата (в табличный документ) чем это позволяют типовые средства. Например, это может быть формирование печатной формы документа типа ТОРГ-12 – и такое тоже можно сделать средствами СКД, особенно если необходимы такие возможности как произвольные отборы. Или это могут быть какие-то особенные элементы отчета, которые нельзя сделать, используя стандартные возможности 1С – например, собственные итоги.

Работ с макетами СКД

Как сделать макет отчета в 1С СКД без макета

Сначала рассмотрим с вами стандартные возможности подсистемы СКД в 1С, которые позволяют получить отчет заданной формы.

Первое чем определяется форма (структура) отчета в СКД это настройка группировок

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

На закладке «Другие настройки» есть также много параметров, отвечающих за компоновку отчетов – расположение полей в группировке, расположение ресурсов, вывод общих итогов, отборов, параметров. Про все эти настройки вы можете прочитать в нашей статье.

С помощью вкладки «Условное оформление» нельзя поменять структуру отчета, но можно сделать визуальное оформление ячеек табличного документа – установить цвет, шрифт, ширину или высоту ячейки и другие параметры.

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

СКД через макет

Итак, вы поняли, что без использования макетов ваш отчет реализовать не получится и приняли решение о его (их) использовании. Должен вас сразу предупредить – применение макетов в отчете на СКД в 1С часто не дает возможность пользователю изменять структуру отчета. То есть макеты, настроенные для одного варианта отчета, могут неправильно работать в другом варианте отчета, если поменялся состав группировок. Если вас устраивает такое ограничение, то продолжим.

Настройка макета СКД

Настройка макетов производится на закладке «Макеты». Существуют несколько видов макеты, которые показаны на рисунке:

Основную сложность при настройке макетов вызывает (в том числе у меня) обилие видов макетов в сочетании с типом макета:

В этой статье я не буду расписывать какое сочетание в каком случае имеет смысл применять, потому что это не сильно интересно – это раз. Два – на этот счет есть документация от 1С и есть также хорошая шпаргалка в виде статьи на ИС.

Макет отчета СКД: варианты

Если мне нужно сделать отчет с использованием макетов, то я не запоминаю все варианты сочетаний, а руководствуюсь только следующими правилами:

Макет поля

Макет поля. Практически никогда не нужен. Практически все можно сделать с помощью условного оформления. Разве что заполнить как-то хитро параметр расшифровки для этого поля.

Макет группировки СКД

Используется для строк (колонок), то есть для собственно вывода данных отчета. Используется в основном тип макета «заголовок»

Макет заголовка группировки СКД 1С

Используется для вывода шапки (таблицы) отчета. Обычно использую этот макет только для первой группировки, чтобы «нарисовать» какую-то хитрую шапку для таблицы отчета (тип макета – заголовок). Если выбрать тип макета «подвал», то можно сделать подавал отчета – с подписями и т.п.

Макет ресурсов таблицы СКД 1С

Используется для группировки заданной таблицей. Используется в основном тип макета «заголовок»

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

Параметры макеты 1С

Связывание макета с данными производится через параметры и параметры расшифровки.

1с макет скд таблица

В поле выражение вы связываете параметр макета (или параметр расшифровки) с данными. Как видно здесь можно использовать выражения на языке выражений СКД и также имеется доступ через точку к реквизитам объектов.

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

Небольшой пример макета и небольшой лайфхак в этом же отчете. Добавим макеты для отчета, на котором мы тренировались:

Здесь мы добавили макет группировки для группировки первого уровня (настойки отчета на картинке ниже):

И добавили макет заголовка для этой же группировки. Получим результат:

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

И не будем задавать для него область

В этом случае заголовок не выводится как нам было нужно:

Когда и макет бессилен. Постобработка в 1С и другие хитрости

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

Пример 1: Вывод разрыва страницы для отчета с двумя группировками

Первый пример. Казалось бы, простая задача – для отчета с двумя группировками выводить разрыва страницы для каждой строки первой группировки, чтобы новое значение выводилось с новой страницы. Вроде обычная задача для макета – тут по идее нам пригодится макет группировки и тип макета «подвал». Рассмотрим на примере нашего отчета

Мы добавили нужный нам макет. Добавили в область для этого макета разрыв страницы. Чтобы выводился подвал группировки, дополнительно нужно указать его вывод (не только в начале, но и в конце)

В итоге получим

Как видно разрыв страницы не выводится. Видимо удаляется при формировании результата. Такое вот странное поведение системы. По крайней мере в релизе платформы 8.3.14.

Оформление 1С СКД макета программно

Существует вариант решения, основанный на программном формировании отчета и поэлементном выводе. Суть решения заключается в следующем – добавляем новый параметр «разрыв страницы», добавляем группировку, в которую включаем в выбранные поля только этот параметр, выводим программно отчет с помощью поэлементного вывода, при этом анализируем – если выводится строка, содержащая наш параметр, то ее пропускаем и вместо нее выводим разрыв страницы.

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

макет в скд 1с 8.3 пример
Пример макета в СКД 1С 8.3

Текст модуля формирования возьмем из статьи. Учтем комментарий к статье, в котором указано, что мы можем просто пропустить строку с текстом «Разрыв», а не скрывать область, устанавливая ей высоту 1. И получим необходимый результат:

макет в скд 1с пример
 

Как видно разрыв страницы теперь выводится.

Пример 2: Вывод двух несвязанных наборов данных горизонтально

Второй пример достаточно экзотичный, но также демонстрирует в некотором смысле «бессилие» типовых средств 1С СКД. Суть задачи заключается в том, что в отчет нужно вывести два несвязанных набора данных горизонтально. Типовые средства в СКД позволяют выводить такие наборы только вертикально. По этим двум ссылка приведено решение, которое мы с вами разберем.

Шаг 1. Выводим наши наборы с помощью детальных записей вертикально

Аналогично задаются выбранные поля для расхода.

Шаг 2. Нам нужно разделить таблицы друг от друга. Для этого добавляем макеты заголовка группировки.

Шаг 3. Копируем модуль формирования отчета из статьи и дорабатываем его для своего отчета. Тезисно, что мы делаем в модуле:

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

    СтандартнаяОбработка = Ложь;

    Настройки = КомпоновщикНастроек.Настройки;

    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;

    МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки);

    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;

    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки,,,Истина);

    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;

    ПроцессорВывода.УстановитьДокумент(ДокументРезультат);

    ПроцессорВывода.Вывести(ПроцессорКомпоновки);

    СтрокВТаблице = ДокументРезультат.ВысотаТаблицы;

    НачалоОбластиТаблицы1 = 0;

    НачалоОбластиТаблицы2 = 0;

    Для ПерваяСтрока = 1 По СтрокВТаблице Цикл

        ТекущаяСтрокаТабДока = ДокументРезультат.Область("R" + ПерваяСтрока + "C1");

     Если ТекущаяСтрокаТабДока.Текст = "Расход" Тогда

            НачалоОбластиТаблицы1 = ТекущаяСтрокаТабДока.Верх;

        ИначеЕсли ТекущаяСтрокаТабДока.Текст = "Приход" Тогда

            НачалоОбластиТаблицы2 = ТекущаяСтрокаТабДока.Верх;

            Прервать;

     КонецЕсли;

    КонецЦикла;

    ВысотаТаблицы1 = НачалоОбластиТаблицы2 - 1;

    ВысотаТаблицы2 = СтрокВТаблице - НачалоОбластиТаблицы2 + 1;

    КоличествоКолонокВТаблице = ДокументРезультат.ШиринаТаблицы;

    Если ВысотаТаблицы2 > ВысотаТаблицы1 Тогда

        // Добавляем в таблицу фиктивные строки

        ОбластьИсточник = ДокументРезультат.Область(СтрокВТаблице + 1,,СтрокВТаблице + ВысотаТаблицы2 - ВысотаТаблицы1 + 1,);

        ОбластьПриемник = ДокументРезультат.Область(НачалоОбластиТаблицы2 - 1,,ВысотаТаблицы2,);

        ДокументРезультат.ВставитьОбласть(ОбластьИсточник, ОбластьПриемник, ТипСмещенияТабличногоДокумента.ПоВертикали);

        НачалоОбластиТаблицы2 = НачалоОбластиТаблицы2 + ВысотаТаблицы2 - ВысотаТаблицы1 + 1;

        СтрокВТаблице = ДокументРезультат.ВысотаТаблицы;

    КонецЕсли;

    ОбластьИсточник = ДокументРезультат.Область(НачалоОбластиТаблицы2,1,СтрокВТаблице,КоличествоКолонокВТаблице);

    ОбластьПриемник = ДокументРезультат.Область(1,КоличествоКолонокВТаблице + 1,ВысотаТаблицы2,2 * КоличествоКолонокВТаблице);

    ДокументРезультат.ВставитьОбласть(ОбластьИсточник, ОбластьПриемник);

    Для н = 1 По КоличествоКолонокВТаблице Цикл

        ДокументРезультат.Область("C" + (КоличествоКолонокВТаблице + н)).ШиринаКолонки = ДокументРезультат.Область("C" + н).ШиринаКолонки

    КонецЦикла;

    ДокументРезультат.УдалитьОбласть(ОбластьИсточник);

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

Материалы для подготовки

Продвинутый курс по 1С СКД

Макеты СКД

Используем макеты в СКД

Макет СКД – примеры типовых вариантов

ИТС: Использование предопределенных макетов

ИТС: Использование макетов оформления

Черно-белый макет оформления

Группировка измерений в заголовках СКД

Comments

So empty here ... leave a comment!

Добавить комментарий

Sidebar