Программная корректировка при выводе отчета СКД

08.10.20

Разработка - СКД

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

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

Наименование Файл Версия Размер
Пример отчета ОСВ
.erf 15,58Kb
22
.erf 15,58Kb 22 Скачать
Пример отчета ОСВ (1)
.erf 15,58Kb
5
.erf 15,58Kb 5 Скачать
Пример отчета ОСВ (2)
.erf 15,58Kb
4
.erf 15,58Kb 4 Скачать
Схема компоновки, используемая в примерах (ничего необычного нет)
.xml 30,58Kb
6
.xml 30,58Kb 6 Скачать

Введение

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

 
 Стандартное программное формирование отчета на СКД

Программное формирование используется очень многими разработчиками, в том числе, встречается и в типовых системах. Стандартные причины использования - это необходимость программной доработки отчета, которая обычно выполняется через программную доработку настройки компоновки или через корректировки итогового табличного документа. Но, по каким-то причинам (я таких примеров не видел), не используются возможности объектов МакетКомпоновкиДанных и ПроцессорКомпоновкиДанных. Ключевое удобство их использования состоит в том что на момент их выполнения мы одновременно имеем данные и по настройкам (структуре) отчета, и итоговые данные, рассчитанные для вывода. Далее я опишу возможности использования данных объектов и приведу примеры. Некоторые примеры, возможно, покажутся выдуманными, а для некоторых могут быть другие пути решения, но цель данных примеров показать возможности неиспользуемых механик СКД, а как вы их будете применять на практике, вам виднее.  Кроме того, в прикрепленных файлах приложу отчет со всеми приведенными здесь примерами и даже более. Для формирования отчета нужен регистр бухгалтерии Хозрасчетный, но я проверял его только на 1С: Бухгалтерия 3.0.

Всё, что будет описано далее, это предмет моих личных изысканий и не претендует на полноту.

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

ПроцессорКомпоновкиДанных - позволяет не только сформировать весь отчет единовременно, но и может заполнять табличный документ по элементам (строкам) отчета используя объект ЭлементРезультатаКомпоновкиДанных.

С учетом вышесказанного, текст кода программного формирования отчета можно представить в виде:

 
 Расширенное программное формирование отчета на СКД

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

Посмотрим какие свойства есть у объекта МакетКомпоновкиДанных:

 
 Свойства Макета компоновки данных

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

 
 Описание Тела Макета компоновки данных

Все макеты, указанные в Теле макета компоновки данных, определены в МакетКомпоновкиДанных.Макеты:

 
 Описание Макетов областей Макета компоновки данных

Элемент результата компоновки данных

При поэлементном выводе отчета в табличный документ, мы (как показано выше в "расширенном" программном формировании) на каждом шаге получаем объект типа ЭлементРезультатаКомпоновкиДанных. Посмотрим какие у него есть свойства:

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

 

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

Все примеры сформированы для реализации выдуманного отчета вида Оборотно-сальдовая ведомость для 1С:Бухгалтерия 3.0. Такой пример использован по причине актуальности приведенных примеров в рамках одного отчета.

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

 
 Настройка компоновки для примеров

Пример 1: Приведение шапки отчета к "нормальному" виду

Это часто встречающаяся проблема, когда не хватает возможностей настроек СКД. В том числе, использование макетов из настроек СКД не всегда помогает, например, по причине использования широких пользовательских настроек в итоговом отчете.

В примере выводим ОСВ с показателями БУ и НУ, выводящимся в вертикальной последовательности. Считаем, что в данной ОСВ пользователь сможет настраивать группировки, в том числе с выводом в нескольких колонках.

Хотим преобразовать шапку следующим образом:

 
 Реализация Примера 1

 

Пример 2: Различные элементы группировки отчета выводим по-разному

В нашем ОСВ выводятся показатели БУ и НУ в вертикальной последовательности. Т.е. по каждой строке группировки получаем 2 строки в таблице отчета.

Но не все счета учитываются по НУ, соответственно, по ним не имеет смысла выводить показатель НУ.

В типовых это решено через установку максимальной высоты = 1 в условном оформлении, что, как мне кажется, не лучший вариант.

Должно выводиться следующим образом:

 
 Реализация Примера 2

 

Пример 3: Выводим дополнительную информацию для отдельных элементов группировки

Реализуем в нашем ОСВ контроль отрицательных остатков. Т.е. чтобы на активных счетах было только дебетовое сальдо, а на пассивных только кредитовое, а также проконтролируем отсутствие отрицательного количества, если счет количественный.

Выглядеть это должно следующим образом:

 
 Реализация Примера 3

 

Пример 4: Выводим диаграммы в ячейках отчета

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

Выглядеть это будет следующим образом:

 
 Реализация Примера 4

 

Отчёт, прикрепленный к статье

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

Отчет проверен на 1С: Бухгалтерия 3.0 версии 3.0.79.14 на платформе 8.3.16.1063. Но должен работать на любой Бухгалтерии 3.0 и ERP.

Прикрепленные файлы отличаются только количеством СМ. Кто хочет отблагодарить таким образом - я против не буду.

 

СКД КомпоновщикМакетаКомпоновкиДанных ПроцессорКомпоновкиДанных МакетКомпоновкиДанных ЭлементРезультатаКомпоновкиДанных Оборотно-сальдовая ведомость

См. также

SALE! %

Infostart Toolkit: Инструменты разработчика 1С 8.3 на управляемых формах

Инструментарий разработчика Роли и права Запросы СКД Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Конфигурации 1cv8 Платные (руб)

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

12000 10000 руб.

02.09.2020    93280    476    380    

531

Разрыв страницы в СКД. Легко!

СКД Платформа 1С v8.3 Система компоновки данных Бесплатно (free)

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

01.09.2023    2547    KVIKS    14    

76

Гибкие отборы через СКД на управляемых формах. Демо-обработка

СКД Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Абонемент ($m)

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

2 стартмани

07.06.2023    4193    24    quazare    7    

45

Вывод элементов иерархии верхнего уровня на СКД

СКД Платформа 1С v8.3 Абонемент ($m)

Как получить родителя первого уровня иерархического справочника с помощью СКД.

1 стартмани

06.06.2023    3327    echo77    6    

71

Обработка результатов запроса произвольными вычисляемыми полями. Обзор некоторых новых функций СКД

Запросы СКД Платформа 1С v8.3 Запросы Система компоновки данных Конфигурации 1cv8 Бесплатно (free)

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

07.02.2023    4719    quazare    7    

38

Выборочная свертка группировок для СКД

СКД Платформа 1С v8.3 Система компоновки данных Конфигурации 1cv8 Россия Абонемент ($m)

Методика разработки отчета на СКД с возможностью свёртки части группировок по заданному программно условию. - свертка по значению поля (неотрицательные - сворачиваются); - свертка подчиненных в иерархии с произвольным количеством уровней.

1 стартмани

16.01.2023    2808    schthaxe    3    

30
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. maslyann 13 09.10.20 07:18 Сейчас в теме
Полезная статья. +
2. herres 09.10.20 10:44 Сейчас в теме
Просто бомба.
18 лет назад появилась восьмёрка. Все посмотрели на поэлементный вывод, все поняли что это здорово, но ни кто не знал что с этим делать, включая самих разработчиков 1С
Crazy_Max; Поручик; Lacoste4life; Михаська; shvo65; kmink; frying; dabu-dabu; +8 Ответить
3. dabu-dabu 261 09.10.20 11:54 Сейчас в теме
(2) Лучше не скажешь. Но все-таки СКД появилась несколько позже.
4. mikl79 117 09.10.20 14:16 Сейчас в теме
круто
5. boln 1039 11.10.20 23:25 Сейчас в теме
Вот это я бы хотел видеть в недавнем митапе по СКД!
6. SizovE 254 12.10.20 09:31 Сейчас в теме
красиво
7. triviumfan 82 13.10.20 00:44 Сейчас в теме
Знал, пару раз встречал, но сам никогда не использовал.
А тут детальный разбор с примерами. Спасибо.
8. chuff 19.10.20 05:08 Сейчас в теме
Как просто решается и как эффектно получается. Спасибо!
9. vazelin 129 02.01.21 19:01 Сейчас в теме
Интересно... Часто приходится делать постобработку отчета, например, объединять ячейки и центрировать наименования в шапке. Какие видите преимущества программной работы с объектами СКД вместо выгрузки данных в дерево и самостоятельного вывода в табличный документ?
10. dabu-dabu 261 05.01.21 12:29 Сейчас в теме
(9) Работа через промежуточное дерево или таблицу считаю очень плохим способом реализации отчета, т.к. уменьшает производительность, снижает читабельность кода, увеличивает трудоемкость разработки, хоть может казаться что это не так.
olegmixeev6638; +1 Ответить
11. wing 21 11.06.21 04:29 Сейчас в теме
Не могу понять, как найти свою группировку. Цель как в 3 варианте - вывести дополнительную информацию, которую СКД своими средствами показать не может, но изначальные настройки - это таблица. Сколько ни пытался в отладке разгрести макет, - не смог понять, как он устроен...
12. wing 21 11.06.21 07:47 Сейчас в теме
(11) Разобрался:
ГруппировкаМакетаОтчета = МакетКомпоновкиДанных.Тело[МакетКомпоновкиДанных.Тело.Количество() - 1];
ГруппировкаМакетаТаблицы = Неопределено;
// Ищем таблицу
Для Каждого ЭлТела Из ГруппировкаМакетаОтчета.Тело Цикл
	Если ТипЗнч(ЭлТела) = Тип("ТаблицаМакетаКомпоновкиДанных") Тогда
		ГруппировкаМакетаТаблицы = ЭлТела;
		Прервать;
	КонецЕсли;
КонецЦикла;
Если ГруппировкаМакетаТаблицы = Неопределено Тогда
	ВызватьИсключение "Нарушена структура настроек - не найдена таблица";
КонецЕсли;
ГруппировкаМакетаСтроки = ГруппировкаМакетаТаблицы.Строки[ГруппировкаМакетаТаблицы.Строки.Количество() - 1];
ГруппировкаТелаСтроки = ГруппировкаМакетаСтроки.Тело[ГруппировкаМакетаСтроки.Тело.Количество() - 1];
ИмяМакетаГруппировки = ГруппировкаТелаСтроки.Тело[ГруппировкаТелаСтроки.Тело.Количество() - 1].Макет;
Показать
blandinko; +1 Ответить
13. dabu-dabu 261 11.06.21 08:56 Сейчас в теме
(12) Для конкретного простого отчета нормальный вариант.
Согласен, даже в отладчике не очень понятно как устроен Макет
Я планировал сделать обработку для удобного просмотра настроек макета, но руки так и не дошли. Может быть в будущем.
14. Yashazz 4552 14.07.21 13:15 Сейчас в теме
Теоретическая часть, мягко скажем, слабовата; ни о чём. А вот практические примеры достаточно дельные.
15. Wezoowy 71 22.08.21 15:26 Сейчас в теме
Добрый день!
Подскажите пожалуйста, как при программном выводе отчета СКД, выводить отчет в компактном режиме?
А то получается, что галка на кнопке в меню "Еще - Компактный режим" установлена, отчет формируется в "некомпактном режиме". Приходится 2 раза нажимать кнопку "Компактный режим". Тогда отчет действительно переходит в компактный режим по ширине формы.
Пробовал вызывать
Результат = Результат.ПолучитьКомпактныйДокумент();
Результат.УстановитьРастягиваниеПоГоризонтали(Истина);
Ничего не получается...
16. dabu-dabu 261 23.08.21 12:36 Сейчас в теме
(15) Никогда этим не пользовался, но указанный код должен работать.
Но, предполагаю, что его надо вызывать в модуле формы, чтобы система понимала ширину экрана.
Или нужно заполнять параметры метода ПолучитьКомпактныйДокумент.
И, конечно, вызов данных функций должен происходить после программного формирования СКД и вывода результата табличный документ.
18. angabanga5 03.11.22 15:41 Сейчас в теме
да использовать это для замены данных даже не знаю как- в ячейка не возможно подцепиться в принципе ни по типу данных, ни по чему-то еще
19. Hegy 10.06.23 17:51 Сейчас в теме
Подскажите, пожалуйста, как указать отчету на СКД, чтобы он использовал для макета другой язык? Уже предварительно настроено и заполнено Свойства ячейки - текст - строки на разных языках.

В обычных отчетах достаточно указать
	КодЯзыкаПечать = Локализация.ПолучитьЯзыкФормированияПечатныхФорм(УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(глЗначениеПеременной("глТекущийПользователь"), "РежимФормированияПечатныхФорм"));
	Макет = ОтчетОбъект.ПолучитьМакет("ИмяМакета");
	Макет.КодЯзыкаМакета = КодЯзыкаПечать;


Логичнее всего и здесь установить параметр

	МакетКомпоновки.КодЯзыкаМакета = КодЯзыкаПечать;


Но появляется ошибка "Поле объекта не обнаружено (КодЯзыкаМакета)"
20. dabu-dabu 261 13.06.23 09:45 Сейчас в теме
(19) В синтаксис помощнике не нашел свойство "КодЯзыкаМакета" у макета компоновки.
С такими задачами не сталкивался, не подскажу.
Но можно попробовать свойство "КодЯзыка" У табличного документа.
При программном формировании СКД - это параметр ДокументРезультат у события ПриКомпоновкеРезультата
21. Hegy 13.06.23 12:30 Сейчас в теме
(20) Спасибо за ответ. Пробовал. Не оказывает влияния (
22. frkbvfnjh 766 12.09.23 08:21 Сейчас в теме
Да, очень круто, но по прежнему ничего не понятно. Кроме того такое вмешательство подходит только если никаких ручных изменений структуры отчета не происходит. В противном случае нужно писать анализатор с искусственным интеллектом, что бы понять что у нас вообще вывелось и как с этим работать. Пожалуй подожду еще лет 10, возможно мозг сможет понять вывод СКД, а возможно так дураком и помру...
23. dabu-dabu 261 12.09.23 11:58 Сейчас в теме
(22)
а, очень круто, но по прежнему ничего не понятно. Кроме того такое вмешательство подходит только если никаких ручных изменений с
Не соглашусь, да анализатор нужен, но реализовать его вполне можно. В приложенном к статье файле "Пример отчета ОСВ" как раз допускается наличие группировок и расшифровок.
Оставьте свое сообщение