Универсальные отчеты в 1С:Предприятие — мощный инструмент для анализа данных, но их гибкость часто ограничивается стандартной структурой полей и ресурсов. Что делать, если вам нужно агрегировать данные по полю, которое изначально не является ресурсом? Например, когда требуется посчитать количество уникальных клиентов по регионам или суммировать остатки по дополнительным реквизитам. В таких случаях преобразование поля в ресурс становится необходимым.
Эта статья поможет разобраться, как правильно настроить универсальный отчет, чтобы любое поле стало ресурсом — с пошаговыми инструкциями, примерами кода и разбором типичных ошибок. Мы рассмотрим как ручные настройки через конструктор отчетов, так и программные методы для опытных разработчиков. Особое внимание уделим нюансам работы с динамическими списками, виртуальными таблицами и пользовательскими полями, которые часто вызывают сложности.
Материал будет полезен как начинающим программистам 1С, так и опытным специалистам, которые хотят оптимизировать существующие отчеты. Все примеры приведены для актуальных версий платформы 1С:Предприятие 8.3 (включая последние релизы), но основные принципы применимы и к более ранним версиям.
Что такое ресурс в универсальном отчете 1С и зачем его настраивать
В контексте универсальных отчетов ресурс — это поле, по которому выполняются агрегирующие функции: сумма, количество, среднее, максимум/минимум и т.д. По умолчанию в отчете уже есть стандартные ресурсы (например, Количество или Сумма), но часто требуется добавить свои — например, для анализа по дополнительным реквизитам или справочникам.
Основные причины, почему поле нужно сделать ресурсом:
- 📊 Агрегация данных: подсчет сумм, средних значений или количества записей по нестандартным полям (например, по пользовательскому реквизиту
ВесТовара). - 🔍 Группировка с аналитикой: когда требуется не только сгруппировать данные (например, по контрагентам), но и посчитать дополнительные показатели в разрезе этих групп.
- 📈 Сравнительный анализ: например, сравнение продаж по регионам с учетом дополнительных параметров (как
СкидкаПостоянногоКлиента). - 🛠️ Оптимизация отчетов: уменьшение количества отчетов за счет гибкой настройки одного универсального.
Без преобразования поля в ресурс вы не сможете применить к нему агрегирующие функции — отчет просто выведет сырые данные без аналитики. Например, если вам нужно посчитать средний чек по каждому менеджеру, поле СуммаДокумента должно быть ресурсом, а не обычным полем.
Способы преобразования поля в ресурс: обзор методов
Существует три основных способа сделать поле ресурсом в универсальном отчете. Выбор метода зависит от ваших задач, уровня доступа к конфигурации и версии платформы:
- Через конструктор отчета (без программирования) — подходит для пользователей с правами на изменение отчетов, но ограничен по функционалу.
- Через настройку схемы компоновки данных (СКД) — требует понимания структуры отчета, но дает больше возможностей.
- Программно (через код) — самый гибкий способ, позволяет динамически менять ресурсы в зависимости от условий.
Рассмотрим каждый метод подробно, с примерами и нюансами.
| Метод | Сложность | Когда использовать | Ограничения |
|---|---|---|---|
| Конструктор отчета | Низкая | Для простых отчетов без сложной логики | Не все поля можно сделать ресурсами, ограниченный набор функций |
| Настройка СКД | Средняя | Для отчетов со средней сложностью, когда нужны нестандартные агрегаты | Требует знания структуры СКД, не все динамические поля поддерживаются |
| Программный код | Высокая | Для сложных отчетов с динамическими ресурсами или интеграцией с другими системами | Требует навыков программирования на 1С, может замедлить работу отчета |
Если вы только начинаете работать с универсальными отчетами, рекомендуем начать с конструктора. Для более сложных задач (например, когда нужно сделать ресурсом поле из виртуальной таблицы) придется использовать СКД или код.
Пошаговая инструкция: как сделать поле ресурсом через конструктор отчета
Это самый простой способ, который не требует программирования. Подходит для большинства стандартных задач. Рассмотрим на примере отчета по продажам, где нужно сделать ресурсом поле КоличествоТоваров (чтобы посчитать суммарное количество проданных единиц по каждому товару).
Откройте универсальный отчет в режиме
1С:Предприятие(не в конфигураторе!). Для этого перейдите в разделОтчетыи выберите нужный отчет (или создайте новый черезВсе функции → Отчеты).Нажмите кнопку
Настройка(обычно расположена в верхней панели отчета) → выберитеИзменить вариант(если отчет уже сохранен) илиСоздать вариант.В открывшемся окне перейдите на вкладку
Поля. Здесь отображены все доступные поля отчета. Найдите поле, которое хотите сделать ресурсом (в нашем примере —КоличествоТоваров).Кликните по полю правой кнопкой мыши и выберите
Свойства. В открывшемся окне найдите параметрИспользованиеи измените его значение наРесурс.Теперь перейдите на вкладку
Ресурсы. Здесь должно появиться ваше поле. Убедитесь, что для него выбрана нужная функция агрегации (например,СуммаилиКоличество).Сохраните настройки и запустите отчет. Теперь поле
КоличествоТоваровбудет работать как ресурс — данные по нему будут агрегироваться.
Поле отмечено как ресурс в свойствах|
Выбрана правильная функция агрегации (Сумма/Количество/Среднее)|
Поле добавлено в список ресурсов на соответствующей вкладке|
Отчет перезапущен для проверки результатов-->
Если поле не отображается в списке или не становится ресурсом, проверьте:
- 🔹 Тип поля: ресурсом можно сделать только поля с числовыми типами данных (
Число,Количество). Текстовые поля (Строка) или даты не поддерживаются. - 🔹 Источник данных: поле должно принадлежать основной таблице отчета. Поля из связанных таблиц (например, через
ЛЕВОЕ СОЕДИНЕНИЕ) могут не отображаться. - 🔹 Права доступа: у вас должны быть права на изменение варианта отчета.
Если поле не отображается в списке, попробуйте обновить структуру отчета: закройте его, очистите кэш метаданных (Файл → Открыть... → Обновить в конфигураторе), затем откройте отчет заново.
Настройка схемы компоновки данных (СКД) для добавления ресурсов
Если конструктор отчета не позволяет сделать поле ресурсом (например, потому что оно динамическое или принадлежит виртуальной таблице), придется редактировать схему компоновки данных (СКД). Этот метод требует больше времени, но дает полный контроль над отчетом.
Рассмотрим процесс на примере добавления ресурса СуммаСкидки в отчет по реализации:
Откройте отчет в конфигураторе (а не в 1С:Предприятие). Для этого найдите его в дереве метаданных (
Отчеты) и дважды кликните.Перейдите на вкладку
Схема компоновки данных. Здесь отображается XML-структура отчета. Найдите раздел<Resources>(ресурсы).Добавьте новый ресурс. Для этого вставьте следующий код внутри тега
<Resources>:<Resource Name="СуммаСкидки" Expression="СуммаСкидки" Type="Number"><Title>Сумма скидки</Title>
<AggregateFunction>Sum</AggregateFunction>
</Resource>
Здесь:
Name— внутреннее имя ресурса (латиницей, без пробелов).Expression— поле источника данных, которое станет ресурсом.AggregateFunction— функция агрегации (Sum,Count,Avgи др.).
Убедитесь, что поле СуммаСкидки присутствует в разделе <Fields> (поля). Если его нет, добавьте:
<Field Name="СуммаСкидки" Expression="СуммаСкидки" />
Сохраните схему компоновки и закройте конфигуратор. Запустите 1С:Предприятие и проверьте отчет.
Если вы работаете с виртуальной таблицей (например, РегистрНакопления.Продажи), поле для ресурса должно быть явным в запросе. Например:
ВЫБРАТЬ
Продажи.Товар КАК Товар,
СУММА(Продажи.СуммаСкидки) КАК СуммаСкидки
ИЗ
РегистрНакопления.Продажи КАК Продажи
ГДЕ
Продажи.Период МЕЖДУ &НачалоПериода И &КонецПериода
ГРУППИРОВКА ПО
Продажи.Товар
Что делать, если поле не отображается в СКД?
Если поле не появляется в списке доступных для ресурсов, проверьте:
1. Тип данных: поле должно быть числовым (не строка, не дата).
2. Источник: поле должно быть в основном запросе отчета (не в подзапросе).
3. Видимость: в некоторых случаях поле может быть скрыто в настройках видимости СКД.
4. Ошибки в запросе: если запрос содержит ошибки, поля могут не подгружаться. Проверьте его на выполнение в отдельном окне (Файл → Новый → Запрос).
Если вы работаете с динамическим списком, может потребоваться дополнительная настройка параметров компоновки. Например, для поля КурсВалюты в отчете по валютным операциям:
<Resource Name="СуммаВВалюте" Expression="Сумма * КурсВалюты" Type="Number">
<Title>Сумма в валюте</Title>
<AggregateFunction>Sum</AggregateFunction>
</Resource>
Программное добавление ресурсов: когда без кода не обойтись
В некоторых случаях настройка через конструктор или СКД невозможна — например, когда ресурс нужно добавлять динамически в зависимости от условий или когда поле формируется "на лету". Здесь поможет программный код.
Рассмотрим два сценария:
- Добавление ресурса при открытии отчета (например, если ресурс зависит от прав пользователя).
- Динамическое формирование ресурса (например, когда имя поля известно только во время выполнения).
- 🔹 Производительностью: большое количество динамических ресурсов может замедлить отчет.
- 🔹 Конфликтами имен: используйте уникальные имена (например, с префиксами).
- 🔹 Правами доступа: код должен выполняться в контексте с достаточными правами.
- 🔹 В запросе используется правильный вид регистра (
Обороты,ОстаткиилиОборотыИОстатки). - 🔹 Поле включено в раздел
ВЫБРАТЬс агрегирующей функцией (например,СУММА(Регистр.Количество)). - 🔹 Указан правильный период (иначе данные могут не выбраться).
- 🚀 Используйте отборы: ограничивайте данные по дате, организации или другим критериям. Например:
ГДЕ Дата МЕЖДУ &НачалоПериода И &КонецПериода - 🔍 Индексируйте поля: если ресурс строится по полю, которое часто используется в отборах, добавьте его в индексы таблицы.
- 📊 Разделяйте сложные отчеты: если в отчете больше 5 ресурсов, рассмотрите возможность разбиения его на несколько более простых.
- 🔄 Кэшируйте результаты: для часто используемых отчетов настройте кэширование (например, через
ХранилищеЗначений).
Пример 1: Добавление ресурса СуммаНДС программно в обработчике ПриКомпоновкеРезультата:
Процедура УниверсальныйОтчетПриКомпоновкеРезультата(ДанныеРасшифровки, СтандартнаяОбработка)
// Получаем схему компоновки
СхемаКомпоновки = Отчет.СхемаКомпоновкиДанных;
// Добавляем новый ресурс
НовыйРесурс = СхемаКомпоновки.Ресурсы.Добавить();
НовыйРесурс.Имя = "СуммаНДС";
НовыйРесурс.Выражение = "СуммаНДС";
НовыйРесурс.Заголовок = "Сумма НДС";
НовыйРесурс.ФункцияАгрегации = ФункцияАгрегацииСКД.Сумма();
// Обновляем схему
Отчет.СхемаКомпоновкиДанных = СхемаКомпоновки;
КонецПроцедуры
Пример 2: Динамическое формирование ресурса на основе пользовательских настроек (например, если имя поля хранится в справочнике):
Процедура ДобавитьДинамическийРесурс(ИмяПоля, Заголовок, ФункцияАгрегации)
СхемаКомпоновки = Отчет.СхемаКомпоновкиДанных;
// Проверяем, существует ли поле в источниках данных
Если НЕ СхемаКомпоновки.Поля.Найти(ИмяПоля) Тогда
Предупреждение("Поле " + ИмяПоля + " не найдено в источниках данных!");
Возврат;
КонецЕсли;
// Добавляем ресурс
НовыйРесурс = СхемаКомпоновки.Ресурсы.Добавить();
НовыйРесурс.Имя = "Дин_" + ИмяПоля; // Префикс для динамических ресурсов
НовыйРесурс.Выражение = ИмяПоля;
НовыйРесурс.Заголовок = Заголовок;
НовыйРесурс.ФункцияАгрегации = ФункцияАгрегации;
Отчет.СхемаКомпоновкиДанных = СхемаКомпоновки;
КонецПроцедуры
// Вызов примера:
ДобавитьДинамическийРесурс("СуммаБонуса", "Сумма бонусов", ФункцияАгрегацииСКД.Сумма());
Важно: при программном добавлении ресурсов следите за:
Программное добавление ресурсов удобно для сложных отчетов, но требует тестирования. Всегда проверяйте отчет на небольшом объеме данных перед использованием на боевой базе.
Типичные ошибки и их решения
При настройке ресурсов в универсальных отчетах часто возникают ошибки. Рассмотрим самые распространенные и способы их исправления.
| Ошибка | Причина | Решение |
|---|---|---|
| Поле не отображается в списке доступных для ресурсов | Поле не числовое или не принадлежит основной таблице | Проверьте тип поля в метаданных. Если поле из связанной таблицы, добавьте его в основной запрос через СОЕДИНЕНИЕ |
| Ресурс не считается (вместо суммы — пустые значения) | Неверная функция агрегации или ошибка в выражении | Проверьте синтаксис выражения. Для виртуальных таблиц используйте СУММА(Поле) прямо в запросе |
| Отчет выдает ошибку "Недопустимое имя ресурса" | Имя ресурса содержит пробелы или специальные символы | Используйте латиницу и символ подчеркивания (например, SummaSkidki) |
| Ресурс дублируется при каждом открытии отчета | Программный код добавляет ресурс повторно | Перед добавлением проверяйте существование ресурса: Если НЕ СхемаКомпоновки.Ресурсы.Найти(ИмяРесурса) Тогда... |
| Отчет тормозит при добавлении нового ресурса | Слишком много ресурсов или сложный запрос | Оптимизируйте запрос: добавьте индексы, уменьшите количество полей, используйте отбор |
Особое внимание уделите работе с виртуальными таблицами. Например, если вы пытаетесь сделать ресурсом поле из регистра накопления, убедитесь, что:
Если отчет выдает ошибку "Поле не найдено в источниках данных", откройте схему компоновки в текстовом виде (Файл → Открыть файл с расширением .erf) и проверьте, что поле объявлено в разделе <Fields>.
Оптимизация отчетов с пользовательскими ресурсами
Добавление новых ресурсов может значительно увеличить время формирования отчета, особенно если источник данных — большая таблица. Чтобы избежать тормозов, следуйте этим рекомендациям:
Пример оптимизированного запроса для ресурса СуммаПродажПоРегионам:
ВЫБРАТЬ
Продажи.Регион КАК Регион,
СУММА(Продажи.Сумма) КАК СуммаПродаж
ИЗ
Документ.РеализацияТоваровУслуг КАК Продажи
ГДЕ
Продажи.Дата МЕЖДУ &НачалоПериода И &КонецПериода
И Продажи.Организация = &ТекущаяОрганизация
ГРУППИРОВКА ПО
Продажи.Регион
ИНДЕКСИРОВАТЬ ПО
Продажи.Регион,
Продажи.Дата
Для динамических отчетов (где ресурсы добавляются программно) полезно использовать асинхронное формирование:
Процедура СформироватьОтчетАсинхронно()
ФормированиеОтчета = Новый ФормированиеОтчетаКомпоновкиДанных;
ФормированиеОтчета.Инициализировать(Отчет.СхемаКомпоновкиДанных);
// Настраиваем параметры компоновки
НастройкиКомпоновки = Отчет.НастройкиКомпоновкиДанных;
ФормированиеОтчета.УстановитьНастройки(НастройкиКомпоновки);
// Запускаем асинхронно
ФормированиеОтчета.ВыполнитьАсинхронно(Новый ОписаниеОповещения("ПослеФормированияОтчета"));
КонецПроцедуры
Асинхронное формирование отчетов снижает нагрузку на клиентское приложение, но требует обработки результата в отдельной процедуре (ПослеФормированияОтчета).
Практические примеры: реальные задачи и их решения
Рассмотрим несколько типичных задач, где требуется преобразовать поле в ресурс, и их решения.
Пример 1: Подсчет уникальных клиентов по менеджерам
Задача: В отчете по продажам нужно посчитать, сколько уникальных клиентов обслужил каждый менеджер (ресурс — количество уникальных значений поля Клиент).
Решение:
- В схеме компоновки добавьте ресурс с функцией
CountDistinct:<Resource Name="УникальныеКлиенты" Expression="Клиент" Type="Number"><Title>Уникальные клиенты</Title>
<AggregateFunction>CountDistinct</AggregateFunction>
</Resource>
- Убедитесь, что поле
Клиентвключено в группировку по менеджерам.
Пример 2: Анализ продаж по дополнительным реквизитам
Задача: Нужно проанализировать продажи в разрезе дополнительного реквизита товара Цвет (который не является стандартным полем).
Решение:
- Добавьте поле
Товар.Цветв запрос отчета. - Сделайте его ресурсом с функцией
Count(количество продаж по каждому цвету). - В настройках группировки добавьте поле
Цветкак уровень группировки.
Пример 3: Расчет среднего времени обработки заказа
Задача: В отчете по заказам нужно посчитать среднее время между созданием и закрытием заказа (ресурс — среднее значение разницы дат).
Решение:
- В запросе добавьте вычисляемое поле:
ВЫРАЗИТЬ(Заказы.ДатаЗакрытия - Заказы.ДатаСоздания В ДНЯХ) КАК ДнейНаВыполнение - Сделайте поле
ДнейНаВыполнениересурсом с функциейAvg(среднее).
Как посчитать медиану вместо среднего?
В универсальных отчетах нет встроенной функции для медианы, но можно использовать обходной путь:
1. Сформируйте отчет с детализацией по всем записям.
2. Экспортируйте данные в таблицу значений.
3. Напишите код для расчета медианы:
Функция РассчитатьМедиану(МассивЗначений)
МассивЗначений.Сортировать();
Индекс = Цел(МассивЗначений.Количество() / 2);
Если МассивЗначений.Количество() % 2 = 0 Тогда
Возврат (МассивЗначений[Индекс] + МассивЗначений[Индекс - 1]) / 2;
Иначе
Возврат МассивЗначений[Индекс];
КонецЕсли;
КонецФункции
4. Добавьте результат как отдельное поле в отчет.
FAQ: Частые вопросы по настройке ресурсов в универсальных отчетах
Могу ли я сделать ресурсом текстовое поле (например, наименование товара)?
Нет, ресурсом можно сделать только поля с числовыми типами данных (Число, Количество, Сумма и т.д.). Для текстовых полей можно использовать группировку, но не агрегацию. Если вам нужно посчитать количество уникальных текстовых значений (например, количество уникальных товаров), используйте функцию CountDistinct в СКД.
Почему после добавления ресурса отчет стал работать медленнее?
Добавление ресурсов увеличивает нагрузку на базу данных, особенно если:
- Источник данных — большая таблица (например, регистр накопления за несколько лет).
- Используется сложная функция агрегации (например,
CountDistinct). - В отчете много группировок и ресурсов одновременно.
Решения:
- Добавьте отборы по дате или другим критериям.
- Оптимизируйте запрос (используйте индексы, избегайте подзапросов).
- Разбейте отчет на несколько более простых.
Как сделать ресурсом поле из виртуальной таблицы?
Для полей из виртуальных таблиц (например, регистров накопления) нужно:
- Убедиться, что поле включено в запрос с агрегирующей функцией:
ВЫБРАТЬРегистр.Товар КАК Товар,
СУММА(Регистр.Количество) КАК Количество
ИЗ
РегистрНакопления.Товары КАК Регистр
ГДЕ
Регистр.Период МЕЖДУ &Начало И &Конец
ГРУППИРОВКА ПО
Регистр.Товар
- В СКД добавить ресурс с ссылкой на это поле (
Количество).
Если поле не агрегируется в запросе, его нельзя сделать ресурсом в отчете.
Можно ли динамически менять ресурсы в зависимости от прав пользователя?
Да, это можно сделать программно в обработчике ПриКомпоновкеРезультата. Пример:
Процедура УниверсальныйОтчетПриКомп