По-настоящему свои макеты в отчетах СКД. Исследование процесса компоновки и генерация кода отчета

22.03.22

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

Как скрестить формирование отчетных данных с помощью СКД и вывод в табличный документ с помощью Макет.ПолучитьОбласть(...) и ТабДок.Вывести(Секция)? А также сделать этот процесс простым и удобным? Об этом в статье ниже.

Файлы

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

Наименование Скачано Купить файл
АнализПроцессаКомпоновки
.epf 16,81Kb
41 2 500 руб. Купить
Пример
.zip 517,01Kb
44 2 500 руб. Купить

Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний

Оформите подписку на компанию для решения рабочих задач

Оформить подписку и скачать решение со скидкой

Вы можете заказать платную доработку или адаптацию этой разработки под вашу конфигурацию на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

 

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

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

Отчет должен быть реализован на основе вот такого регистра:

 

 

Что может быть проще? Создаем схему компоновки:

 

        

 

и с чувством выполненного долга показываем результат ОВЗ:

 

 

Но к нашему удивлению...

ОВЗ: Что это за $&^*%$% ?!. У меня раньше стояла 7.7, и там мои программисты за полчаса-час сделали такую форму:

 

 

ОВЗ: нужна такая же.

Мы: но у нас СКД - современный стандарт построения отчетов нового поколения...

ОВЗ: Да? почему же получилась такая $&^*%$% ? 

Мы: Ну как же, смотрите - вот отборы, вот структура, варианты и даже условное оформление!

ОВЗ: $#%!   *&$%!   &*$!

ОВЗ: На %#& мне все это надо?

ОВЗ: Мне надо завтра на стол Генеральному положить отчет, а ваш даже на страницу не помещается!

ОВЗ: Так, сроку вам до вечера. Напомнить, сколько мы вам платим? Все, свободны.

 

Итак, получив такой мотивирующий пинок импульс, команда приступила к работе.

Тимлид: какие у нас есть варианты?

Разработчик1: Может отказаться от СКД? Сделаем через запрос с итогами и выборкой с группировками.

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

Разработчик2: Можно результат компоновки выгрузить в ТЗ или в ДЗ, и потом вывести в документ.

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

Оставим эту команду, и посмотрим, какие у нас есть вообще способы кастомизировать отчеты?

 

Способы кастомизации отчетов:

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

Но есть и другой путь

Как у нас обычно происходит программное формирование отчета?

Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
	
	Настройки = КомпоновщикНастроек.ПолучитьНастройки();
	КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
	МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки ,, Тип("ГенераторМакетаКомпоновкиДанных"));	
	ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
	ПроцессорКомпоновки.Инициализировать(МакетКомпоновки,, ДанныеРасшифровки);

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

	// 1 вариант
	ПроцессорВывода.Вывести(ПроцессорКомпоновки);
	// 2 вариант
	ПроцессорВывода.НачатьВывод();	
	ЭлементРезультата = ПроцессорКомпоновки.Следующий();
	Пока ЭлементРезультата <> Неопределено  Цикл
		ПроцессорВывода.ВывестиЭлемент(ЭлементРезультата);
		ЭлементРезультата = ПроцессорКомпоновки.Следующий();
	КонецЦикла; 
	ПроцессорВывода.ЗакончитьВывод();
КонецПроцедуры

И вот во втором варианте, внутри цикла вывода элемента результата компоновки, мы можем использовать не стандартный вывод через ПроцессорВывода, а старый добрый вывод в табличный документ на основе макета с именованными секциями.

	ЭлементРезультата = ПроцессорКомпоновки.Следующий();
	Пока ЭлементРезультата <> Неопределено  Цикл
		
		Секция = МакетОтчета.ПолучитьОбласть(ИмяСекции);
		Секция.Параметры.Заполнить(ЗначенияПараметров);	
		// 1
		ДокументРезультат.Вывести(Секция);
		// или 2
		ДокументРезультат.Присоединить(Секция);

		ЭлементРезультата = ПроцессорКомпоновки.Следующий();
	КонецЦикла; 

Дело за малым - определить, какие секции в какой момент выводить и какими значениями заполнять их параметры.

Чем нам здесь может помочь ЭлементРезультата?

 

 

Макет содержит внутреннее имя макета, выводимого в табличный документ, с его помощью мы можем определить ту часть отчета, которая в данный момент выводится. ПроцентВывода нас пока не интересует, а ТипЭлемента и РасположениеВложенныхЭлементов пригодятся - с их помощью определим, надо ли секцию выводить с новой строки, или же присоединить к текущей. ЗначенияПараметров, как несложно догадаться, содержит коллекцию параметров для вывода элемента отчета:

 

 

В нашем случае "П1" - сумма по конкретному сотруднику за определенный период, "П2" - ИдентификаторРасшифровкиКомпоновкиДанных.

Код при этом может выглядеть примерно так:

Если ЭлементРезультата.Макет = "Макет38" Тогда			
	Секция = МакетОтчета.ПолучитьОбласть("Сотрудник|Период");
	Секция.Параметры.Сумма = ЗначениеПараметра(ЭлементРезультата, "П1");	
	Секция.Параметры.Расшифровка = ЗначениеПараметра(ЭлементРезультата, "П2");	
	ДокументРезультат.Присоединить(Секция);
КонецЕсли; 

где функция ЗначениеПараметра:

Функция ЗначениеПараметра(ЭлементРезультата, ИмяПараметра)
	Результат = Неопределено;
	Параметр = ЭлементРезультата.ЗначенияПараметров.Найти(ИмяПараметра);
	Если ТипЗнч(Параметр) = Тип("ЗначениеПараметраМакетаКомпоновкиДанных")  Тогда
		Результат = Параметр.Значение;	
	КонецЕсли; 
	
	Возврат Результат;
КонецФункции 

Чтобы не делать каскад условий для проверки имен макета, можно заранее определить список соответствий имен макетов СКД ("Макет38") и имен секций макета отчета ("Сотрудник|Период"). Заодно там же можно указать и признак вывода с новой строки. А чтобы не прописывать установку отдельных параметров секции макета, можно эти параметры заполнять из заранее созданной структуры (конечно же в этом случае параметры секций макета должны называться "П1", "П2" и т.д.).

Макеты = Новый Соответствие;
Макеты.Вставить("Макет38", Новый Структура("ИмяСекции,НоваяСтрока", "Сотрудник|Период", Ложь)); 
// ... добавляем другие соответствия	
ЗначенияПараметров = Новый Структура;
ЭлементРезультата = ПроцессорКомпоновки.Следующий();
Пока ЭлементРезультата <> Неопределено  Цикл
	ДанныеМакета = Макеты.Получить(ЭлементРезультата.Макет);
	Если ТипЗнч(ДанныеМакета) = Тип("Структура") Тогда   
		Секция = МакетОтчета.ПолучитьОбласть(ДанныеМакета.ИмяСекции);
		Для каждого Параметр Из ЭлементРезультата.ЗначенияПараметров Цикл   
			ЗначенияПараметров.Вставить(Параметр.Имя, Параметр.Значение);					
		КонецЦикла; 			
		Секция.Параметры.Заполнить(ЗначенияПараметров);				
		Если ДанныеМакета.НоваяСтрока Тогда   
			ДокументРезультат.Вывести(Секция);
		Иначе	
			ДокументРезультат.Присоединить(Секция);
		КонецЕсли; 
	КонецЕсли; 
	ЭлементРезультата = ПроцессорКомпоновки.Следующий();
КонецЦикла; 

 

 

Вот тот минимальный объем кода, который сформирует нам табличный документ с отчетом, и который можно в дальнейшем дорабатывать и усложнять. 

Значения расшифровки

При работе со значениями параметров макета компоновки данных выясняется одна неожиданная, но вполне объяснимая особенность. Если со значениями примитивных типов все нормально, то данные ссылочных типов хранятся в виде представления:

 

 

 

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

Сотрудник = ЗначениеРасшифровки(ДанныеРасшифровки, ЭлементРезультата, "П2", "Сотрудник");

Функция ЗначениеРасшифровки(ДанныеРасшифровки, ЭлементРезультата, ИмяПараметра, ИмяПараметраРасшифровки)
	Результат = Неопределено;	
	Параметр = ЭлементРезультата.ЗначенияПараметров.Найти(ИмяПараметра);
	Если ТипЗнч(Параметр) = Тип("ЗначениеПараметраМакетаКомпоновкиДанных")  Тогда
		Идентификатор = Параметр.Значение;		
		Если ТипЗнч(Идентификатор) = Тип("ИдентификаторРасшифровкиКомпоновкиДанных")  Тогда
			ЭлементРасшифровки = ДанныеРасшифровки.Элементы.Получить(Идентификатор);
			Если ТипЗнч(ЭлементРасшифровки) = Тип("ЭлементРасшифровкиКомпоновкиДанныхПоля")  Тогда
				Поля = ЭлементРасшифровки.ПолучитьПоля();
				Значение = Поля.Найти(ИмяПараметраРасшифровки);
				Если ТипЗнч(Значение) = Тип("ЗначениеПоляРасшифровкиКомпоновкиДанных")  Тогда
					Результат = Значение.Значение;
				КонецЕсли; 
			КонецЕсли; 
		КонецЕсли; 
	КонецЕсли; 	
	Возврат Результат;
КонецФункции 

Условное оформление

А как у нас обстоят дела с условным оформлением? Элементы условного оформления, например ЦветФона (при их наличии конечно же), тоже имеются в составе ЭлементРезультата.ЗначенияПараметров, откуда их можно извлечь и применить к оформлению ячейки.

 

 

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

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

 

Ячейка = ПолучитьЯчейкуОбласти(ДокументРезультатДляУО, 3, 2, 1, 1);
Секция.Область().ЦветФона = Ячейка.ЦветФона;

Функция ПолучитьЯчейкуОбласти(Таблица, ВысотаМакета, ШиринаМакета, СтрокаЯчейки, КолонкаЯчейки)
	Результат = Неопределено;
	Если Таблица.ВысотаТаблицы > 0 Тогда
		Область = Таблица.ПолучитьОбласть(Таблица.ВысотаТаблицы - ВысотаМакета + 1,, Таблица.ВысотаТаблицы);
		Результат = Область.Область(СтрокаЯчейки, Область.ШиринаТаблицы - ШиринаМакета + КолонкаЯчейки);					
	КонецЕсли; 
	Возврат Результат;
КонецФункции 

Обработка расшифровки в модуле формы

Что мы еще упустили? Очевидно, что наш отчет настроен под определенную структуру. А пользователь при работе с отчетом вполне может "расшифровать" ячейку и получить непредсказуемый результат. Надо бы лишить его этой возможности.

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

&НаСервере
Процедура ОтработатьРасшифровку(ОписаниеОбработкиРасшифровки)
  ДанныеРасшифровкиОбъект = ПолучитьИзВременногоХранилища(ДанныеРасшифровки);
  ОбработкаРасшифровки =  Новый ОбработкаРасшифровкиКомпоновкиДанных(ДанныеРасшифровкиОбъект, Новый ИсточникДоступныхНастроекКомпоновкиДанных(Отчет));
  РезультирующиеНастройки = ОбработкаРасшифровки.ПрименитьНастройки(ОписаниеОбработкиРасшифровки.Идентификатор, ОписаниеОбработкиРасшифровки.ПрименяемыеНастройки);
  Если ТипЗнч(РезультирующиеНастройки) = Тип("НастройкиКомпоновкиДанных") Тогда
    Отчет.КомпоновщикНастроек.ЗагрузитьНастройки(РезультирующиеНастройки);
  ИначеЕсли ТипЗнч(РезультирующиеНастройки) = Тип("ПользовательскиеНастройкиКомпоновкиДанных") Тогда
    Отчет.КомпоновщикНастроек.ЗагрузитьПользовательскиеНастройки(РезультирующиеНастройки);
  КонецЕсли;
  СкомпоноватьРезультат();
КонецПроцедуры

Инструмент анализа процесса компоновки

Вроде бы мы рассмотрели все аспекты, кроме одного: а как нам получить соответствие имен макетов СКД  и имен секций нашего макета отчета?

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

Здесь надо упомянуть о том, что при первой итерации цикла получения элементов результата, в ЭлементРезультата.Макеты содержится список описаний макетов областей компоновки данных. Из них можно взять и список параметров, и свойства самого макета, а потом связать все это с именем.

 

 

Для облегчения этого процесса в обработке предусмотрен вывод списка макетов и их параметров:

 

 

Понятно, что результат - табличный документ - состоит из этих областей макетов. А как они располагаются в отчете относительно друг друга? Для просмотра этого тоже есть средство:

 

 

Таким образом с помощью данной обработки легко понять, как связать имена макетов компоновки данных с именами секций своего макета и заполнить вышеупомянутое соответствие Макеты.

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

 

 

Подведем итоги

Рассмотренный способ обладает целым рядом преимуществ:

  • Максимальное соответствие внешнего вида шаблона и полученной формы отчета, WYSIWYG - наше всё! И даже можно устанавливать ширину колонок и она будет такой же в отчете!)).
  • Относительно небольшой объем кода, его простота, концентрация кода в одном месте (в отличие от настроек СКД, разбросанных по разным разделам)
  • Возможность пошаговой отладки.
  • Четкое разделение "зон ответственности" - вот здесь мы получаем некоторый объем данных, а вот здесь - выводим данные в отчет. (Добавление в запрос генерации названий колонок - зло!).
  • Полный контроль за выводом отдельных ячеек отчета - легко реализовать вывод разных секций в зависимости от выводимых данных (например, для контрагентов - юр.лиц выводим одну секцию, для физ.лиц - другую). Некоторые строки можно вообще пропускать (вспомним про знаменитую проблему вывода иерархического справочника).
  • Объединение произвольной группы ячеек, как горизонтальное, так и вертикальное - так же, как в примере отчета в статье. 
  • Возможность проведения расчетов, которые нельзя провести с помощью языка запросов и выражений СКД.
  • Возможность реализации нестандартного условного оформления, например, которое зависит не только от данных строки.
  • Простой и логичный способ получения данных накопления - нарастающий итог, иерархическая нумерация, разница текущего значения с последним из непустых предыдущих.
  • Такой же простой способ вывести картинки строк или другие внедренные в табличный документ объекты, например, диаграммы.
  • Возможность использовать ПроверитьВывод() и ПроверитьПрисоединение(), например для расчета итогов по странице при переменной высоте строк отчета (привет, товарная накладная!).
  • Вывод отчета в несколько "колонок". Пример из жизни: прайс-лист компьютерной фирмы: материнские платы выводятся одной таблицей на всю ширину страницы, память - двумя (по половине ширины страницы), манипуляторы - тремя.
  • Возможность использовать свою расшифровку произвольного вида - хоть ссылки, хоть структуру, хоть текст с подсказкой. Также можно убрать расшифровку из тех ячеек, где она не нужна.
  • Возможность использовать свою систему групп строк и колонок, определять свой список свернутых групп при открытии отчета

Конечно же есть и недостатки (я насчитал аж 3: один весомый и два малозначимых):

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

Методика, описанная в статье, была протестирована на платформе 8.3.18.1363.

На этом все. Как обычно приветствуются замечания / дополнения / комментарии.

К публикации приложены файлы: внешняя обработка - АнализПроцессаКомпоновки.epf  и архив с этой обработкой и выгрузкой информационной базы с рассмотренным в статье примером.

Вступайте в нашу телеграмм-группу Инфостарт

Отчет СКД Макет ПроцессорКомпоновки ПроцессорВывода ЭлементРезультата Расшифровка ДанныеРасшифровки ПриКомпоновкеРезультата

См. также

Инструментарий разработчика Роли и права Запросы СКД Программист Руководитель проекта 1С:Предприятие 8 Платные (руб)

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

16500 руб.

02.09.2020    256503    1418    421    

1160

Инструментарий разработчика СКД Программист 1С 8.3 Бесплатно (free)

В этой статье представлен СКДБилдер — общий модуль-обёртка над объектной моделью СКД, который сокращает код в 3-4 раза и делает его читаемым.

29.01.2026    6502    339    shapa_pro    27    

69

СКД Программист 1С:Предприятие 8 Бесплатно (free)

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

29.10.2025    18995    ovetgana    112    

112

СКД Программист 1С:Предприятие 8 Бесплатно (free)

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

01.07.2025    10998    krasnoshchekovpavel    5    

68

СКД Программист Стажер 1С:Предприятие 8 Россия Бесплатно (free)

Несколько способов управления формами выбора параметров и отборов СКД.

10.04.2025    10553    Neti    0    

41

СКД Программист 1С:Предприятие 8 Бесплатно (free)

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

27.02.2025    16560    ovetgana    50    

93

СКД Программист 1С:Предприятие 8 Бесплатно (free)

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

24.12.2024    14211    Akcium    17    

46

СКД Механизмы типовых конфигураций Запросы Программист 1С:Предприятие 8 1С:Зарплата и кадры государственного учреждения 3 1С:Зарплата и Управление Персоналом 3.x Россия Бесплатно (free)

Работая с типовыми отчетами в конфигурациях «Зарплата и управление персоналом, редакция 3», «Зарплата и кадры государственного учреждения, редакция 3» и подобных, в схемах компоновки данных можно встретить конструкции запросов, которые обращаются к некоторым виртуальным таблицам.

20.08.2024    11055    AlexeyPROSTO_1C    1    

32
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. TMV 2 22.03.22 17:57 Сейчас в теме
Но ведь многие отчеты ЗУП так и работают: Расчетный листок, 54 и т.д.
2. Alxby 1148 23.03.22 11:26 Сейчас в теме
(1)Признаться, я с ЗУПом работал еще до "эпохи СКД", так что вполне возможно. Хотя мне кажется, что там несколько другой подход.
3. RustIG 1954 31.03.22 12:31 Сейчас в теме
(0) отличная статья! Спасибо!
Что мы еще упустили? Очевидно, что наш отчет настроен под определенную структуру. А пользователь при работе с отчетом вполне может "расшифровать" ячейку и получить непредсказуемый результат. Надо бы лишить его этой возможности.

Для анализа и работы с отчетом - пользователю делаете стандартный СКД-шный отчет без выкрутасов.
Для печати красивого отчета на стол генерального используете жесткую структуру без расшифровок.
Вуаля!
5. Alxby 1148 31.03.22 15:59 Сейчас в теме
(3)Именно так!
Появление СКД отнюдь не делает другие методы устаревшими. Даже ПостроительЗапроса и ПостроительОтчета имеет свою область применения. А кто сейчас помнит про СводнаяТаблица и СводнаяДиаграмма?
tormozit; +1 Ответить
4. RustIG 1954 31.03.22 12:34 Сейчас в теме
(0)
Самый главный недостаток - "заточенность" под конкретную структуру отчета. Хотя недостатком это является весьма условно - есть много отчетов, для которых менять структуру пользователям просто не нужно.

Пора уже перестать чувствовать себя виноватым в том, что не все отчеты строятся на СКД, и всякий раз оправдываться, что есть недостаток ....
Сделали бы через вывод в ТабДок с заданным макетом - без всяких привязок ячеек и параметров для использования расшифровок...
1с-ники порой усложняют на пустом месте....
user845289; klaus38; mevgenym; ixijixi; +4 Ответить
6. Alxby 1148 31.03.22 16:03 Сейчас в теме
(4)
Сделали бы через вывод в ТабДок с заданным макетом - без всяких привязок ячеек и параметров для использования расшифровок...
1с-ники порой усложняют на пустом месте....

Вот здесь не согласен. СКД-шная система расшифровок довольно удобна. Я специально в примере отчета в статье рассмотрел оба варианта - со стандартной расшифровкой СКД и произвольной расшифровкой. Лучше предоставить разработчику возможность выбора в зависимости от задачи.
7. tormozit 7375 01.03.23 08:56 Сейчас в теме
Для удобного исследования макета компоновки в ИР есть это https://www.hostedredmine.com/issues/957660
8. Alxby 1148 01.03.23 09:00 Сейчас в теме
(7)Спасибо, посмотрим
9. zavis11 39 03.11.23 15:59 Сейчас в теме
Спасибо! Давно хотел овладеть данным механизмом, но к сожалению при попытке проанализировать схему выходит ошибка Не найден внешний набор данных "ОбработкаЗапроса"
Можете помочь с этим?
10. Alxby 1148 03.11.23 19:14 Сейчас в теме
(9)Пришлите в личку Ваш вариант, посмотрю
11. user845289 10.12.24 07:36 Сейчас в теме
Начали за здравие кончили за упокой.
Где обычный табДок и обычный рисованный руками макет?
Зачем навертели это все не нужное для вывода плоского отчета для эксель?
Да все хотят отчеты как в 7ке и да все хотят установленные изначально параметры желательно не пользователями , которые ни кто в жизни ни когда не будет менять.

В общем макет не совсем собственный , а пример очень сложный для понимания.
12. Alxby 1148 10.12.24 08:27 Сейчас в теме
(11) Жаль, что пример оказался сложным для понимания.
Статья как раз и посвящена вопросу как на основе СКД, перебирая в цикле результат, заполнить и вывести в табДок рисованный руками макет. Дополнительно показано как узнать имена параметров и секций для нашего макета. И, да, все этого пригодно не только для плоского отчета - см. образец "Начисления и удержания" в начале статьи.
13. user845289 10.12.24 08:53 Сейчас в теме
(12) У вас в рисованном макете все параметры П1 это вообще не добавляет понимания, сделайте нормальный пример с выводом кодом табдока всех строк с разными параметрами , а не через процессор компоновки.
Вы все сделали в конце опять сложно как и все в СКД.
Макет и код должен быть простым и понятным.
14. Alxby 1148 10.12.24 09:09 Сейчас в теме
(13) Имена параметров макета выбраны исходя из имен параметров в результате компоновщика. Разыменование сделать конечно же можно, только это удлинит код. Никто вам не мешает вместо Секция.Параметры.Заполнить() использовать несколько Секция.Параметр.<Имя> = <ЗначениеПараметраЭлементаРезультата>. В некоторых случаях это действительно будет наглядней. Но идею и смысл статьи это не меняет). Если уж совсем делать макет и код простым и понятным без процессора компоновки, тогда надо вообще отказаться от использования СКД, лишившись всех ее преимуществ.
Для отправки сообщения требуется регистрация/авторизация