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

08.10.20

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

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

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Пример отчета ОСВ
.erf 15,58Kb
33
33 Скачать (1 SM) Купить за 1 850 руб.
Пример отчета ОСВ (1)
.erf 15,58Kb
8
8 Скачать (5 SM) Купить за 3 050 руб.
Пример отчета ОСВ (2)
.erf 15,58Kb
8
8 Скачать (10 SM) Купить за 4 550 руб.
Схема компоновки, используемая в примерах (ничего необычного нет)
.xml 30,58Kb
10
10 Скачать (1 SM) Купить за 1 850 руб.

Введение

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

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

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

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

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

10000 руб.

02.09.2020    159326    872    399    

861

Запросы СКД Программист Стажер Система компоновки данных Россия Бесплатно (free)

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

15.05.2024    8676    implecs_team    6    

47

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

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

3 стартмани

05.02.2024    6987    56    obmailok    21    

79

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

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

1 стартмани

31.01.2024    3145    5    Yashazz    1    

34

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

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

2 стартмани

11.12.2023    10797    23    John_d    25    

124

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

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

05.12.2023    8007    PROSTO-1C    15    

68
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. maslyann 83 09.10.20 07:18 Сейчас в теме
2. herres 09.10.20 10:44 Сейчас в теме
Просто бомба.
18 лет назад появилась восьмёрка. Все посмотрели на поэлементный вывод, все поняли что это здорово, но ни кто не знал что с этим делать, включая самих разработчиков 1С
onsi; Crazy_Max; Поручик; Lacoste4life; Михаська; shvo65; kmink; frying; dabu-dabu; +9 Ответить
3. dabu-dabu 307 09.10.20 11:54 Сейчас в теме
(2) Лучше не скажешь. Но все-таки СКД появилась несколько позже.
35. native-api 02.08.24 16:00 Сейчас в теме
(2) Мне сейчас понадобилось вывести группировку способом, не поддерживаемым процессором вывода -- выводить детальные записи как обычно, но при этом объединить ячейки строк в группируемых столбцах.
Прикрепленные файлы:
4. mikl79 119 09.10.20 14:16 Сейчас в теме
5. boln 1041 11.10.20 23:25 Сейчас в теме
Вот это я бы хотел видеть в недавнем митапе по СКД!
6. SizovE 269 12.10.20 09:31 Сейчас в теме
7. triviumfan 97 13.10.20 00:44 Сейчас в теме
Знал, пару раз встречал, но сам никогда не использовал.
А тут детальный разбор с примерами. Спасибо.
8. chuff 19.10.20 05:08 Сейчас в теме
Как просто решается и как эффектно получается. Спасибо!
9. aShumakoff 154 02.01.21 19:01 Сейчас в теме
Интересно... Часто приходится делать постобработку отчета, например, объединять ячейки и центрировать наименования в шапке. Какие видите преимущества программной работы с объектами СКД вместо выгрузки данных в дерево и самостоятельного вывода в табличный документ?
10. dabu-dabu 307 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 307 11.06.21 08:56 Сейчас в теме
(12) Для конкретного простого отчета нормальный вариант.
Согласен, даже в отладчике не очень понятно как устроен Макет
Я планировал сделать обработку для удобного просмотра настроек макета, но руки так и не дошли. Может быть в будущем.
14. Yashazz 4790 14.07.21 13:15 Сейчас в теме
Теоретическая часть, мягко скажем, слабовата; ни о чём. А вот практические примеры достаточно дельные.
15. Wezoowy 75 22.08.21 15:26 Сейчас в теме
Добрый день!
Подскажите пожалуйста, как при программном выводе отчета СКД, выводить отчет в компактном режиме?
А то получается, что галка на кнопке в меню "Еще - Компактный режим" установлена, отчет формируется в "некомпактном режиме". Приходится 2 раза нажимать кнопку "Компактный режим". Тогда отчет действительно переходит в компактный режим по ширине формы.
Пробовал вызывать
Результат = Результат.ПолучитьКомпактныйДокумент();
Результат.УстановитьРастягиваниеПоГоризонтали(Истина);
Ничего не получается...
16. dabu-dabu 307 23.08.21 12:36 Сейчас в теме
(15) Никогда этим не пользовался, но указанный код должен работать.
Но, предполагаю, что его надо вызывать в модуле формы, чтобы система понимала ширину экрана.
Или нужно заполнять параметры метода ПолучитьКомпактныйДокумент.
И, конечно, вызов данных функций должен происходить после программного формирования СКД и вывода результата табличный документ.
18. angabanga5 03.11.22 15:41 Сейчас в теме
да использовать это для замены данных даже не знаю как- в ячейка не возможно подцепиться в принципе ни по типу данных, ни по чему-то еще
19. Hegy 10.06.23 17:51 Сейчас в теме
Подскажите, пожалуйста, как указать отчету на СКД, чтобы он использовал для макета другой язык? Уже предварительно настроено и заполнено Свойства ячейки - текст - строки на разных языках.

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


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

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


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

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

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

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

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

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

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

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

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