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

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

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

📊 Какой метод добавления полей вы используете чаще?
Через расширение конфигурации
Прямо в режиме предприятия
С помощью внешних отчетов
Не добавлял пользовательские поля

1. Подготовка: определение типа пользовательского поля

Прежде чем приступать к технической реализации, необходимо четко определить цель добавления поля и его будущее использование. Это влияет на выбор типа реквизита, способ его хранения и метод интеграции в отчет. Рассмотрим основные варианты:

🔹 Дополнительный реквизит справочника/документа — поле привязано к конкретному объекту метаданных (например, "Комментарий менеджера" для справочника Номенклатура). Хранится в базе данных и доступно для всех отчетов, где используется этот объект.

🔹 Виртуальное поле — рассчитывается "на лету" по формуле (например, "Прибыльность позиции" = Цена продажи - Себестоимость). Не хранится в базе, но может выводиться в отчетах через вычисляемые поля СКД.

🔹 Поле из регистра сведений — данные берутся из отдельного регистра (например, "Цены поставщиков" для аналитики по закупочным ценам). Требует связки с основным объектом отчета.

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

📌 Критический момент: если поле должно участвовать в группировке или сортировке отчета, его нельзя делать виртуальным — только как реквизит объекта или регистра. Виртуальные поля в СКД можно использовать только для вывода значений без агрегации.

💡

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

2. Создание пользовательского поля в конфигураторе

Если вы решили добавить поле как реквизит объекта (справочника, документа или регистра), начните с редактирования конфигурации. Рассмотрим процесс на примере добавления поля ДатаПоследнейПродажи в справочник Номенклатура:

🔧 Пошаговая инструкция:

  1. Откройте конфигуратор (1Cv8.exe /config или через меню запуска).
  2. В дереве объектов найдите справочник Номенклатура (путь: Общие → Справочники → Номенклатура).
  3. В палитре свойств справочника перейдите на вкладку Реквизиты и нажмите "Добавить".
  4. Задайте имя реквизита (ДатаПоследнейПродажи), тип (Дата) и синоним ("Дата последней продажи").
  5. На вкладке Дополнительно укажите длину (если нужно) и установите флаг "Индексировать" для ускорения поиска.
  6. Сохраните конфигурацию (Ctrl+S) и обновите базу данных (Конфигурация → Обновить конфигурацию базы данных).

⚠️

Внимание: При добавлении реквизитов в типовые объекты (например, в справочник Номенклатура из 1С:Управление торговлей) всегда используйте расширения конфигурации. Прямое изменение типовых объектов приведет к конфликтам при обновлении платформы.

Для создания расширения:

  1. В конфигураторе выберите Файл → Новое расширение.
  2. Укажите имя (например, ДополнительныеРеквизитыНоменклатуры).
  3. В дереве расширения найдите справочник Номенклатура и добавьте в него новый реквизит.
  4. Сохраните расширение и подключите его к базе через Администрирование → Печатные формы, отчеты и обработки.

Дублирующих имен реквизитов нет

Тип данных соответствует будущему использованию

Установлен флаг "Индексировать" для полей, участвующих в фильтрах

Для дат и чисел заданы форматы отображения

Расширение подключено к базе (если используется)-->

3. Интеграция поля в схему компоновки данных (СКД)

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

🛠 Алгоритм действий:

  1. Откройте отчет в режиме предприятия (Отчеты → Ведомость по номенклатуре).
  2. Перейдите в настройки отчета (кнопка "Настройки" или F5).
  3. На вкладке Поля нажмите "Добавить поле" → "Добавить поле набора данных".
  4. В списке доступных полей найдите ваш реквизит (например, ДатаПоследнейПродажи) и добавьте его в отчет.
  5. Настройте отображение: укажите заголовок колонки, формат даты, выравнивание.

Если поле не появляется в списке доступных, проверьте:

  • 🔹 Правильно ли указан источник данных в отчете (например, Справочник.Номенклатура).
  • 🔹 Добавлен ли реквизит в основной запрос отчета (вкладка Наборы данных → Основной набор данных → Запрос).
  • 🔹 Нет ли конфликтов имен с другими полями (например, если поле называется Дата, а в отчете уже есть системное поле с таким именем).

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

ВЫБРАТЬ

Номенклатура.Ссылка КАК Ссылка,

Номенклатура.Наименование КАК Наименование,

ПоследниеПродажи.Дата КАК ДатаПоследнейПродажи

ИЗ

Справочник.Номенклатура КАК Номенклатура

ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПоследниеПродажи КАК ПоследниеПродажи

ПО Номенклатура.Ссылка = ПоследниеПродажи.Номенклатура

Как проверить корректность запроса?

Откройте отчет в режиме предприятия → перейдите на вкладку "Наборы данных" → выделите основной набор → нажмите "Конструктор запроса". Здесь можно выполнить запрос (F5) и посмотреть результат без генерации отчета. Если запрос возвращает ошибку, исправьте синтаксис или проверьте права доступа к объектам.

4. Настройка вычисляемых полей в СКД

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

📝 Пример добавления вычисляемого поля "ДнейСПоследнейПродажи":

  1. В настройках отчета перейдите на вкладку Поля → "Добавить поле" → "Добавить вычисляемое поле".
  2. Задайте имя поля (например, ДнейСПоследнейПродажи) и заголовок ("Дней с последней продажи").
  3. В поле "Выражение" введите формулу:
    ДАТАВРЕМЯ(ТЕКУЩАЯДАТА()) - ДатаПоследнейПродажи
  4. Укажите тип результата — Число, формат — Число без дробной части.

⚠️

Внимание: В вычисляемых полях нельзя использовать функции, требующие обращения к базе данных (например, ПОЛУЧИТЬЗНАЧЕНИЕРЕКВИЗИТА()). Для таких случаев создавайте реквизиты в метаданных или используйте подзапросы в основном запросе отчета.

🔄 Типичные ошибки при работе с вычисляемыми полями:

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

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

5. Вывод пользовательского поля в отчет: примеры оформления

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

🎨 Варианты отображения:

Задача Решение в СКД Пример кода/настройки
Вывод даты в формате "ДД.ММ.ГГГГ" Настройка формата поля Формат("ДФ=dd.MM.yyyy;")
Условное оформление (например, красный цвет для просроченных дат) Использование стилей
ЕСЛИ ДатаПоследнейПродажи < ТЕКУЩАЯДАТА() - 30

ТОГДА СтильОформления.Красный

ИНАЧЕ СтильОформления.Обычный

Группировка по пользовательскому полю Добавление поля в группировки Вкладка "Группировки" → "Добавить группировку" → выбрать поле
Фильтрация по диапазону значений Настройка параметров отчета Вкладка "Параметры" → добавить параметр типа "Дата" с именем ПериодНачала

🖼 Пример условного оформления для поля "ДнейСПоследнейПродажи":

  • 🔹 Зеленый: если значение < 7 дней (ЕСЛИ ДнейСПоследнейПродажи < 7 ТОГДА СтильОформления.Зеленый).
  • 🔹 Желтый: если значение от 7 до 30 дней.
  • 🔹 Красный: если значение > 30 дней или поле не заполнено.

Для сложных условий оформления используйте макеты оформления:

  1. В конфигураторе откройте отчет и перейдите на вкладку Макеты.
  2. Создайте новый макет типа "Табличный документ".
  3. Настройте цвета, шрифты и границы для разных условий.
  4. В схеме компоновки укажите созданный макет как шаблон оформления.
💡

Для полей с ограниченным набором значений (например, "Статус") эффективнее использовать перечисления вместо строковых полей. Это упрощает фильтрацию и группировку в отчетах.

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: Частые вопросы по добавлению пользовательских полей

🔹 Как добавить пользовательское поле в отчет, если нет прав на изменение конфигурации?

Используйте один из альтернативных методов:

  1. Внешний отчет: Создайте отчет в отдельном файле (.erf) и подключите его через меню Файл → Открыть.
  2. Дополнительные отчеты и обработки: В типовой конфигурации (например, 1С:УТ) добавьте отчет через Администрирование → Печатные формы, отчеты и обработки.
  3. Вычисляемые поля в СКД: Если поле можно рассчитать на основе существующих данных, добавьте его как вычисляемое прямо в настройках отчета.

📌 Важно: Внешние отчеты не обновляются автоматически — при изменении конфигурации их нужно пересохранять вручную.

🔹 Почему пользовательское поле не отображается в отчете, хотя оно есть в справочнике?

Проверьте следующие моменты:

  • 🔹 Поле добавлено в основной запрос отчета (вкладка Наборы данных → Основной набор данных → Запрос).
  • 🔹 В настройках отчета поле включено в список выводимых (Настройки → Поля).
  • 🔹 Нет конфликта имен с другими полями (например, если поле называется Дата, а в отчете уже есть системное поле с таким именем).
  • 🔹 Если поле добавлялось через расширение, проверьте подключение расширения в базе (Администрирование → Печатные формы, отчеты и обработки → Расширения конфигурации).

🔧 Диагностика: Откройте отчет в режиме предприятия, перейдите на вкладку Наборы данных, выделите основной набор и нажмите "Конструктор запроса". Выполните запрос (F5) и проверьте, возвращает ли он ваше поле.

🔹 Можно ли добавить пользовательское поле в отчет без программирования?

Да, если поле уже существует в метаданных (например, как реквизит справочника или документа). Для этого:

  1. Откройте отчет в режиме 1С:Предприятие.
  2. Нажмите Настройки (или F5).