Разработка собственных отчетов в конфигурациях платформы 1С:Предприятие является одной из самых востребованных задач для программиста. В отличие от стандартных обработок или документов, отчет требует гибкого представления данных, возможности детализации и настройки пользователем. Современная платформа предлагает мощный инструмент — Систему Компоновки Данных (СКД), которая позволяет создавать сложные аналитические сводки без написания тысяч строк кода вывода на экран.
Процесс создания отчета программно подразумевает не просто выборку данных из базы, а их структурирование, группировку и форматирование согласно бизнес-логике предприятия. Вы можете реализовать это двумя путями: полностью вручную через код или используя встроенный конструктор отчетов, который генерирует большую часть служебной структуры автоматически. Понимание принципов работы СКД критически важно для любого разработчика, стремящегося создавать производительные решения.
В этой статье мы разберем полный цикл создания отчета: от проектирования запроса до итоговой генерации макета. Мы затронем вопросы оптимизации выборки, настройки параметров и специфику работы с виртуальными таблицами. Готовность к работе с конструктором запросов и базовыми знаниями языка 1С станет залогом успешного освоения материала.
Архитектура отчета на базе СКД
Фундаментом любого современного отчета в 1С является объект метаданных типа "Отчет". Внутри этого объекта ключевую роль играет макет, имеющий тип СхемаКомпоновкиДанных. Именно эта схема описывает, какие данные будут выбраны, как они будут сгруппированы и как отобразятся на экране пользователя. Программный код самого отчета часто сводится к минимуму, так как основную логику берет на себя движок компоновки.
Важно понимать разницу между данными и их представлением. Набор данных в схеме отвечает за получение информации из базы через запрос. В то же время, настройки компоновки определяют, какие поля попадут в результат, какие будут скрыты, а какие станут измерениями или ресурсами. Разделение этих понятий позволяет менять внешний вид отчета без переписывания логики выборки.
⚠️ Внимание: Никогда не пытайтесь формировать сложные табличные структуры вручную через объект
ТабличныйДокументвнутри отчета, если можно использовать СКД. Ручная верстка лишает пользователя возможности гибкой настройки и детализации, а также усложняет поддержку кода в будущем.
При создании нового отчета в конфигураторе система автоматически добавляет макет с именем ОсновнаяСхемаКомпоновкиДанных. Этот макет хранится в виде XML-представления, но редактировать его вручную в текстовом виде крайне неудобно и чревато ошибками синтаксиса. Для работы используется специальный редактор схем, который визуализирует структуру и позволяет управлять связями между элементами.
Используйте предопределенные настройки в схеме компоновки, чтобы задать вид отчета по умолчанию. Это сэкономит время пользователю, которому не придется каждый раз настраивать группировки с нуля.
Проектирование запроса и наборов данных
Первым шагом в создании отчета является написание запроса. Качество и скорость работы итогового решения напрямую зависят от оптимизации этого этапа. Запрос должен выбирать только необходимые поля, избегая лишних соединений и подзапросов, если их можно исключить. В контексте СКД запрос помещается в элемент НаборДанных.
Для написания запросов используется встроенный язык запросов 1С, синтаксис которого близок к SQL, но имеет свои особенности работы с виртуальными таблицами регистров. Особое внимание следует уделить параметрам запроса. Они позволяют передавать в выборку значения периодов, контрагентов или других фильтров, которые пользователь будет задавать в форме отчета.
- 📊 Используйте виртуальные таблицы регистров накопления для получения остатков и оборотов за период.
- 🔗 Избегайте соединения таблиц "по факту", если можно использовать индексируемые поля связей.
- ⚡ Применяйте оператор
РАЗРЕШЕННЫЕдля явного указания полей, доступных для использования в настройках отчета.
В схеме компоновки данных вы можете создать несколько наборов данных. Это необходимо, если отчет должен объединять информацию из несвязанных источников или если логика выборки для разных частей отчета кардинально отличается. Однако в 90% случаев достаточно одного грамотно составленного запроса, что упрощает отладку и повышает производительность.
ВЫБРАТЬ
РегистрНакопления.Продажи.Период КАК Период,
РегистрНакопления.Продажи.Номенклатура КАК Номенклатура,
СУММА(РегистрНакопления.Продажи.Количество) КАК Количество,
СУММА(РегистрНакопления.Продажи.Сумма) КАК Сумма
ИЗ
РегистрНакопления.Продажи.Обороты(
&НачалоПериода,
&КонецПериода,
,
) КАК РегистрНакопления.Продажи
СГРУППИРОВАТЬ ПО
РегистрНакопления.Продажи.Период,
РегистрНакопления.Продажи.Номенклатура
Параметры, используемые в тексте запроса (например, &НачалоПериода), должны быть обязательно объявлены в списке параметров набора данных. Иначе при выполнении отчета система выдаст ошибку о неопознанном идентификаторе. Типы данных параметров должны соответствовать типам полей, с которыми они сравниваются в условии отбора.
Настройка полей и ресурсов отчета
После того как запрос готов и данные могут быть получены, необходимо настроить их отображение. В редакторе схемы компоновки данных переходим на вкладку "Наборы данных" и видим список полей, которые вернул наш запрос. Здесь мы определяем, как система будет интерпретировать каждое поле: как измерение, ресурс или просто служебную информацию.
Измерения — это поля, по которым происходит группировка данных (например, Номенклатура, Контрагент, Период). Ресурсы — это числовые показатели, которые подлежат агрегации (суммированию, усреднению), такие как Количество или Сумма. Правильное распределение ролей полей критически важно для корректной работы итоговых строк и группировок.
| Тип поля | Назначение | Пример использования |
|---|---|---|
| Измерение | Группировка строк или колонок | ВидНоменклатуры |
| Ресурс | Числовой показатель для суммы | СуммаПродаж |
| Ресурс (Среднее) | Вычисление среднего значения | СредняяЦена |
| Поле | Доп. информация без группировки | АртикулТовара |
Для числовых полей можно настроить формат вывода непосредственно в свойствах ресурса. Вы можете указать количество знаков после запятой, символ валюты или способ отображения отрицательных чисел. Это избавляет от необходимости писать код форматирования в модуле объекта.
⚠️ Внимание: Если вы изменили структуру запроса (добавили или удалили поля), не забудьте обновить список полей в настройках схемы компоновки. Старые поля могут стать недоступными, а новые не появятся в списке доступных для пользователя.
Также на этом этапе настраиваются условное оформление. Это мощный инструмент, позволяющий выделять цветом строки с отрицательными значениями, подсвечивать превышение плана или скрывать нулевые итоги. Логика оформления задается через выражения, аналогичные тем, что используются в запросах.
Реализация параметров и вариантов отчета
Пользовательский интерфейс отчета формируется автоматически на основе параметров, объявленных в схеме. Однако часто требуется сложная логика взаимодействия между параметрами. Например, выбор одного значения в параметре "ВидОтчета" должен делать видимым или обязательным параметр "Аналитика".
Для реализации такой логики используется механизм ВариантовОтчета. В схеме компоновки можно создать несколько вариантов, каждый из которых будет иметь свой набор доступных полей и настроек отбора. Переключение между вариантами может происходить программно или через интерфейс пользователя.
- 🛠 Настройте свойства параметров: сделайте некоторые из них необязательными или скройте их по умолчанию.
- 🔗 Используйте зависимые списки значений для параметров-справочников.
- 🎨 Создайте несколько вариантов настроек для разных сценариев использования (например, "Для директора" и "Для бухгалтера").
Программное управление параметрами осуществляется в модуле объекта отчета. Чаще всего это делается в обработчике события ПриКомпоновкеРезультата. Здесь вы можете динамически менять значения параметров, подставлять текущую дату или ограничивать доступ к данным в зависимости от прав пользователя.
Как скрыть параметр программно?
В обработчике ПриКомпоновкеРезультата найдите нужный параметр в коллекции ПараметрыКомпоновкиДанных и установите свойство Доступность в значение Ложь. Также можно изменить его заголовок или значение по умолчанию.
Обработчики событий и программная доработка
Несмотря на мощь СКД, иногда стандартных средств недостаточно. В таких случаях вступает в дело код модуля объекта отчета. Основным событием, которое приходится перехватывать, является ПриКомпоновкеРезультата. Оно срабатывает непосредственно перед формированием итогового табличного документа.
В этом обработчике доступен объект КомпоновщикНастроек, который позволяет внедрять дополнительные условия отбора, которые невозможно выразить стандартными средствами конструктора. Например, можно добавить фильтрацию по данным, полученным из внешнего HTTP-сервиса, или реализовать сложную проверку прав доступа.
&НаСервере
Процедура ПриКомпоновкеРезультата(ДокументРезультат, КомпоновщикНастроек, Настройки, ПараметрыКомпоновкиДанных, ПараметрыВыбора, ВыводитьНастройки)
// Пример добавления дополнительного отбора
НовыйЭлементОтбора = Новый ЭлементОтбораКомпоновкиДанных;
НовыйЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Номенклатура.ВидНоменклатуры");
НовыйЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
НовыйЭлементОтбора.ПравоеЗначение = "Услуга";
КомпоновщикНастроек.Настройки.Отбор.Элементы.Добавить(НовыйЭлементОтбора);
КонецПроцедуры
Еще одним важным событием является ПриСозданииНаСервере. Здесь обычно производится инициализация переменных, проверка прав доступа и установка значений параметров по умолчанию.
Используйте событие ПриКомпоновкеРезультата для внедрения сложной бизнес-логики фильтрации, которую нельзя реализовать через стандартный конструктор отборов СКД.
Вывод результатов и работа с табличным документом
Конечным результатом работы отчета является объект ТабличныйДокумент. Хотя СКД формирует его автоматически, у разработчика есть возможность вмешаться в процесс вывода. Это может потребоваться для добавления шапки отчета, подвала с подписями или специфического форматирования ячеек, не поддерживаемого настройками схемы.
Для доступа к результату используется событие ПослеКомпоновкиРезультата. В нем вы получаете ссылку на сформированный табличный документ и можете программно обходить области, менять шрифты, вставлять картинки или добавлять новые строки. Однако злоупотребление этим методом может замедлить формирование отчета.
⚠️ Внимание: Интерфейс и возможности СКД могут незначительно меняться с выходом новых платформенных релизов 1С. Всегда проверяйте документацию к конкретной версии платформы, если используете новые функции или параметры конфигурирования.
Если отчет предполагается выгружать в файлы (Excel, PDF, MXL), убедитесь, что настройки печати корректны. В схеме компоновки можно задать ориентацию страницы, поля и масштаб для каждого варианта отчета отдельно. Это избавит пользователя от необходимости каждый раз настраивать страницу перед печатью.
☑️ Финальная проверка отчета
Как ускорить формирование отчета на больших данных?
Для ускорения работы необходимо оптимизировать запрос: использовать индексы, избегать функций в условиях соединения, применять временные таблицы при сложных вычислениях. Также поможет отключение лишних полей в настройках отчета по умолчанию.
Можно ли использовать СКД в обработке, а не в отчете?
Да, объект "СхемаКомпоновкиДанных" является независимым. Вы можете создать его в обработке, заполнить данными и скомпоновать результат в табличный документ, используя класс КомпоновщикНастроек.
Почему не работают итоги по некоторым полям?
Скорее всего, поле не помечено как "Ресурс" в схеме компоновки данных. Проверьте настройки набора данных и убедитесь, что для числовых полей установлен флаг использования в итогах.
Как передать параметр из внешней обработки в отчет?
При вызове отчета через Отчеты.ИмяОтчета.Создать() вы можете установить значения параметров в свойстве Параметры перед вызовом метода СкомпоноватьРезультат().