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

08.10.20

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

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

Скачать исходный код

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

Введение

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

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

Программное формирование используется очень многими разработчиками, в том числе, встречается и в типовых системах. Стандартные причины использования - это необходимость программной доработки отчета, которая обычно выполняется через программную доработку настройки компоновки или через корректировки итогового табличного документа. Но, по каким-то причинам (я таких примеров не видел), не используются возможности объектов МакетКомпоновкиДанных и ПроцессорКомпоновкиДанных. Ключевое удобство их использования состоит в том что на момент их выполнения мы одновременно имеем данные и по настройкам (структуре) отчета, и итоговые данные, рассчитанные для вывода. Далее я опишу возможности использования данных объектов и приведу примеры. Некоторые примеры, возможно, покажутся выдуманными, а для некоторых могут быть другие пути решения, но цель данных примеров показать возможности неиспользуемых механик СКД, а как вы их будете применять на практике, вам виднее.  Кроме того, в прикрепленных файлах приложу отчет со всеми приведенными здесь примерами и даже более. Для формирования отчета нужен регистр бухгалтерии Хозрасчетный, но я проверял его только на 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.

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

 

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

См. также

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

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

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

10000 руб.

02.09.2020    126441    685    389    

737

Генератор схемы компоновки данных (СКД), написание кода схемы программно

Инструментарий разработчика СКД Платформа 1С v8.3 Конфигурации 1cv8 1С:Зарплата и Управление Персоналом 3.x Абонемент ($m)

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

3 стартмани

05.02.2024    4441    32    obmailok    19    

70

Набор-объект для СКД по тексту или запросу

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

Есть список полей в виде текста, или запрос - закидываем в набор СКД.

1 стартмани

31.01.2024    2176    2    Yashazz    0    

31

СКД на JavaScript в 1С

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

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

2 стартмани

11.12.2023    8439    20    John_d    25    

124

Использование менеджера временных таблиц в СКД

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

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

05.12.2023    5001    PROSTO-1C    13    

64

Модель СКД

Инструментарий разработчика СКД Платформа 1С v8.3 Система компоновки данных Абонемент ($m)

DSL для работы с СКД.

1 стартмани

15.11.2023    6069    15    kalyaka    5    

88

Пользовательские настройки отчетов 1С. Часть 1. Простые и расширенные настройки

СКД Инструкции пользователю Платформа 1С v8.3 Конфигурации 1cv8 1С:Бухгалтерия 3.0 Россия Бесплатно (free)

Простые приемы работы с отчетами на СКД. Что нужно знать пользователю про настройку отчетов, чтобы использовать их на полную катушку.

18.09.2023    7552    accounting_cons    7    

29

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

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

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

01.09.2023    4813    KVIKS    15    

80
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
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 291 09.10.20 11:54 Сейчас в теме
(2) Лучше не скажешь. Но все-таки СКД появилась несколько позже.
4. mikl79 118 09.10.20 14:16 Сейчас в теме
5. boln 1040 11.10.20 23:25 Сейчас в теме
Вот это я бы хотел видеть в недавнем митапе по СКД!
6. SizovE 263 12.10.20 09:31 Сейчас в теме
7. triviumfan 93 13.10.20 00:44 Сейчас в теме
Знал, пару раз встречал, но сам никогда не использовал.
А тут детальный разбор с примерами. Спасибо.
8. chuff 19.10.20 05:08 Сейчас в теме
Как просто решается и как эффектно получается. Спасибо!
9. aShumakoff 142 02.01.21 19:01 Сейчас в теме
Интересно... Часто приходится делать постобработку отчета, например, объединять ячейки и центрировать наименования в шапке. Какие видите преимущества программной работы с объектами СКД вместо выгрузки данных в дерево и самостоятельного вывода в табличный документ?
10. dabu-dabu 291 05.01.21 12:29 Сейчас в теме
(9) Работа через промежуточное дерево или таблицу считаю очень плохим способом реализации отчета, т.к. уменьшает производительность, снижает читабельность кода, увеличивает трудоемкость разработки, хоть может казаться что это не так.
olegmixeev6638; +1 Ответить
11. wing 28 11.06.21 04:29 Сейчас в теме
Не могу понять, как найти свою группировку. Цель как в 3 варианте - вывести дополнительную информацию, которую СКД своими средствами показать не может, но изначальные настройки - это таблица. Сколько ни пытался в отладке разгрести макет, - не смог понять, как он устроен...
12. wing 28 11.06.21 07:47 Сейчас в теме
(11) Разобрался:
ГруппировкаМакетаОтчета = МакетКомпоновкиДанных.Тело[МакетКомпоновкиДанных.Тело.Количество() - 1];
ГруппировкаМакетаТаблицы = Неопределено;
// Ищем таблицу
Для Каждого ЭлТела Из ГруппировкаМакетаОтчета.Тело Цикл
	Если ТипЗнч(ЭлТела) = Тип("ТаблицаМакетаКомпоновкиДанных") Тогда
		ГруппировкаМакетаТаблицы = ЭлТела;
		Прервать;
	КонецЕсли;
КонецЦикла;
Если ГруппировкаМакетаТаблицы = Неопределено Тогда
	ВызватьИсключение "Нарушена структура настроек - не найдена таблица";
КонецЕсли;
ГруппировкаМакетаСтроки = ГруппировкаМакетаТаблицы.Строки[ГруппировкаМакетаТаблицы.Строки.Количество() - 1];
ГруппировкаТелаСтроки = ГруппировкаМакетаСтроки.Тело[ГруппировкаМакетаСтроки.Тело.Количество() - 1];
ИмяМакетаГруппировки = ГруппировкаТелаСтроки.Тело[ГруппировкаТелаСтроки.Тело.Количество() - 1].Макет;
Показать
Somarushka; blandinko; +2 Ответить
13. dabu-dabu 291 11.06.21 08:56 Сейчас в теме
(12) Для конкретного простого отчета нормальный вариант.
Согласен, даже в отладчике не очень понятно как устроен Макет
Я планировал сделать обработку для удобного просмотра настроек макета, но руки так и не дошли. Может быть в будущем.
14. Yashazz 4726 14.07.21 13:15 Сейчас в теме
Теоретическая часть, мягко скажем, слабовата; ни о чём. А вот практические примеры достаточно дельные.
15. Wezoowy 73 22.08.21 15:26 Сейчас в теме
Добрый день!
Подскажите пожалуйста, как при программном выводе отчета СКД, выводить отчет в компактном режиме?
А то получается, что галка на кнопке в меню "Еще - Компактный режим" установлена, отчет формируется в "некомпактном режиме". Приходится 2 раза нажимать кнопку "Компактный режим". Тогда отчет действительно переходит в компактный режим по ширине формы.
Пробовал вызывать
Результат = Результат.ПолучитьКомпактныйДокумент();
Результат.УстановитьРастягиваниеПоГоризонтали(Истина);
Ничего не получается...
16. dabu-dabu 291 23.08.21 12:36 Сейчас в теме
(15) Никогда этим не пользовался, но указанный код должен работать.
Но, предполагаю, что его надо вызывать в модуле формы, чтобы система понимала ширину экрана.
Или нужно заполнять параметры метода ПолучитьКомпактныйДокумент.
И, конечно, вызов данных функций должен происходить после программного формирования СКД и вывода результата табличный документ.
18. angabanga5 03.11.22 15:41 Сейчас в теме
да использовать это для замены данных даже не знаю как- в ячейка не возможно подцепиться в принципе ни по типу данных, ни по чему-то еще
19. Hegy 10.06.23 17:51 Сейчас в теме
Подскажите, пожалуйста, как указать отчету на СКД, чтобы он использовал для макета другой язык? Уже предварительно настроено и заполнено Свойства ячейки - текст - строки на разных языках.

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


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

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


Но появляется ошибка "Поле объекта не обнаружено (КодЯзыкаМакета)"
20. dabu-dabu 291 13.06.23 09:45 Сейчас в теме
(19) В синтаксис помощнике не нашел свойство "КодЯзыкаМакета" у макета компоновки.
С такими задачами не сталкивался, не подскажу.
Но можно попробовать свойство "КодЯзыка" У табличного документа.
При программном формировании СКД - это параметр ДокументРезультат у события ПриКомпоновкеРезультата
21. Hegy 13.06.23 12:30 Сейчас в теме
(20) Спасибо за ответ. Пробовал. Не оказывает влияния (
22. frkbvfnjh 787 12.09.23 08:21 Сейчас в теме
Да, очень круто, но по прежнему ничего не понятно. Кроме того такое вмешательство подходит только если никаких ручных изменений структуры отчета не происходит. В противном случае нужно писать анализатор с искусственным интеллектом, что бы понять что у нас вообще вывелось и как с этим работать. Пожалуй подожду еще лет 10, возможно мозг сможет понять вывод СКД, а возможно так дураком и помру...
23. dabu-dabu 291 12.09.23 11:58 Сейчас в теме
(22)
а, очень круто, но по прежнему ничего не понятно. Кроме того такое вмешательство подходит только если никаких ручных изменений с
Не соглашусь, да анализатор нужен, но реализовать его вполне можно. В приложенном к статье файле "Пример отчета ОСВ" как раз допускается наличие группировок и расшифровок.
24. vdiamond 30.11.23 17:32 Сейчас в теме
Круто!
Очень хорошая статья!
25. frkbvfnjh 787 21.02.24 11:08 Сейчас в теме
Почему все пишут так?
Пока Истина Цикл
	ЭлементРезультата = ПроцессорКомпоновки.Следующий();
	Если ЭлементРезультата = Неопределено Тогда
		Прервать;
	КонецЕсли;
	
	//Можем редактировать данные, внешний вид и расшифровку выводимого элемента (ЭлементРезультата)
	
	ПроцессорВывода.ВывестиЭлемент(ЭлементРезультата);
КонецЦикла;
Показать

Может проще и понятней, по классике?
ЭлементРезультата = ПроцессорКомпоновки.Следующий();
Пока ЭлементРезультата <> Неопределено Цикл
	//Можем редактировать данные, внешний вид и расшифровку выводимого элемента (ЭлементРезультата)
	
	ПроцессорВывода.ВывестиЭлемент(ЭлементРезультата);
	ЭлементРезультата = ПроцессорКомпоновки.Следующий();
КонецЦикла;
user1274184; +1 Ответить
26. dabu-dabu 291 21.02.24 11:16 Сейчас в теме
(25) Мне более понятен первый вариант, т.к. собственно условие там задается вначале цикла, а у вас перед циклом и в конце.
Почему второй вариант вы считаете "классикой" - для меня вопрос.
Но оба подхода имеют право на жизнь
32. hasp_x 156 07.04.24 15:45 Сейчас в теме
(25) Только вчера работал с отчетами по амортизации и обратил внимание на такую необычную конструкцию (ERP 2.5 Общий модуль БухгалтерскиеОтчетыВызовСервера). Вас услышали:)
33. janit 20 12.04.24 15:22 Сейчас в теме
(25)
Согласен с Вами, но я делаю еще более кратко и более классически:
Пока ПроцессорКомпоновки.Следующий() <> Неопределено Цикл

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

(26)
Под классикой скорее всего предыдущий комментатор подразумевал подход, который применяется в стандартном конструкторе запросов и методологиях от фирмы 1С
frkbvfnjh; +1 Ответить
27. xaozai 02.04.24 19:43 Сейчас в теме
Подскажите, пожалуйста, почему при программном выводе (как в этой статье) ко всем ячекам добавляется расшифровка, в которой какие-то цифры? Т.е., была ссылка на элемент справочника, а стали какие-то цифры. Расшифровка поменялась даже там, где она была Неопределено. При этом, я её программно не трогаю.

Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	
	ИтоговыеНастройки = КомпоновщикНастроек.ПолучитьНастройки();
	
	//Можем редактировать настройки компоновки (ИтоговыеНастройки)
	
	КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
	МакетКомпоновкиДанных = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, ИтоговыеНастройки, ДанныеРасшифровки);
	
	//Можем редактировать итоговые наборы данных и макеты табличного документа (МакетКомпоновкиДанных)
	
	ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
	ПроцессорКомпоновки.Инициализировать(МакетКомпоновкиДанных, , ДанныеРасшифровки);
	
	ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
	ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
	
	//Формируем отчет поэлементно
	//Вместо стандартного вывода одним методом - ПроцессорВывода.Вывести(ПроцессорКомпоновки)
	ПроцессорВывода.НачатьВывод();
	Пока Истина Цикл
		ЭлементРезультата = ПроцессорКомпоновки.Следующий();
		Если ЭлементРезультата = Неопределено Тогда
			Прервать;
		КонецЕсли;
		
		//Можем редактировать данные, внешний вид и расшифровку выводимого элемента (ЭлементРезультата)
		
		ПроцессорВывода.ВывестиЭлемент(ЭлементРезультата);
	КонецЦикла;
	ПроцессорВывода.ЗакончитьВывод();
	
	//Можем редактировать табличный документ (ДокументРезультат)
	
КонецПроцедуры
Показать
28. dabu-dabu 291 03.04.24 11:31 Сейчас в теме
(27) Число - это индекс из "ДанныеРасшифровки". Там можно получить значение расшифровки.

Вот здесь вы можете вручную менять расшифровку:

//Можем редактировать данные, внешний вид и расшифровку выводимого элемента (ЭлементРезультата)

ПроцессорВывода.ВывестиЭлемент(ЭлементРезультата);
29. xaozai 03.04.24 12:16 Сейчас в теме
(28) Что-то как-то неудобно.
Без программного вывода выводится отчет, в котором расшифровка заполнена у нескольких ячеек во всей большой таблице.
После такого программного вывода курсор с лупой отображается над каждой ячейкой таблицы, причем, в расшифровке какая-то не нужная ерунда, которую теперь оттуда как-то нужно выколупывать.

Т.е., хотите программный вывод - колупайтесь с расшифровкой, иначе никак?
30. dabu-dabu 291 03.04.24 12:35 Сейчас в теме
(29) программный вывод или нет никак на расшифровку не влияет напрямую.
Возможно, без программного вывода у вас используется какой-то макет, который отсутствует при программном выводе.
31. xaozai 03.04.24 13:22 Сейчас в теме
(30) Я понял, почему у меня так происходит…
У меня там программно еще Отч.СкомпоноватьРезультат() делается…
34. frkbvfnjh 787 12.04.24 15:33 Сейчас в теме
(33) Таки да, Ваш вариант идеален! Возьму на вооружение...
Оставьте свое сообщение