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

Особенность работы с отчетами в 1С 8.3 заключается в том, что поле можно добавить на разных этапах: при формировании схемы компоновки, в процессе выполнения запроса или непосредственно при выводе результата. Каждый подход имеет свои плюсы и ограничения. Например, модификация схемы через конструктор требует прав на изменение конфигурации, тогда как программное добавление полей в ПриКомпоновкеРезультата работает даже в режиме 1С:Предприятие без доступа к конфигуратору.

Важно учитывать версию платформы и конфигурацию. В Управлении торговлей 11 или ERP 2.4 логика может отличаться от Бухгалтерии 3.0 из-за разной структуры метаданных. Мы рассмотрим универсальные решения, а также укажем на специфические моменты для популярных типовых конфигураций.

1. Подготовка: какие инструменты понадобятся

Прежде чем приступать к программированию, убедитесь, что у вас есть:

  • 🔧 Конфигуратор 1С с правами на изменение (для методов, требующих редактирования метаданных).
  • 📝 Понимание структуры отчета: из каких таблиц берутся данные, какие поля уже есть в схеме компоновки.
  • 💻 Знание языка запросов 1С — если поле требует расчета на основе других данных.
  • 🔄 Тестовая база — обязательно проверяйте изменения на копии рабочей базы!

Для программного добавления полей чаще всего используются:

  • 📌 СхемаКомпоновкиДанных — объект, который описывает структуру отчета.
  • 📌 КомпоновщикМакета — инструмент для динамического изменения макета.
  • 📌 Запрос — если поле требует выборки данных из базы.
  • 📌 ТаблицаДокумента — для ручного добавления колонок в результат.

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

📊 Какой конфигурацией 1С вы чаще всего работаете?
Управление торговлей 11
ERP 2
Бухгалтерия 3.0
Зарплата и Управление Персоналом
Другая

2. Способ 1: Добавление поля через конструктор схемы компоновки

Самый простой метод — редактирование схемы компоновки данных в режиме конфигуратора. Он подходит, если вы имеете доступ к метаданным и хотите добавить поле на постоянной основе.

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

  1. Откройте отчет в конфигураторе (например, Отчеты → ВедомостьПоТоварам).
  2. Перейдите на вкладку Схема компоновки данных.
  3. В дереве навигатора найдите раздел Наборы данных → выберите нужный набор (обычно это ОсновнойНаборДанных).
  4. В панели свойств набора данных найдите поле Поля и нажмите кнопку Добавить.
  5. Укажите имя поля (например, СуммаНДС) и его выражение (например, Сумма * СтавкаНДС / 100).
  6. Сохраните изменения и обновите базу.

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

⚠️ Внимание: Изменение схемы компоновки через конфигуратор требует прав на редактирование метаданных. В облачных версиях 1С (например, 1С:Фреш) этот метод может быть недоступен.

Создать резервную копию базы|Проверить права доступа в конфигураторе|Определить источник данных для нового поля|Записать формулу расчета (если поле вычисляемое)|Протестировать изменения на копии базы-->

3. Способ 2: Динамическое добавление поля в обработчике «ПриКомпоновкеРезультата»

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

Пример кода для добавления вычисляемого поля Прибыль в отчет:

Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)

// Получаем таблицу результата

Таблица = ДокументРезультат.Таблица;

// Добавляем новую колонку

Таблица.Колонки.Добавить("Прибыль");

ИндексКолонки = Таблица.Колонки.Индекс(Таблица.Колонки.Последний());

// Заполняем колонку данными

Для Каждого Строка Из Таблица Цикл

Выручка = Число(Строка.Выручка);

Себестоимость = Число(Строка.Себестоимость);

Строка.Прибыль = Выручка - Себестоимость;

КонецЦикла;

СтандартнаяОбработка = Ложь;

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

Преимущества этого метода:

  • 🔹 Работает без прав на изменение конфигурации.
  • 🔹 Позволяет добавлять поля, зависящие от параметров отчета.
  • 🔹 Можно использовать сложные вычисления, включая обращения к другим таблицам.

Недостатки:

  • 🔸 Поле не будет видно в настройках отчета (его нельзя скрыть/показать через интерфейс).
  • 🔸 При изменении структуры отчета может потребоваться корректировка кода.
Если Не ТекущийПользователь().Имя = "Иванов" Тогда

Возврат;

КонецЕсли;

-->

4. Способ 3: Модификация запроса в обработчике «ПередВыполнениемЗапроса»

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

Пример добавления поля КатегорияТовара в отчет:

Процедура ПередВыполнениемЗапроса(ЭлементОтчета, Запрос, СтандартнаяОбработка)

ТекстЗапроса = Запрос.Текст;

// Добавляем поле в выборку

ТекстЗапроса = СтрЗаменить(ТекстЗапроса,

"ВЫБРАТЬ",

"ВЫБРАТЬ

| Номенклатура.Категория КАК КатегорияТовара,");

Запрос.Текст = ТекстЗапроса;

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

Важные нюансы:

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

Этот метод оптимален, когда:

  • 📌 Новое поле уже существует в базе, но не выводится в отчете.
  • 📌 Требуется агрегация данных (например, СУММА или МАКСИМУМ).
  • 📌 Нужно присоединить дополнительные таблицы (например, справочники или документы).
⚠️ Внимание: Изменение текста запроса может привести к ошибкам, если в отчете используются псевдонимы полей или сложные связи между таблицами. Всегда тестируйте модифицированный запрос в Консоли запросов перед применением.

5. Способ 4: Использование расшифровки данных для динамических полей

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

Пример реализации:

Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)

Если ДанныеРасшифровки = Неопределено Тогда

Возврат;

КонецЕсли;

// Проверяем, что расшифровывается нужная группировка

Если ДанныеРасшифровки.ИсточникДанных.Имя = "Номенклатура" Тогда

Таблица = ДанныеРасшифровки.Результат;

Таблица.Колонки.Добавить("ДополнительноеПоле");

// Заполняем данные...

КонецЕсли;

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

Где это применимо:

  • 📊 Отчеты с иерархией (например, Оборотно-сальдовая ведомость).
  • 📊 Динамическое добавление полей при двойном клике на строку.
  • 📊 Поля, которые рассчитываются только для детализированных данных.

Ограничения:

  • 🔸 Не подходит для полей, которые должны отображаться всегда.
  • 🔸 Требует обработки события расшифровки, что усложняет код.
Как проверить, какие данные доступны в расшифровке?

В обработчике ПриКомпоновкеРезультата добавьте отладочный вывод:

Сообщить("Источник данных: " + ДанныеРасшифровки.ИсточникДанных.Имя);

Сообщить("Тип данных: " + ТипЗнч(ДанныеРасшифровки.Результат));

Это поможет понять структуру данных, с которыми вы работаете.

6. Способ 5: Добавление поля через внешнюю обработку

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

Алгоритм:

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

Пример кода для внешней обработки:

Перем мСхемаКомпоновкиДанных;

Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

мСхемаКомпоновкиДанных = Новый СхемаКомпоновкиДанных;

мСхемаКомпоновкиДанных.ЗагрузитьИзФайла("C:\Отчеты\МояСхема.xml"); // Путь к файлу схемы

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

Процедура ДобавитьПоле(ДокументРезультат)

Таблица = ДокументРезультат.Таблица;

Таблица.Колонки.Добавить("НовоеПоле");

// Логика заполнения...

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

Преимущества внешних обработок:

  • 🔧 Не требуют изменений в конфигурации.
  • 🔧 Можно подключать/отключать по необходимости.
  • 🔧 Удобно для распределения между несколькими базами.
⚠️ Внимание: Внешние обработки могут конфликтовать с обновлениями конфигурации. После обновления типовых решений (например, УТ 11.5 → УТ 11.6) проверяйте их работоспособность.

7. Типичные ошибки и как их избежать

При программном добавлении полей в отчеты разработчики часто сталкиваются с следующими проблемами:

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

Чтобы минимизировать ошибки:

  • 🔍 Всегда проверяйте ТипЗнч() данных перед вычислениями.
  • 🔍 Используйте Попытка...Исключение для обработки ошибок.
  • 🔍 Тестируйте изменения на небольшом наборе данных.
💡

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

8. Особенности для популярных конфигураций

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

  • 📦 Управление торговлей 11 (УТ 11):
    • В отчетах по продажам часто требуется добавлять поля из справочника Номенклатура (например, Вес или Объем).
    • Для отчетов по остаткам используйте виртуальную таблицу ОстаткиТоваров.
  • 💼 ERP 2.4:
    • В производственных отчетах может понадобиться связь с документами ЗаказНаПроизводство.
    • Для добавления полей из подсистемы Бюджетирование используйте планы видов характеристик.
  • 📊 Бухгалтерия 3.0:
    • В оборотно-сальдовой ведомости поля добавляются через модификацию запроса к регистру Бухгалтерия.
    • Для аналитических отчетов (например, по контрагентам) используйте виртуальные таблицы ДвиженияДокументов.

Для Зарплата и Управление Персоналом 3.1 типичная задача — добавление полей из справочника ФизическиеЛица или регистра НачисленияЗарплаты. Например, можно вывести СтажРаботы или КоличествоДетей в отчет по сотрудникам.

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

FAQ: Ответы на частые вопросы

Можно ли добавить поле в отчет без прав на изменение конфигурации?

Да, для этого подходят:

  • Обработчик ПриКомпоновкеРезультата (способ 2).
  • Внешняя обработка (способ 5).
  • Модификация запроса в ПередВыполнениемЗапроса (способ 3), если поле уже есть в базе.

Все эти методы работают в режиме 1С:Предприятие без доступа к конфигуратору.

Как добавить поле, которое рассчитывается на основе других колонок?

Используйте обработчик ПриКомпоновкеРезультата:

  1. Добавьте новую колонку в таблицу результата.
  2. В цикле по строкам рассчитайте значение на основе других полей.

Пример для поля Маржа:

Строка.Маржа = (Строка.ЦенаПродажи - Строка.ЦенаЗакупа) / Строка.ЦенаПродажи * 100;
Почему после добавления поля в схему компоновки оно не отображается в отчете?

Возможные причины:

  • Поле не добавлено в Настройки отчета → Выбранные поля.
  • Не указан Псевдоним поля в запросе.
  • Поле скрыто в пользовательских настройках отчета (проверьте Сбросить настройки).

Решение: откройте отчет в режиме 1С:Предприятие, нажмите Еще → Настройки → Выбранные поля и добавьте новое поле в список.

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

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

  1. Добавьте соединение (ЛЕВОЕ СОЕДИНЕНИЕ) с нужной таблицей.
  2. Укажите поле в выборке.

Пример для поля ИННКонтрагента:

ТекстЗапроса = СтрЗаменить(ТекстЗапроса,

"ВЫБРАТЬ",

"ВЫБРАТЬ

| Контрагенты.ИНН КАК ИННКонтрагента,");

Можно ли добавить поле в отчет на мобильной платформе 1С?

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

  • Использование внешних отчетов (разрабатываются на десктопе, затем публикуются для мобильных пользователей).
  • Настройка отчетов через 1С:EDT с последующей адаптацией для мобильных устройств.

Динамическое добавление полей через код на мобильной платформе не поддерживается.