Отчет на СКД: пошаговое создание с нуля в 1С 8.3

Дата: 02.10.2026 23:13:15
СКД
Отчеты
Компоновка данных
Конфигуратор
УТ 11
Комментарий:
0
Платформа:
8.3
Конфигурация:
Любая
Формы:
Управляемые

Отчет на СКД в 1С 8.3 почти целиком собирается настройками схемы в конфигураторе. Разберем, как сделать отчет в 1С на СКД на одном сквозном примере — «Продажи по менеджерам и клиентам» на регистре ВыручкаИСебестоимостьПродаж из УТ 11: от пустого объекта до таблицы с итогами, периодом, быстрыми отборами и подсветкой. Затем сформируем тот же отчет из кода и добавим обработчик ПриКомпоновкеРезультата. Устройство схемы описано в статье о СКД, другие способы получить отчет — в обзоре как сделать отчет в 1С.

Что получится в конце

УровеньЧто выводится
Менеджеритоги по всем его клиентам
Клиентитоги клиента, крупные клиенты сверху
Номенклатураколичество, выручка и средняя цена
Общий итогсумма по всем менеджерам

Над таблицей — период и отборы по менеджеру и клиенту, строки с отрицательной выручкой красные. Запрос шага 2 написан для УТ 11 и КА 2.5, в других конфигурациях меняется только он.

Как создать отчет на СКД: шаги в конфигураторе

Шаг 1. Отчет и основная схема компоновки

В дереве конфигурации щелкните правой кнопкой по ветке «Отчеты» → «Добавить». Имя — ПродажиПоМенеджерамИКлиентам, синоним — «Продажи по менеджерам и клиентам», он станет заголовком окна. На вкладке «Основные» нажмите кнопку открытия у свойства «Основная схема компоновки данных»: конструктор макета предложит тип «Схема компоновки данных» и имя ОсновнаяСхемаКомпоновкиДанных. Нажмите «Готово» — откроется пустой редактор схемы.

Если типовую конфигурацию менять нельзя, создайте отчет в расширении — шаги те же, права выдаются ролью расширения; для разовой задачи хватит внешнего отчета.

Шаг 2. Набор данных — запрос

На вкладке «Наборы данных» нажмите «Добавить» → «Добавить набор данных - запрос» и вставьте текст ниже. Проверить выборку заранее удобно в консоли запросов.

// Набор данных «НаборДанных1». УТ 11, КА 2.5: регистр «Выручка и себестоимость продаж»
ВЫБРАТЬ
	Продажи.Менеджер КАК Менеджер,
	Продажи.АналитикаУчетаПоПартнерам.Партнер КАК Клиент,
	Продажи.АналитикаУчетаНоменклатуры.Номенклатура КАК Номенклатура,
	Продажи.КоличествоОборот КАК Количество,
	Продажи.СуммаВыручкиОборот КАК Выручка
ИЗ
	РегистрНакопления.ВыручкаИСебестоимостьПродаж.Обороты(&НачалоПериода, &КонецПериода, , ) КАК Продажи

Флажок «Автозаполнение» оставьте включенным: поля набора и параметры виртуальной таблицы схема создаст сама. Группировать и суммировать в запросе не нужно — это работа компоновки. Клиент и номенклатура берутся через ключи аналитики — измерения АналитикаУчетаПоПартнерам и АналитикаУчетаНоменклатуры. Возвраты регистр хранит с минусом, так что выручка сразу за их вычетом. Заголовки и формат полей задаются в верхней таблице набора, подробнее — в статье о полях СКД.

Шаг 3. Ресурсы и итоги

На вкладке «Ресурсы» выделите слева Количество и Выручка и перенесите их кнопкой «>». Выражения Сумма(Количество) и Сумма(Выручка) подставятся сами. Колонку «Рассчитывать по...» оставьте пустой — итоги посчитаются во всех группировках и в общем итоге. Поле, не добавленное в ресурсы, в строках группировок остается пустым.

Шаг 4. Параметр «Период» и связь с запросом

На вкладке «Параметры» уже есть НачалоПериода и КонецПериода. Добавьте параметр Период и выразите через него обе даты:

ПараметрТипЗначение или выражениеОграничение доступности
ПериодСтандартный периодзначение «Этот месяц»нет
НачалоПериодаДата, состав «Дата и время»выражение &Период.ДатаНачалада
КонецПериодаДата, состав «Дата и время»выражение &Период.ДатаОкончанияда

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

Шаг 5. Вычисляемое поле «Средняя цена»

На вкладке «Вычисляемые поля» нажмите «Добавить»: путь к данным СредняяЦена, заголовок «Средняя цена», в колонке «Оформление» — два знака после запятой. Выражение поля считается в детальных строках, а в группировках цену дает ресурс, поэтому добавьте СредняяЦена и на вкладку «Ресурсы»:

ГдеВыражение
Вычисляемое полеВЫБОР КОГДА Количество = 0 ТОГДА 0 ИНАЧЕ Выручка / Количество КОНЕЦ
Ресурс, «Рассчитывать по...»: НоменклатураВЫБОР КОГДА Сумма(Количество) = 0 ТОГДА 0 ИНАЧЕ Сумма(Выручка) / Сумма(Количество) КОНЕЦ

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

Шаг 6. Структура: группировки вместо детальных записей

На вкладке «Настройки» щелкните правой кнопкой по корню «Отчет» → «Новая группировка», поле Менеджер. Внутри нее добавьте группировку Клиент, в нее — Номенклатура. У корня на нижней вкладке «Выбранные поля» отметьте Количество, Выручка и СредняяЦена, иначе колонок ресурсов не будет. У группировки «Клиент» на вкладке «Порядок» задайте Выручка по убыванию.

Детальные записи (группировка без полей) выводят строки запроса как есть и здесь дали бы дубли: у пары «клиент — товар» бывает несколько ключей аналитики — другой договор, склад или серия. Группировка по полю Номенклатура сворачивает их в одну строку. Про типы группировок — в статье о группировках СКД.

Шаг 7. Условное оформление

Выделите корень «Отчет», нижняя вкладка «Условное оформление» → «Добавить». В колонке «Условие» задайте Выручка «Меньше» 0, в колонке «Оформление» — красный цвет текста. Если «Оформляемые поля» оставить пустыми, покрасится вся строка, если указать Выручка — одна ячейка. Красная строка значит, что за период вернули больше, чем продали.

Шаг 8. Быстрые отборы на форме

На нижней вкладке «Отбор» добавьте Менеджер и Клиент с видом сравнения «В списке» и снимите флажки: пока значения не выбраны, отбор не действует. Для каждой строки нажмите «Свойства элемента пользовательских настроек», включите «Включать в пользовательские настройки» и режим «Быстрый доступ». То же — для параметра Период на вкладке «Параметры»; отметьте у него флажок, иначе даты останутся пустыми. Три поля появятся над результатом отчета, подробнее — в статье о настройке отчета.

Шаг 9. Вариант по умолчанию

Все, что задано на вкладке «Настройки», хранится в варианте «Основной», созданном вместе со схемой. Задайте ему представление «Продажи по менеджерам» — это название увидит пользователь. Если добавить второй вариант, при первом открытии отчет возьмет первый в списке; его же код получает как НастройкиПоУмолчанию схемы. Сохранение и сброс вариантов — в статье о вариантах отчета.

Шаг 10. Проверка в режиме «Предприятие»

Нажмите F5 и согласитесь обновить конфигурацию базы данных. Откройте «Все функции → Отчеты → Продажи по менеджерам и клиентам» (команда «Все функции» включается в «Главное меню → Сервис → Параметры») и нажмите «Сформировать». Проверьте:

  • итог менеджера равен сумме его клиентов, общий итог — сумме менеджеров;
  • средняя цена есть только в строках товаров;
  • смена периода и отбор по менеджеру меняют цифры;
  • двойной щелчок по сумме открывает расшифровку.

Для пользователей включите отчет в подсистему раздела и дайте права «Использование» и «Просмотр» в роли.

Формирование отчета из кода в табличный документ

Без формы отчет нужен в рассылке, регламентном задании или по кнопке в документе. Функция модуля менеджера берет схему и вариант по умолчанию, подставляет период и менеджера и проводит данные по цепочке «компоновщик макета → процессор компоновки → процессор вывода». Общие приемы — в статье СКД программно.

// Модуль менеджера отчета ПродажиПоМенеджерамИКлиентам

#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда

#Область ПрограммныйИнтерфейс

// Формирует отчет без открытия формы: для рассылки, регламентного задания
// или кнопки в другом объекте.
//
// Параметры:
//  НачалоПериода - Дата - первый день периода.
//  КонецПериода  - Дата - последний день периода, время можно не указывать.
//  Менеджер      - СправочникСсылка.Пользователи, Неопределено - отбор по менеджеру.
//
// Возвращаемое значение:
//  ТабличныйДокумент - готовый отчет с группировками и итогами.
//
Функция СформироватьТабличныйДокумент(НачалоПериода, КонецПериода, Менеджер = Неопределено) Экспорт

	Если Не ЗначениеЗаполнено(НачалоПериода) Или Не ЗначениеЗаполнено(КонецПериода) Тогда
		ВызватьИсключение НСтр("ru = 'Не задан период отчета'");
	КонецЕсли;

	СхемаКомпоновки = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");

	// Вариант по умолчанию: группировки, порядок и оформление из шагов 6-9.
	Компоновщик = Новый КомпоновщикНастроекКомпоновкиДанных;
	Компоновщик.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновки));
	Компоновщик.ЗагрузитьНастройки(СхемаКомпоновки.НастройкиПоУмолчанию);
	Настройки = Компоновщик.ПолучитьНастройки();

	// Даты для запроса схема вычислит из параметра Период сама.
	Период = Новый СтандартныйПериод;
	Период.Вариант = ВариантСтандартногоПериода.ПроизвольныйПериод;
	Период.ДатаНачала = НачалоДня(НачалоПериода);
	Период.ДатаОкончания = КонецДня(КонецПериода);

	ЗначениеПериода = Настройки.ПараметрыДанных.НайтиЗначениеПараметра(
		Новый ПараметрКомпоновкиДанных("Период"));
	Если ЗначениеПериода = Неопределено Тогда
		ВызватьИсключение НСтр("ru = 'В схеме отчета нет доступного параметра Период'");
	КонецЕсли;
	ЗначениеПериода.Значение = Период;
	ЗначениеПериода.Использование = Истина;

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

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

	ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
	ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);

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

	Возврат Результат;

КонецФункции

#КонецОбласти

#КонецЕсли

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

// Модуль формы заказа клиента. Команда ПродажиМенеджераЗаМесяц
// добавлена в форму через расширение.

&НаКлиенте
Процедура ПродажиМенеджераЗаМесяц(Команда)

	Если Не ЗначениеЗаполнено(Объект.Менеджер) Тогда
		ПоказатьПредупреждение(, НСтр("ru = 'В заказе не указан менеджер'"));
		Возврат;
	КонецЕсли;

	Результат = ПродажиМенеджераНаСервере(Объект.Менеджер);
	Результат.Показать(НСтр("ru = 'Продажи менеджера за текущий месяц'"));

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

&НаСервереБезКонтекста
Функция ПродажиМенеджераНаСервере(Менеджер)

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

КонецФункции

Обработчик ПриКомпоновкеРезультата в модуле объекта

По кнопке «Сформировать» платформа вызывает ПриКомпоновкеРезультата модуля объекта отчета — здесь удобно поправить настройки перед компоновкой. Наш обработчик подставляет текущий месяц, если период выключен или не заполнен, чтобы отчет не читал регистр за все годы, и выводит над таблицей заголовок с периодом вместо стандартной строки «Параметры».

// Модуль объекта отчета ПродажиПоМенеджерамИКлиентам

#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда

#Область ОбработчикиСобытий

Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)

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

	// Вариант вместе со значениями, которые пользователь выбрал над отчетом.
	Настройки = ЭтотОбъект.КомпоновщикНастроек.ПолучитьНастройки();
	Период = ПериодОтчета(Настройки);

	ЗаголовокОтчета = СтрШаблон(НСтр("ru = 'Продажи по менеджерам и клиентам: %1'"),
		ПредставлениеПериода(Период.ДатаНачала, Период.ДатаОкончания));
	Настройки.ПараметрыВывода.УстановитьЗначениеПараметра("ВыводитьЗаголовок",
		ТипВыводаТекстаКомпоновкиДанных.Выводить);
	Настройки.ПараметрыВывода.УстановитьЗначениеПараметра("Заголовок", ЗаголовокОтчета);
	// Период уже в заголовке, отдельная строка «Параметры: Период ...» не нужна.
	Настройки.ПараметрыВывода.УстановитьЗначениеПараметра("ВыводитьПараметрыДанных",
		ТипВыводаТекстаКомпоновкиДанных.НеВыводить);

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

	ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
	ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки);

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

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

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

// Возвращает период из настроек. Если флажок периода снят или нет одной
// из дат, подставляет текущий месяц, чтобы отчет не читал регистр за все годы.
//
// Параметры:
//  Настройки - НастройкиКомпоновкиДанных - настройки, которые пойдут в компоновку.
//
// Возвращаемое значение:
//  СтандартныйПериод
//
Функция ПериодОтчета(Настройки)

	ЗначениеПериода = Настройки.ПараметрыДанных.НайтиЗначениеПараметра(
		Новый ПараметрКомпоновкиДанных("Период"));
	Если ЗначениеПериода = Неопределено Тогда
		ВызватьИсключение НСтр("ru = 'В схеме отчета нет доступного параметра Период'");
	КонецЕсли;

	Период = ЗначениеПериода.Значение;
	ПериодЗадан = ЗначениеПериода.Использование
		И ТипЗнч(Период) = Тип("СтандартныйПериод")
		И ЗначениеЗаполнено(Период.ДатаНачала)
		И ЗначениеЗаполнено(Период.ДатаОкончания);

	Если Не ПериодЗадан Тогда
		Период = Новый СтандартныйПериод;
		Период.Вариант = ВариантСтандартногоПериода.ЭтотМесяц;
		ЗначениеПериода.Значение = Период;
		ЗначениеПериода.Использование = Истина;
	КонецЕсли;

	Возврат Период;

КонецФункции

#КонецОбласти

#КонецЕсли

Разбор ключевых строк

  • ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных") каждый раз возвращает новую копию схемы — ее можно менять.
  • ЗагрузитьНастройки(СхемаКомпоновки.НастройкиПоУмолчанию) приносит в код все, что настроено на шагах 6–9; код добавляет только период и менеджера.
  • Даты пишутся в параметр Период — НачалоПериода и КонецПериода схема вычисляет из него. Без Использование = Истина обе даты будут пустыми.
  • КонецДня(КонецПериода) — иначе граница придется на полночь и последний день выпадет.
  • КомпоновщикНастроек.ПолучитьНастройки() отдает вариант вместе со значениями с формы. В КомпоновщикНастроек.Настройки их нет, и быстрые отборы не сработали бы.
  • ДанныеРасшифровки передаются и в Выполнить, и в Инициализировать — без этого пропадет расшифровка. Функции менеджера она не нужна.
  • СтандартнаяОбработка = Ложь — иначе после вашего кода платформа скомпонует отчет еще раз.

Типичные ошибки

  • В ячейках текст «Деление на 0». Количество обнулилось, когда возврат перекрыл продажу, и компоновка вывела ошибку прямо в ячейку. Делите только внутри ВЫБОР КОГДА ... = 0.
  • Средняя цена в итогах — сумма цен. У ресурса осталось Сумма(СредняяЦена) вместо «сумма выручки / сумма количества».
  • Товар у клиента повторяется. Вместо группировки по полю Номенклатура добавлены детальные записи.
  • Нет продаж за последний день. У КонецПериода состав «Дата» или из кода передана дата без КонецДня().
  • Над отчетом три поля с датами. У НачалоПериода и КонецПериода не стоит «Ограничение доступности».
  • «Значение не является значением объектного типа (Значение)». Параметр в схеме переименовали, и НайтиЗначениеПараметра вернул Неопределено, поэтому в листингах результат поиска проверяется.
  • После правки схемы отчет выглядит по-старому. Поверх варианта лежат сохраненные настройки пользователя — помогает команда «Стандартные настройки».

Частые вопросы

Можно ли обойтись без изменения типовой конфигурации?

Да: те же шаги выполняются во внешнем отчете (.erf) или в расширении. Внешний подходит для разовой задачи, расширение — когда отчет нужен в интерфейсе постоянно. Без программиста начните с универсального отчета.

Нужно ли рисовать форму для отчета СКД в 1С?

Нет, форму с результатом и быстрыми настройками платформа строит по схеме сама, своя нужна только для нестандартных элементов. В УТ 11 новый отчет, как и типовые отчеты на СКД, открывается в общей форме отчетов.

Как показать долю менеджера в общей выручке?

Создайте вычисляемое поле ДоляВыручки с выражением 0 (детальных строк в отчете нет) и форматом в один знак после запятой, а в ресурсах задайте для него ВЫБОР КОГДА ВычислитьВыражение("Сумма(Выручка)", "ОбщийИтог") = 0 ТОГДА 0 ИНАЧЕ 100 * Сумма(Выручка) / ВычислитьВыражение("Сумма(Выручка)", "ОбщийИтог") КОНЕЦ. Функция берет выручку в контексте общего итога, и в строке получается процент от нее.

Почему отчет формируется долго?

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

Когда проще заказать

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

По теме

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

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


1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.