Добавление пользовательских полей в отчеты 1С:Предприятие 8.3 — одна из самых востребованных задач при адаптации типовых конфигураций под бизнес-процессы компании. Часто стандартные отчеты не содержат нужных реквизитов, а создание новых полей позволяет выводить дополнительную аналитику, фильтровать данные или группировать их по уникальным критериям. Эта процедура требует работы как в режиме Конфигуратора, так и в 1С:Предприятие, а также знания основ языка запросов и системы компоновки данных (СКД).
В отличие от добавления реквизитов в справочники или документы, где изменения сразу видны в интерфейсе, интеграция пользовательских полей в отчеты имеет свои нюансы. Например, поле может корректно отображаться в форме документа, но не появляться в отчете из-за неправильной настройки схемы компоновки. В этой статье мы разберем все этапы — от создания реквизита в метаданных до его вывода в конечном отчете, включая типичные ошибки и способы их устранения.
Особое внимание уделим двум ключевым сценариям: добавлению поля через расширение конфигурации (без изменения типовых объектов) и прямому редактированию отчета в режиме предприятия. Первый метод предпочтителен для поддержки обновлений, второй — для быстрых правок. Также рассмотрим, как вывести в отчет данные из внешних источников (например, дополнительные реквизиты из регистров сведений) и избежать распространенных проблем с производительностью при работе с большими объемами данных.
1. Подготовка: определение типа пользовательского поля
Прежде чем приступать к технической реализации, необходимо четко определить цель добавления поля и его будущее использование. Это влияет на выбор типа реквизита, способ его хранения и метод интеграции в отчет. Рассмотрим основные варианты:
🔹 Дополнительный реквизит справочника/документа — поле привязано к конкретному объекту метаданных (например, "Комментарий менеджера" для справочника Номенклатура). Хранится в базе данных и доступно для всех отчетов, где используется этот объект.
🔹 Виртуальное поле — рассчитывается "на лету" по формуле (например, "Прибыльность позиции" = Цена продажи - Себестоимость). Не хранится в базе, но может выводиться в отчетах через вычисляемые поля СКД.
🔹 Поле из регистра сведений — данные берутся из отдельного регистра (например, "Цены поставщиков" для аналитики по закупочным ценам). Требует связки с основным объектом отчета.
🔹 Пользовательское поле для фильтра — добавляется только в форму отчета как параметр (например, фильтр по "Региону продаж"), но не хранится в данных.
📌 Критический момент: если поле должно участвовать в группировке или сортировке отчета, его нельзя делать виртуальным — только как реквизит объекта или регистра. Виртуальные поля в СКД можно использовать только для вывода значений без агрегации.
Для полей, которые будут использоваться только в одном отчете, оптимально создать локальный реквизит в схеме компоновки данных. Это избавит от необходимости менять конфигурацию.
2. Создание пользовательского поля в конфигураторе
Если вы решили добавить поле как реквизит объекта (справочника, документа или регистра), начните с редактирования конфигурации. Рассмотрим процесс на примере добавления поля ДатаПоследнейПродажи в справочник Номенклатура:
🔧 Пошаговая инструкция:
- Откройте конфигуратор (
1Cv8.exe /configили через меню запуска). - В дереве объектов найдите справочник Номенклатура (путь:
Общие → Справочники → Номенклатура). - В палитре свойств справочника перейдите на вкладку
Реквизитыи нажмите "Добавить". - Задайте имя реквизита (
ДатаПоследнейПродажи), тип (Дата) и синоним ("Дата последней продажи"). - На вкладке
Дополнительноукажите длину (если нужно) и установите флаг "Индексировать" для ускорения поиска. - Сохраните конфигурацию (
Ctrl+S) и обновите базу данных (Конфигурация → Обновить конфигурацию базы данных).
⚠️
Внимание: При добавлении реквизитов в типовые объекты (например, в справочник Номенклатура из 1С:Управление торговлей) всегда используйте расширения конфигурации. Прямое изменение типовых объектов приведет к конфликтам при обновлении платформы.
Для создания расширения:
- В конфигураторе выберите
Файл → Новое расширение. - Укажите имя (например,
ДополнительныеРеквизитыНоменклатуры). - В дереве расширения найдите справочник Номенклатура и добавьте в него новый реквизит.
- Сохраните расширение и подключите его к базе через
Администрирование → Печатные формы, отчеты и обработки.
Дублирующих имен реквизитов нет
Тип данных соответствует будущему использованию
Установлен флаг "Индексировать" для полей, участвующих в фильтрах
Для дат и чисел заданы форматы отображения
Расширение подключено к базе (если используется)-->
3. Интеграция поля в схему компоновки данных (СКД)
После создания реквизита в метаданных его нужно сделать доступным в отчете. Для этого редактируем схему компоновки данных (СКД). Рассмотрим процесс на примере отчета Ведомость по номенклатуре:
🛠 Алгоритм действий:
- Откройте отчет в режиме предприятия (
Отчеты → Ведомость по номенклатуре). - Перейдите в настройки отчета (кнопка "Настройки" или
F5). - На вкладке
Полянажмите "Добавить поле" → "Добавить поле набора данных". - В списке доступных полей найдите ваш реквизит (например,
ДатаПоследнейПродажи) и добавьте его в отчет. - Настройте отображение: укажите заголовок колонки, формат даты, выравнивание.
Если поле не появляется в списке доступных, проверьте:
- 🔹 Правильно ли указан источник данных в отчете (например,
Справочник.Номенклатура). - 🔹 Добавлен ли реквизит в основной запрос отчета (вкладка
Наборы данных → Основной набор данных → Запрос). - 🔹 Нет ли конфликтов имен с другими полями (например, если поле называется
Дата, а в отчете уже есть системное поле с таким именем).
📊 Для сложных отчетов может потребоваться редактирование текста запроса. Например, чтобы добавить поле из регистра сведений, в запрос нужно включить соединение с этим регистром:
ВЫБРАТЬ
Номенклатура.Ссылка КАК Ссылка,
Номенклатура.Наименование КАК Наименование,
ПоследниеПродажи.Дата КАК ДатаПоследнейПродажи
ИЗ
Справочник.Номенклатура КАК Номенклатура
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПоследниеПродажи КАК ПоследниеПродажи
ПО Номенклатура.Ссылка = ПоследниеПродажи.Номенклатура
Как проверить корректность запроса?
Откройте отчет в режиме предприятия → перейдите на вкладку "Наборы данных" → выделите основной набор → нажмите "Конструктор запроса". Здесь можно выполнить запрос (F5) и посмотреть результат без генерации отчета. Если запрос возвращает ошибку, исправьте синтаксис или проверьте права доступа к объектам.
4. Настройка вычисляемых полей в СКД
Если пользовательское поле должно рассчитываться динамически (например, разница между двумя датами или процент выполнения плана), используйте вычисляемые поля в схеме компоновки. Это позволяет избежать изменения конфигурации и хранить логику прямо в отчете.
📝 Пример добавления вычисляемого поля "ДнейСПоследнейПродажи":
- В настройках отчета перейдите на вкладку
Поля→ "Добавить поле" → "Добавить вычисляемое поле". - Задайте имя поля (например,
ДнейСПоследнейПродажи) и заголовок ("Дней с последней продажи"). - В поле "Выражение" введите формулу:
ДАТАВРЕМЯ(ТЕКУЩАЯДАТА()) - ДатаПоследнейПродажи - Укажите тип результата —
Число, формат —Число без дробной части.
⚠️
Внимание: В вычисляемых полях нельзя использовать функции, требующие обращения к базе данных (например, ПОЛУЧИТЬЗНАЧЕНИЕРЕКВИЗИТА()). Для таких случаев создавайте реквизиты в метаданных или используйте подзапросы в основном запросе отчета.
🔄 Типичные ошибки при работе с вычисляемыми полями:
- 🔴 Использование несуществующих полей в формуле (например, опечатка в имени реквизита).
- 🔴 Несоответствие типов данных (например, попытка вычесть из даты число без преобразования).
- 🔴 Отсутствие обработки пустых значений (если
ДатаПоследнейПродажине заполнена, формула вернет ошибку).
Важно: вычисляемые поля в СКД не индексируются, поэтому их использование в фильтрах или группировках может значительно замедлить формирование отчета на больших объемах данных.
5. Вывод пользовательского поля в отчет: примеры оформления
После добавления поля в схему компоновки его нужно правильно отобразить в конечном отчете. Рассмотрим варианты оформления и типичные задачи:
🎨 Варианты отображения:
| Задача | Решение в СКД | Пример кода/настройки |
|---|---|---|
| Вывод даты в формате "ДД.ММ.ГГГГ" | Настройка формата поля | Формат("ДФ=dd.MM.yyyy;") |
| Условное оформление (например, красный цвет для просроченных дат) | Использование стилей | |
| Группировка по пользовательскому полю | Добавление поля в группировки | Вкладка "Группировки" → "Добавить группировку" → выбрать поле |
| Фильтрация по диапазону значений | Настройка параметров отчета | Вкладка "Параметры" → добавить параметр типа "Дата" с именем ПериодНачала |
🖼 Пример условного оформления для поля "ДнейСПоследнейПродажи":
- 🔹 Зеленый: если значение < 7 дней (
ЕСЛИ ДнейСПоследнейПродажи < 7 ТОГДА СтильОформления.Зеленый). - 🔹 Желтый: если значение от 7 до 30 дней.
- 🔹 Красный: если значение > 30 дней или поле не заполнено.
⚙ Для сложных условий оформления используйте макеты оформления:
- В конфигураторе откройте отчет и перейдите на вкладку
Макеты. - Создайте новый макет типа "Табличный документ".
- Настройте цвета, шрифты и границы для разных условий.
- В схеме компоновки укажите созданный макет как шаблон оформления.
Для полей с ограниченным набором значений (например, "Статус") эффективнее использовать перечисления вместо строковых полей. Это упрощает фильтрацию и группировку в отчетах.
6. Типичные ошибки и способы их устранения
Даже опытные разработчики сталкиваются с проблемами при добавлении пользовательских полей в отчеты. Рассмотрим наиболее распространенные ошибки и их решения:
🚨 Ошибка 1: Поле не отображается в списке доступных полей отчета
- 🔹 Причина: Реквизит не добавлен в основной запрос отчета.
- 🔹 Решение: Откройте конструктор запроса отчета и проверьте, что поле включено в список выбираемых данных. Например:
ВЫБРАТЬНоменклатура.ДатаПоследнейПродажи КАК ДатаПоследнейПродажи
ИЗ
Справочник.Номенклатура КАК Номенклатура
🚨 Ошибка 2: Ошибка типа при вычислении поля
- 🔹 Причина: Попытка выполнить операцию над несовместимыми типами (например, вычесть строку из числа).
- 🔹 Решение: Используйте функции преобразования типов:
ЧИСЛО(СтрокаПоле) + 10 // Преобразование строки в числоФОРМАТ(ДатаПоле, "ДФ=dd.MM.yyyy") // Преобразование даты в строку
🚨 Ошибка 3: Медленное формирование отчета после добавления поля
- 🔹 Причина: Поле участвует в группировке или фильтрации, но не проиндексировано в базе.
- 🔹 Решение: Вернитесь в конфигуратор и установите флаг "Индексировать" для реквизита. Для больших таблиц также поможет создание индекса в СУБД (например, в PostgreSQL или MS SQL).
🚨 Ошибка 4: Поле отображается как "Неопределено"
- 🔹 Причина 1: В базе нет данных для этого реквизита (например, дата не проставлена ни для одной номенклатуры).
- 🔹 Решение 1: Используйте функцию
ЗНАЧЕНИЕЗАПОЛНЕНО()для проверки:ЕСЛИ ЗНАЧЕНИЕЗАПОЛНЕНО(ДатаПоследнейПродажи)ТОГДА ДатаПоследнейПродажи
ИНАЧЕ ДАТАВРЕМЯ(1,1,1)
- 🔹 Причина 2: Ошибка в соединении таблиц в запросе (например, неверное условие
ПОпри связке с регистром). - 🔹 Решение 2: Проверьте запрос на наличие синтаксических ошибок и корректность связей.
⚠️
Внимание: Если поле добавлялось через расширение конфигурации, но не появляется в отчете, проверьте подключение расширения в базе (Администрирование → Печатные формы, отчеты и обработки → Расширения конфигурации). Иногда после обновления платформы расширения отключаются автоматически.
7. Альтернативные способы добавления полей
Помимо стандартного метода через конфигуратор и СКД, существуют альтернативные подходы, которые могут быть полезны в специфических сценариях:
🔄 Метод 1: Использование внешних отчетов
- 🔹 Подходит для разовых задач или когда нет прав на изменение основной конфигурации.
- 🔹 Создайте внешний отчет (
.erfфайл) с нужной структурой полей и подключите его черезФайл → Открыть. - 🔹 Преимущество: не затрагивает основную конфигурацию, легко обновлять.
- 🔹 Недостаток: требует ручного подключения для каждого пользователя.
🔄 Метод 2: Добавление полей через механизм дополнительных отчетов и обработок
- 🔹 В типовой конфигурации (например, 1С:ERP или 1С:УТ) можно добавить поле в отчет через механизм
Дополнительные отчеты и обработки(Администрирование → Печатные формы, отчеты и обработки). - 🔹 Это позволяет сохранять изменения при обновлении конфигурации.
🔄 Метод 3: Использование временных таблиц для сложных расчетов
- 🔹 Если поле требует сложных вычислений с данными из нескольких источников, создайте временную таблицу в запросе:
ВЫБРАТЬНоменклатура.Ссылка КАК Ссылка,
ВЫБОР
КОГДА Продажи.Количество > 100
ТОГДА "Хит продаж"
ИНАЧЕ "Обычный товар"
КОНЕЦ КАК КатегорияПопулярности
ПОМЕСТИТЬ ВТ_НоменклатураСКатегориями
ИЗ
Справочник.Номенклатура КАК Номенклатура
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Продажи КАК Продажи
ПО Номенклатура.Ссылка = Продажи.Номенклатура
- 🔹 Затем используйте эту таблицу в основном запросе отчета.
📌 Когда использовать альтернативные методы:
- 🔹 Внешние отчеты — для разовых задач или тестирования новых полей.
- 🔹 Дополнительные отчеты и обработки — для типовых конфигураций, где важно сохранять обновляемость.
- 🔹 Временные таблицы — для сложных расчетов, которые нельзя выразить в одном запросе.
Для отчетов, которые формируются долго, рассмотрите возможность создания регламентных заданий для предварительного расчета пользовательских полей (например, ночью). Это разгрузит систему в рабочее время.
8. Оптимизация производительности при работе с пользовательскими полями
Добавление новых полей в отчеты может существенно замедлить их формирование, особенно если речь идет о больших объемах данных. Рассмотрим ключевые методы оптимизации:
⚡ Способы ускорения:
- 🔹 Индексирование: Убедитесь, что все поля, участвующие в фильтрах или группировках, проиндексированы (флаг "Индексировать" в конфигураторе).
- 🔹 Ограничение данных: Используйте отборы по периодам или статусам, чтобы уменьшить объем обрабатываемых данных.
- 🔹 Кэширование: Для часто используемых отчетов настройте кэширование результатов (в СКД на вкладке
Дополнительно). - 🔹 Разделение отчетов: Если отчет стал слишком тяжелым, разделите его на несколько более простых.
📉 Пример оптимизированного запроса с индексированными полями:
ВЫБРАТЬ
Номенклатура.Ссылка КАК Ссылка,
Номенклатура.Наименование КАК Наименование,
Номенклатура.ДатаПоследнейПродажи КАК ДатаПоследнейПродажи
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
Номенклатура.ДатаПоследнейПродажи МЕЖДУ &НачалоПериода И &КонецПериода
ИНДЕКСИРОВАТЬ ПО
ДатаПоследнейПродажи // Указание индекса для ускорения фильтрации
УПОРЯДОЧИТЬ ПО
ДатаПоследнейПродажи УБЫВ
🔧 Инструменты для анализа производительности:
- 🔹 План выполнения запроса: В конфигураторе откройте конструктор запроса, выполните его (
F5) и посмотрите план выполнения на вкладкеПлан. Ищите операцииПолное сканирование— они указывают на отсутствие индексов. - 🔹 Тестирование и профилирование: Используйте встроенный профайлер (
Сервис → Тестирование и исправление → Профайлер) для поиска узких мест. - 🔹 Журнал регистрации: Включите регистрацию медленных запросов в MS SQL Server или PostgreSQL (если используется файловый вариант, анализируйте логи платформы).
⚠️
Внимание: При работе с управляемыми формами в отчетах избегайте использования событий ПриИзменении для полей, участвующих в фильтрации. Каждое такое событие может инициировать переформирование отчета, что критично скажется на производительности.
📊 Сравнение методов добавления полей по производительности:
| Метод | Скорость формирования | Сложность поддержки | Когда использовать |
|---|---|---|---|
| Реквизит в метаданных + СКД | ⭐⭐⭐⭐ | ⭐⭐ | Для постоянных полей, используемых в нескольких отчетах |
| Вычисляемое поле в СКД | ⭐⭐ | ⭐ | Для простых расчетов, не требующих индексации |
| Внешний отчет (.erf) | ⭐⭐⭐ | ⭐⭐⭐ | Для разовых задач или тестирования новых полей |
| Временные таблицы в запросе | ⭐⭐ | ⭐⭐⭐ | Для сложных расчетов с данными из нескольких источников |
FAQ: Частые вопросы по добавлению пользовательских полей
🔹 Как добавить пользовательское поле в отчет, если нет прав на изменение конфигурации?
Используйте один из альтернативных методов:
- Внешний отчет: Создайте отчет в отдельном файле (
.erf) и подключите его через менюФайл → Открыть. - Дополнительные отчеты и обработки: В типовой конфигурации (например, 1С:УТ) добавьте отчет через
Администрирование → Печатные формы, отчеты и обработки. - Вычисляемые поля в СКД: Если поле можно рассчитать на основе существующих данных, добавьте его как вычисляемое прямо в настройках отчета.
📌 Важно: Внешние отчеты не обновляются автоматически — при изменении конфигурации их нужно пересохранять вручную.
🔹 Почему пользовательское поле не отображается в отчете, хотя оно есть в справочнике?
Проверьте следующие моменты:
- 🔹 Поле добавлено в основной запрос отчета (вкладка
Наборы данных → Основной набор данных → Запрос). - 🔹 В настройках отчета поле включено в список выводимых (
Настройки → Поля). - 🔹 Нет конфликта имен с другими полями (например, если поле называется
Дата, а в отчете уже есть системное поле с таким именем). - 🔹 Если поле добавлялось через расширение, проверьте подключение расширения в базе (
Администрирование → Печатные формы, отчеты и обработки → Расширения конфигурации).
🔧 Диагностика: Откройте отчет в режиме предприятия, перейдите на вкладку Наборы данных, выделите основной набор и нажмите "Конструктор запроса". Выполните запрос (F5) и проверьте, возвращает ли он ваше поле.
🔹 Можно ли добавить пользовательское поле в отчет без программирования?
Да, если поле уже существует в метаданных (например, как реквизит справочника или документа). Для этого:
- Откройте отчет в режиме 1С:Предприятие.
- Нажмите
Настройки(илиF5).