Свой отчёт о продажах на СКД: от пустого макета до выгрузки в Excel
Содержание
Отчет по продажам в Конфигураторе 1С 8.3 делают на схеме компоновки данных (СКД): Файл → Новый → Внешний отчет, кнопка Открыть схему компоновки данных, набор данных «Запрос» к реализациям или к регистру продаж, ресурсы на суммы и количество, параметр периода и вариант настроек с группировками. Код на встроенном языке для этого почти не нужен — всё собирается в конструкторах.
Частое заблуждение — что отчёт надо «рисовать» в макете табличного документа и заполнять циклом. Так писали в 8.1. Сейчас макет вручную нужен только для печатных форм. Отчёт на СКД сам даёт пользователю отборы, группировки, расшифровку и сохранение вариантов, а разработчику остаётся правильный запрос и настройки.
Ниже пример для 1С:Бухгалтерии 3.0, но схема та же для УТ 11, КА 2 и ERP — отличаются только имена объектов, из которых берутся данные.
Внешний отчёт или объект конфигурации: с чего начать
Сначала решите, где будет жить отчёт. От этого зависит, придётся ли трогать типовую конфигурацию .
| Вариант | Когда подходит | Чем платите |
|---|---|---|
| Внешний отчёт (.erf) | Разовая аналитика, отчёт для одного отдела, проверка идеи | Файл нужно подключать в базу отдельно |
| Отчёт в расширении (.cfe) | Отчёт нужен всем, должен быть в меню раздела | Расширение надо проверять после обновлений |
| Отчёт прямо в конфигурации | Своя, нетиповая конфигурация | В типовой это снятие с поддержки и сложные обновления |
Для типовых баз разумный путь — внешний отчёт на этапе разработки, а потом перенос в расширение или регистрация как дополнительного отчёта.
Создаём внешний отчёт
- Откройте базу в Конфигураторе. Монопольный режим для работы с внешним отчётом не нужен.
- Выполните
Файл → Новый → Внешний отчет. - Задайте имя латиницей или кириллицей без пробелов, например
ОтчетПоПродажам, и синоним «Отчёт по продажам». - На вкладке
ОсновныенажмитеОткрыть схему компоновки данных. Платформа создаст макетОсновнаяСхемаКомпоновкиДанныхи откроет конструктор схемы. - Сохраните файл через
Файл → Сохранитьв папку, где его найдут пользователи.
Чтобы отчёт появился в меню «Дополнительные отчёты» в типовой конфигурации на БСП, в модуль объекта добавляют экспортную функцию СведенияОВнешнейОбработке(). Её формат описан в документации БСП. Без неё файл можно открыть только через Файл → Открыть в режиме 1С:Предприятие, если у пользователя есть такое право.
Если нужен отчёт внутри конфигурации
В расширении создайте новый объект в ветке Отчеты и так же откройте для него основную схему. Все шаги ниже от этого не меняются.
Не добавляйте отчёт напрямую в типовую конфигурацию, которая стоит на поддержке. Включение возможности изменения ломает автоматическое обновление — каждое следующее обновление придётся делать через сравнение и объединение.
Запрос по продажам: документы или регистр накопления
Данные о продажах можно взять из двух мест. От выбора зависит скорость и точность отчёта.
- 📄 Табличные части документов реализации. Просто и наглядно: видна каждая строка накладной. Минус — придётся самому отсекать непроведённые документы, учитывать возвраты и корректировки.
- 📊 Регистр накопления продаж. Здесь уже лежат движения проведённых документов, включая возвраты. В БП 3.0 это регистр
Продажи, в УТ 11 и ERP —ВыручкаИСебестоимостьПродаж. Состав измерений и ресурсов посмотрите в дереве метаданных своей конфигурации.
Для первой версии отчёта и обучения удобнее документы. Для рабочего отчёта, который будут крутить за год по всей базе, — регистр.
Создаём набор данных
- На вкладке
Наборы данныхнажмитеДобавитьи выберитеДобавить набор данных - запрос. - Нажмите
Конструктор запроса.... - В дереве таблиц раскройте
Документы → РеализацияТоваровУслуги выберите табличную частьТовары. - Отметьте поля, нажмите
ОК.
Готовый текст запроса для БП 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С:Предприятие через
Отладка → Начать отладку, чтобы проверить вывод.
Если нужна сводная таблица «номенклатура по месяцам», выберите в конструкторе тип Таблица: строки — Номенклатура, колонки — Месяц. На каждом пересечении СКД сама выведет ресурсы.
Параметры отчёта: период, организация и отборы для пользователя
Без настройки параметров пользователь увидит в форме отчёта две голые даты НачалоПериода и КонецПериода. Удобнее один выбор периода, как в типовых отчётах.
Стандартный период вместо двух дат
- На вкладке
Параметрыдобавьте параметрПериодс типомСтандартныйПериод. - Для параметра
НачалоПериодав колонкеВыражениеукажите&Период.ДатаНачала. - Для
КонецПериода—&Период.ДатаОкончания. - У обоих параметров-дат установите флажок
Ограничение доступности, чтобы пользователь не менял их напрямую. - На вкладке
НастройкиотметьтеПериодвПараметрах данныхи задайте значение по умолчанию, например «Этот месяц».
ДатаОкончания стандартного периода — конец дня (23:59:59). Если оставить простую дату КонецПериода без времени, отчёт потеряет продажи последнего дня. Это одна из самых частых «пропаж» выручки в самописных отчётах.
Отборы в шапке формы
Отборы по организации, складу или контрагенту не надо добавлять в запрос параметрами. СКД умеет фильтровать по любому доступному полю.
- На вкладке
Настройки→Отбордобавьте полеОрганизация, вид сравненияРавно, флажок использования снимите. - Выделите строку и нажмите кнопку
Свойства элемента пользовательских настроек. - Установите
Включать в пользовательские настройкии режим редактированияБыстрый доступ.
Такой отбор появится прямо в форме отчёта. Пользователь включит его галочкой и выберет организацию. То же самое делается для группировок и полей: пользователь сможет сам перестраивать отчёт, не трогая Конфигуратор.
💡 Если отчёт нужен руководителю «одной кнопкой», заведите на вкладке Настройки несколько вариантов: «По клиентам», «По товарам», «По месяцам». Варианты добавляются кнопкой над деревом настроек, и пользователь переключается между ними в форме.
Производительность: отчёт по продажам на большой базе
Отчёт, который за месяц формируется за секунду, на годе и 300 000 строк реализаций может считаться минуты. Основные причины и что с ними делать:
- 🐢 Обращение к реквизитам через точку. Каждое
Товары.Ссылка.Контрагент— неявное соединение с таблицей документа. Одно-два — терпимо. Если цепочки длинные (Номенклатура.Родитель.Родитель), выносите их в отдельные поля СКД или в соединения. - 🐢 Документы вместо регистра. Запрос к табличным частям читает каждую строку каждого документа. Виртуальная таблица оборотов регистра на больших периодах использует итоги и работает в разы быстрее.
- 🐢 Условия в
ГДЕвместо параметров виртуальной таблицы. Отбор по организации вГДЕприменяется после получения всех оборотов. В параметреУсловиевиртуальной таблицы — до. - 🐢 Составные типы. Поле
РегистраторилиДокументсоставного типа при разыменовании соединяется со всеми таблицами типов. Ограничьте его черезВЫРАЗИТЬ(... КАК Документ.РеализацияТоваровУслуг).
Фигурные скобки в запросе СКД
СКД сама переносит пользовательские отборы в запрос, если может. Чтобы управлять этим явно, используйте конструкцию в фигурных скобках:
ИЗ
РегистрНакопления.Продажи.Обороты(
&НачалоПериода,
&КонецПериода,
Авто,
{(Номенклатура).* КАК Номенклатура,
(Контрагент).* КАК Контрагент}) КАК ПродажиОбороты
Так отбор по номенклатуре или контрагенту из формы попадёт прямо в параметры виртуальной таблицы. Для запроса к документам аналог — блок {ГДЕ Товары.Ссылка.Организация.* КАК Организация}.
Проверка на реальных объёмах
Перед передачей пользователям сформируйте отчёт за самый длинный период, который им может понадобиться. Включите замер производительности в отладчике (Отладка → Замер производительности) и посмотрите, где уходит время. Если на запрос — смотрите его план, если на вывод — уменьшайте число группировок и полей.
Не тестируйте тяжёлый отчёт в рабочее время на основной базе: долгий запрос нагружает сервер СУБД, и замедлится работа остальных пользователей. Лучше развернуть копию.
Вывод результата, расшифровка и выгрузка в Excel
В большинстве случаев программировать вывод не нужно. Форма отчёта по умолчанию сама формирует табличный документ, даёт расшифровку двойным щелчком по ячейке и сохраняет пользовательские настройки.
Когда нужен свой обработчик
Код пишут, если нужно что-то сделать с результатом: добавить шапку с реквизитами организации, передать в схему значения из внешнего источника или подменить настройки. Для этого в модуле объекта отчёта определите обработчик ПриКомпоновкеРезультата:
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Настройки = КомпоновщикНастроек.ПолучитьНастройки();
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки);
Процессор = Новый ПроцессорКомпоновкиДанных;
Процессор.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки, Истина);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.Вывести(Процессор);
КонецПроцедуры
Этот код повторяет стандартное поведение. Свои действия вставляются между получением настроек и выводом — например, ДокументРезультат.Очистить() и вывод шапки из макета перед строкой ПроцессорВывода.Вывести.
Если поставить СтандартнаяОбработка = Ложь и не передать ДанныеРасшифровки в компоновщик, расшифровка по двойному щелчку перестанет работать. Пользователи заметят это сразу.
Выгрузка в Excel
Пользователь сохраняет готовый отчёт кнопкой сохранения на панели формы и выбирает формат «Лист Microsoft Excel 2007 (*.xlsx)». Группировки при этом сохраняются как свёрнутые строки Excel.
Если выгрузку нужно делать по расписанию или из обработки, табличный документ записывают в файл кодом на сервере:
ДокументРезультат.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.XLSX);
Путь должен быть доступен процессу сервера 1С, а не компьютеру пользователя. В клиент-серверной базе это частая причина ошибки записи файла.
Частые ошибки при разработке отчёта по продажам
- ❌ Выручка не совпадает с оборотом по счёту 90.01. Отчёт по документам не видит корректировок реализации и возвратов, а иногда и ручных операций. Сверяйте с регистром или с оборотно-сальдовой ведомостью и объясните пользователю, что именно показывает отчёт.
- ❌ Продажи задваиваются. Обычно из-за соединения табличной части с другой таблицей «многие ко многим», например с ценами номенклатуры без отбора по дате. Проверьте количество строк до и после соединения.
- ❌ Итоги по группе не равны сумме строк. Поле добавлено в выбранные поля, но не в ресурсы. СКД выводит его только на детальных записях, а в группах — пусто или первое значение.
- ❌ Отчёт открывается с пустым периодом. Параметр
Периодне отмечен в параметрах данных варианта или у него нет значения по умолчанию. - ❌ У менеджера отчёт не открывается. Нет права на интерактивное открытие внешних отчётов или на чтение нужных документов и регистров. Это настраивается в профилях групп доступа, а не в самом отчёте.
Частые вопросы
Можно ли сделать отчёт по продажам без программирования?
Как добавить в отчёт себестоимость и валовую прибыль?
ВыручкаИСебестоимостьПродаж), и добавьте ресурс «Прибыль» как разницу выручки и себестоимости. В БП 3.0 себестоимость берут из бухгалтерских оборотов по счёту 90.02.Как показать в отчёте продажи по менеджерам?
Ответственный из шапки реализации в запрос и сделайте по нему группировку. Если менеджер закреплён за клиентом — берите поле из карточки контрагента или партнёра.Почему отчёт в файловой базе быстрый, а в клиент-серверной медленный?
ГДЕ вместо параметров виртуальной таблицы.Как сделать диаграмму продаж по месяцам?
Диаграмма: точки — Месяц, серии — например, группа номенклатуры, значения — СуммаБезНДС. Диаграмма строится из тех же данных, что и таблица.