Свой отчёт о продажах на СКД: от пустого макета до выгрузки в Excel

· 11 мин

Содержание

Отчет по продажам в Конфигураторе 1С 8.3 делают на схеме компоновки данных (СКД): Файл → Новый → Внешний отчет, кнопка Открыть схему компоновки данных, набор данных «Запрос» к реализациям или к регистру продаж, ресурсы на суммы и количество, параметр периода и вариант настроек с группировками. Код на встроенном языке для этого почти не нужен — всё собирается в конструкторах.

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

Ниже пример для 1С:Бухгалтерии 3.0, но схема та же для УТ 11, КА 2 и ERP — отличаются только имена объектов, из которых берутся данные.

Внешний отчёт или объект конфигурации: с чего начать

Сначала решите, где будет жить отчёт. От этого зависит, придётся ли трогать типовую конфигурацию .

ВариантКогда подходитЧем платите
Внешний отчёт (.erf)Разовая аналитика, отчёт для одного отдела, проверка идеиФайл нужно подключать в базу отдельно
Отчёт в расширении (.cfe)Отчёт нужен всем, должен быть в меню разделаРасширение надо проверять после обновлений
Отчёт прямо в конфигурацииСвоя, нетиповая конфигурацияВ типовой это снятие с поддержки и сложные обновления

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

Создаём внешний отчёт

  1. Откройте базу в Конфигураторе. Монопольный режим для работы с внешним отчётом не нужен.
  2. Выполните Файл → Новый → Внешний отчет.
  3. Задайте имя латиницей или кириллицей без пробелов, например ОтчетПоПродажам, и синоним «Отчёт по продажам».
  4. На вкладке Основные нажмите Открыть схему компоновки данных. Платформа создаст макет ОсновнаяСхемаКомпоновкиДанных и откроет конструктор схемы.
  5. Сохраните файл через Файл → Сохранить в папку, где его найдут пользователи.

Чтобы отчёт появился в меню «Дополнительные отчёты» в типовой конфигурации на БСП, в модуль объекта добавляют экспортную функцию СведенияОВнешнейОбработке(). Её формат описан в документации БСП. Без неё файл можно открыть только через Файл → Открыть в режиме 1С:Предприятие, если у пользователя есть такое право.

Если нужен отчёт внутри конфигурации

В расширении создайте новый объект в ветке Отчеты и так же откройте для него основную схему. Все шаги ниже от этого не меняются.

Не добавляйте отчёт напрямую в типовую конфигурацию, которая стоит на поддержке. Включение возможности изменения ломает автоматическое обновление — каждое следующее обновление придётся делать через сравнение и объединение.

Запрос по продажам: документы или регистр накопления

Данные о продажах можно взять из двух мест. От выбора зависит скорость и точность отчёта.

  • 📄 Табличные части документов реализации. Просто и наглядно: видна каждая строка накладной. Минус — придётся самому отсекать непроведённые документы, учитывать возвраты и корректировки.
  • 📊 Регистр накопления продаж. Здесь уже лежат движения проведённых документов, включая возвраты. В БП 3.0 это регистр Продажи, в УТ 11 и ERP — ВыручкаИСебестоимостьПродаж. Состав измерений и ресурсов посмотрите в дереве метаданных своей конфигурации.

Для первой версии отчёта и обучения удобнее документы. Для рабочего отчёта, который будут крутить за год по всей базе, — регистр.

Создаём набор данных

  1. На вкладке Наборы данных нажмите Добавить и выберите Добавить набор данных - запрос.
  2. Нажмите Конструктор запроса....
  3. В дереве таблиц раскройте Документы → РеализацияТоваровУслуг и выберите табличную часть Товары.
  4. Отметьте поля, нажмите ОК.

Готовый текст запроса для БП 3.0 выглядит так:

ВЫБРАТЬ
	Товары.Ссылка КАК Документ,
	НАЧАЛОПЕРИОДА(Товары.Ссылка.Дата, МЕСЯЦ) КАК Месяц,
	Товары.Ссылка.Организация КАК Организация,
	Товары.Ссылка.Контрагент КАК Контрагент,
	Товары.Номенклатура КАК Номенклатура,
	Товары.Количество КАК Количество,
	ВЫБОР
		КОГДА Товары.Ссылка.СуммаВключаетНДС
			ТОГДА Товары.Сумма - Товары.СуммаНДС
		ИНАЧЕ Товары.Сумма
	КОНЕЦ КАК СуммаБезНДС,
	Товары.СуммаНДС КАК СуммаНДС
ИЗ
	Документ.РеализацияТоваровУслуг.Товары КАК Товары
ГДЕ
	Товары.Ссылка.Проведен
	И Товары.Ссылка.Дата МЕЖДУ &НачалоПериода И &КонецПериода

Обратите внимание на флажок СуммаВключаетНДС в шапке документа. В БП 3.0 поле Сумма в табличной части может быть как с НДС, так и без него. Если просто сложить Сумма, отчёт смешает два вида строк и выручка «поплывёт».

💡 Услуги в БП 3.0 лежат в отдельной табличной части Услуги. Чтобы они попали в отчёт, добавьте в конструкторе запроса вкладку Объединения и второй запрос к Документ.РеализацияТоваровУслуг.Услуги с теми же псевдонимами полей.

Почему лучше перейти на регистр

Запрос к регистру через виртуальную таблицу оборотов передаёт период прямо в параметры таблицы:

ИЗ
	РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, Авто, ) КАК ПродажиОбороты

Периодичность Авто — особенность СКД. Она добавляет в доступные поля ПериодДень, ПериодМесяц, ПериодГод, и пользователь сам выбирает, по каким периодам группировать. Ручное НАЧАЛОПЕРИОДА в этом случае не нужно.

Схема компоновки данных: ресурсы, вычисляемые поля, вариант отчёта

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

Ресурсы — то, что суммируется

Перейдите на вкладку Ресурсы и перенесите туда Количество, СуммаБезНДС и СуммаНДС. По умолчанию платформа предложит выражение Сумма(...) — для продаж это то, что нужно.

Средняя цена продажи — частый запрос от коммерческого отдела. Считать её как Среднее(Цена) неверно: строка на 1 шт. и строка на 1 000 шт. получат одинаковый вес. Правильное выражение ресурса:

ВЫБОР
	КОГДА Сумма(Количество) = 0
		ТОГДА 0
	ИНАЧЕ Сумма(СуммаБезНДС) / Сумма(Количество)
КОНЕЦ

Пример: 10 шт. по 100 руб. и 90 шт. по 200 руб. дают 19 000 руб. за 100 шт. Взвешенная цена — 190 руб., простое среднее — 150 руб. Разница в 40 руб. на единицу легко исказит выводы о скидках.

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

Вычисляемые поля

Вкладка Вычисляемые поля пригодится для того, что неудобно писать в запросе. Например, поле «Доля НДС»: ВЫБОР КОГДА СуммаБезНДС = 0 ТОГДА 0 ИНАЧЕ СуммаНДС / СуммаБезНДС * 100 КОНЕЦ. Вычисляемые поля работают после выборки данных, поэтому на скорость запроса не влияют.

Вариант отчёта

  1. Откройте вкладку Настройки.
  2. Нажмите кнопку конструктора настроек (значок волшебной палочки), выберите тип Список.
  3. Добавьте группировки: Контрагент, внутри — Номенклатура.
  4. В Выбранные поля перенесите ресурсы.
  5. Закройте конструктор и откройте отчёт в режиме 1С:Предприятие через Отладка → Начать отладку, чтобы проверить вывод.

Если нужна сводная таблица «номенклатура по месяцам», выберите в конструкторе тип Таблица: строки — Номенклатура, колонки — Месяц. На каждом пересечении СКД сама выведет ресурсы.

Параметры отчёта: период, организация и отборы для пользователя

Без настройки параметров пользователь увидит в форме отчёта две голые даты НачалоПериода и КонецПериода. Удобнее один выбор периода, как в типовых отчётах.

Стандартный период вместо двух дат

  1. На вкладке Параметры добавьте параметр Период с типом СтандартныйПериод.
  2. Для параметра НачалоПериода в колонке Выражение укажите &Период.ДатаНачала.
  3. Для КонецПериода — &Период.ДатаОкончания.
  4. У обоих параметров-дат установите флажок Ограничение доступности, чтобы пользователь не менял их напрямую.
  5. На вкладке Настройки отметьте Период в Параметрах данных и задайте значение по умолчанию, например «Этот месяц».

ДатаОкончания стандартного периода — конец дня (23:59:59). Если оставить простую дату КонецПериода без времени, отчёт потеряет продажи последнего дня. Это одна из самых частых «пропаж» выручки в самописных отчётах.

Отборы в шапке формы

Отборы по организации, складу или контрагенту не надо добавлять в запрос параметрами. СКД умеет фильтровать по любому доступному полю.

  1. На вкладке Настройки → Отбор добавьте поле Организация, вид сравнения Равно, флажок использования снимите.
  2. Выделите строку и нажмите кнопку Свойства элемента пользовательских настроек.
  3. Установите Включать в пользовательские настройки и режим редактирования Быстрый доступ.

Такой отбор появится прямо в форме отчёта. Пользователь включит его галочкой и выберет организацию. То же самое делается для группировок и полей: пользователь сможет сам перестраивать отчёт, не трогая Конфигуратор.

💡 Если отчёт нужен руководителю «одной кнопкой», заведите на вкладке Настройки несколько вариантов: «По клиентам», «По товарам», «По месяцам». Варианты добавляются кнопкой над деревом настроек, и пользователь переключается между ними в форме.

Производительность: отчёт по продажам на большой базе

Отчёт, который за месяц формируется за секунду, на годе и 300 000 строк реализаций может считаться минуты. Основные причины и что с ними делать:

  • 🐢 Обращение к реквизитам через точку. Каждое Товары.Ссылка.Контрагент — неявное соединение с таблицей документа. Одно-два — терпимо. Если цепочки длинные (Номенклатура.Родитель.Родитель), выносите их в отдельные поля СКД или в соединения.
  • 🐢 Документы вместо регистра. Запрос к табличным частям читает каждую строку каждого документа. Виртуальная таблица оборотов регистра на больших периодах использует итоги и работает в разы быстрее.
  • 🐢 Условия в ГДЕ вместо параметров виртуальной таблицы. Отбор по организации в ГДЕ применяется после получения всех оборотов. В параметре Условие виртуальной таблицы — до.
  • 🐢 Составные типы. Поле Регистратор или Документ составного типа при разыменовании соединяется со всеми таблицами типов. Ограничьте его через ВЫРАЗИТЬ(... КАК Документ.РеализацияТоваровУслуг).

Фигурные скобки в запросе СКД

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

ИЗ
	РегистрНакопления.Продажи.Обороты(
		&НачалоПериода,
		&КонецПериода,
		Авто,
		{(Номенклатура).* КАК Номенклатура,
		 (Контрагент).* КАК Контрагент}) КАК ПродажиОбороты

Так отбор по номенклатуре или контрагенту из формы попадёт прямо в параметры виртуальной таблицы. Для запроса к документам аналог — блок {ГДЕ Товары.Ссылка.Организация.* КАК Организация}.

Проверка на реальных объёмах

Перед передачей пользователям сформируйте отчёт за самый длинный период, который им может понадобиться. Включите замер производительности в отладчике (Отладка → Замер производительности) и посмотрите, где уходит время. Если на запрос — смотрите его план, если на вывод — уменьшайте число группировок и полей.

Не тестируйте тяжёлый отчёт в рабочее время на основной базе: долгий запрос нагружает сервер СУБД, и замедлится работа остальных пользователей. Лучше развернуть копию.

Вывод результата, расшифровка и выгрузка в Excel

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

Когда нужен свой обработчик

Код пишут, если нужно что-то сделать с результатом: добавить шапку с реквизитами организации, передать в схему значения из внешнего источника или подменить настройки. Для этого в модуле объекта отчёта определите обработчик ПриКомпоновкеРезультата:

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

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

	Настройки = КомпоновщикНастроек.ПолучитьНастройки();

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

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

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

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

Этот код повторяет стандартное поведение. Свои действия вставляются между получением настроек и выводом — например, ДокументРезультат.Очистить() и вывод шапки из макета перед строкой ПроцессорВывода.Вывести.

Если поставить СтандартнаяОбработка = Ложь и не передать ДанныеРасшифровки в компоновщик, расшифровка по двойному щелчку перестанет работать. Пользователи заметят это сразу.

Выгрузка в Excel

Пользователь сохраняет готовый отчёт кнопкой сохранения на панели формы и выбирает формат «Лист Microsoft Excel 2007 (*.xlsx)». Группировки при этом сохраняются как свёрнутые строки Excel.

Если выгрузку нужно делать по расписанию или из обработки, табличный документ записывают в файл кодом на сервере:

ДокументРезультат.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.XLSX);

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

Частые ошибки при разработке отчёта по продажам

  • ❌ Выручка не совпадает с оборотом по счёту 90.01. Отчёт по документам не видит корректировок реализации и возвратов, а иногда и ручных операций. Сверяйте с регистром или с оборотно-сальдовой ведомостью и объясните пользователю, что именно показывает отчёт.
  • ❌ Продажи задваиваются. Обычно из-за соединения табличной части с другой таблицей «многие ко многим», например с ценами номенклатуры без отбора по дате. Проверьте количество строк до и после соединения.
  • ❌ Итоги по группе не равны сумме строк. Поле добавлено в выбранные поля, но не в ресурсы. СКД выводит его только на детальных записях, а в группах — пусто или первое значение.
  • ❌ Отчёт открывается с пустым периодом. Параметр Период не отмечен в параметрах данных варианта или у него нет значения по умолчанию.
  • ❌ У менеджера отчёт не открывается. Нет права на интерактивное открытие внешних отчётов или на чтение нужных документов и регистров. Это настраивается в профилях групп доступа, а не в самом отчёте.
Перед передачей отчёта пользователям
Выполнено: 0 / 6

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

Можно ли сделать отчёт по продажам без программирования?
Да. Запрос собирается конструктором, ресурсы и группировки — мышью в СКД. Код нужен только для нестандартного вывода или регистрации в «Дополнительных отчётах».
Как добавить в отчёт себестоимость и валовую прибыль?
Возьмите данные из регистра, где есть себестоимость продаж (в УТ 11 и ERP — ВыручкаИСебестоимостьПродаж), и добавьте ресурс «Прибыль» как разницу выручки и себестоимости. В БП 3.0 себестоимость берут из бухгалтерских оборотов по счёту 90.02.
Как показать в отчёте продажи по менеджерам?
Если ответственный хранится в документе, добавьте реквизит Ответственный из шапки реализации в запрос и сделайте по нему группировку. Если менеджер закреплён за клиентом — берите поле из карточки контрагента или партнёра.
Почему отчёт в файловой базе быстрый, а в клиент-серверной медленный?
Обычно дело в плане запроса на СУБД: устаревшая статистика, отсутствие подходящего индекса для отбора. Обновите статистику средствами СУБД и проверьте, не стоят ли тяжёлые условия в ГДЕ вместо параметров виртуальной таблицы.
Как сделать диаграмму продаж по месяцам?
Добавьте в вариант настроек элемент Диаграмма: точки — Месяц, серии — например, группа номенклатуры, значения — СуммаБезНДС. Диаграмма строится из тех же данных, что и таблица.