Разработка собственных отчетов в конфигурациях платформы 1С:Предприятие является одной из самых востребованных задач для программиста. В отличие от стандартных обработок или документов, отчет требует гибкого представления данных, возможности детализации и настройки пользователем. Современная платформа предлагает мощный инструмент — Систему Компоновки Данных (СКД), которая позволяет создавать сложные аналитические сводки без написания тысяч строк кода вывода на экран.

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

В этой статье мы разберем полный цикл создания отчета: от проектирования запроса до итоговой генерации макета. Мы затронем вопросы оптимизации выборки, настройки параметров и специфику работы с виртуальными таблицами. Готовность к работе с конструктором запросов и базовыми знаниями языка станет залогом успешного освоения материала.

Архитектура отчета на базе СКД

Фундаментом любого современного отчета в 1С является объект метаданных типа "Отчет". Внутри этого объекта ключевую роль играет макет, имеющий тип СхемаКомпоновкиДанных. Именно эта схема описывает, какие данные будут выбраны, как они будут сгруппированы и как отобразятся на экране пользователя. Программный код самого отчета часто сводится к минимуму, так как основную логику берет на себя движок компоновки.

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

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

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

💡

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

Проектирование запроса и наборов данных

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

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

  • 📊 Используйте виртуальные таблицы регистров накопления для получения остатков и оборотов за период.
  • 🔗 Избегайте соединения таблиц "по факту", если можно использовать индексируемые поля связей.
  • ⚡ Применяйте оператор РАЗРЕШЕННЫЕ для явного указания полей, доступных для использования в настройках отчета.

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

ВЫБРАТЬ

РегистрНакопления.Продажи.Период КАК Период,

РегистрНакопления.Продажи.Номенклатура КАК Номенклатура,

СУММА(РегистрНакопления.Продажи.Количество) КАК Количество,

СУММА(РегистрНакопления.Продажи.Сумма) КАК Сумма

ИЗ

РегистрНакопления.Продажи.Обороты(

&НачалоПериода,

&КонецПериода,

,

) КАК РегистрНакопления.Продажи

СГРУППИРОВАТЬ ПО

РегистрНакопления.Продажи.Период,

РегистрНакопления.Продажи.Номенклатура

Параметры, используемые в тексте запроса (например, &НачалоПериода), должны быть обязательно объявлены в списке параметров набора данных. Иначе при выполнении отчета система выдаст ошибку о неопознанном идентификаторе. Типы данных параметров должны соответствовать типам полей, с которыми они сравниваются в условии отбора.

📊 Какой способ написания запросов вы предпочитаете?
Конструктор запросов
Ручное написание кода
Комбинированный метод
Копирование из старых отчетов

Настройка полей и ресурсов отчета

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

Измерения — это поля, по которым происходит группировка данных (например, Номенклатура, Контрагент, Период). Ресурсы — это числовые показатели, которые подлежат агрегации (суммированию, усреднению), такие как Количество или Сумма. Правильное распределение ролей полей критически важно для корректной работы итоговых строк и группировок.

Тип поля Назначение Пример использования
Измерение Группировка строк или колонок ВидНоменклатуры
Ресурс Числовой показатель для суммы СуммаПродаж
Ресурс (Среднее) Вычисление среднего значения СредняяЦена
Поле Доп. информация без группировки АртикулТовара

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

⚠️ Внимание: Если вы изменили структуру запроса (добавили или удалили поля), не забудьте обновить список полей в настройках схемы компоновки. Старые поля могут стать недоступными, а новые не появятся в списке доступных для пользователя.

Также на этом этапе настраиваются условное оформление. Это мощный инструмент, позволяющий выделять цветом строки с отрицательными значениями, подсвечивать превышение плана или скрывать нулевые итоги. Логика оформления задается через выражения, аналогичные тем, что используются в запросах.

Реализация параметров и вариантов отчета

Пользовательский интерфейс отчета формируется автоматически на основе параметров, объявленных в схеме. Однако часто требуется сложная логика взаимодействия между параметрами. Например, выбор одного значения в параметре "ВидОтчета" должен делать видимым или обязательным параметр "Аналитика".

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

  • 🛠 Настройте свойства параметров: сделайте некоторые из них необязательными или скройте их по умолчанию.
  • 🔗 Используйте зависимые списки значений для параметров-справочников.
  • 🎨 Создайте несколько вариантов настроек для разных сценариев использования (например, "Для директора" и "Для бухгалтера").

Программное управление параметрами осуществляется в модуле объекта отчета. Чаще всего это делается в обработчике события ПриКомпоновкеРезультата. Здесь вы можете динамически менять значения параметров, подставлять текущую дату или ограничивать доступ к данным в зависимости от прав пользователя.

Как скрыть параметр программно?

В обработчике ПриКомпоновкеРезультата найдите нужный параметр в коллекции ПараметрыКомпоновкиДанных и установите свойство Доступность в значение Ложь. Также можно изменить его заголовок или значение по умолчанию.

Обработчики событий и программная доработка

Несмотря на мощь СКД, иногда стандартных средств недостаточно. В таких случаях вступает в дело код модуля объекта отчета. Основным событием, которое приходится перехватывать, является ПриКомпоновкеРезультата. Оно срабатывает непосредственно перед формированием итогового табличного документа.

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

&НаСервере

Процедура ПриКомпоновкеРезультата(ДокументРезультат, КомпоновщикНастроек, Настройки, ПараметрыКомпоновкиДанных, ПараметрыВыбора, ВыводитьНастройки)

// Пример добавления дополнительного отбора

НовыйЭлементОтбора = Новый ЭлементОтбораКомпоновкиДанных;

НовыйЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Номенклатура.ВидНоменклатуры");

НовыйЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;

НовыйЭлементОтбора.ПравоеЗначение = "Услуга";

КомпоновщикНастроек.Настройки.Отбор.Элементы.Добавить(НовыйЭлементОтбора);

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

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

💡

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

Вывод результатов и работа с табличным документом

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

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

⚠️ Внимание: Интерфейс и возможности СКД могут незначительно меняться с выходом новых платформенных релизов 1С. Всегда проверяйте документацию к конкретной версии платформы, если используете новые функции или параметры конфигурирования.

Если отчет предполагается выгружать в файлы (Excel, PDF, MXL), убедитесь, что настройки печати корректны. В схеме компоновки можно задать ориентацию страницы, поля и масштаб для каждого варианта отчета отдельно. Это избавит пользователя от необходимости каждый раз настраивать страницу перед печатью.

☑️ Финальная проверка отчета

Выполнено: 0 / 5
Как ускорить формирование отчета на больших данных?

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

Можно ли использовать СКД в обработке, а не в отчете?

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

Почему не работают итоги по некоторым полям?

Скорее всего, поле не помечено как "Ресурс" в схеме компоновки данных. Проверьте настройки набора данных и убедитесь, что для числовых полей установлен флаг использования в итогах.

Как передать параметр из внешней обработки в отчет?

При вызове отчета через Отчеты.ИмяОтчета.Создать() вы можете установить значения параметров в свойстве Параметры перед вызовом метода СкомпоноватьРезультат().