Как добавить новые поля и показатели в Универсальный отчет в 1С

Программист 1С v8.3 (Обычные формы) Управленческий учет Торговля и дистрибуция
← На главную

При работе в конфигурациях на обычных формах, таких как 1С:Управление производственным предприятием 1.3 или 1С:Комплексная автоматизация 1.1, программисты часто сталкиваются с необходимостью доработки стандартных отчетов. Большинство этих отчетов построены на базе механизма УниверсальныйОтчет, который использует ПостроительОтчета. Одной из самых распространенных проблем при добавлении новых колонок является ошибка "Поле не найдено", даже если в тексте запроса поле явно присутствует. В этой статье мы подробно разберем, как правильно модифицировать запрос и программный код, чтобы успешно добавить новые данные в отчет.

Разбор архитектуры Универсального отчета

Прежде чем приступать к правке кода, проанализируем, как работает этот механизм. УниверсальныйОтчет — это не просто запрос к базе данных, это обертка над объектом ПостроительОтчета. Главная особенность заключается в том, что состав доступных полей определяется не только основной секцией ВЫБРАТЬ, но и специальными инструкциями в фигурных скобках { }. Если вы добавили поле в выборку, но не описали его в секции расширения, Построитель просто «не увидит» его при формировании настроек компоновки.

Шаг 1. Модификация текста запроса

Рассмотрим ситуацию, когда нам нужно добавить показатели "Отгрузка" и "Оплата" в отчет по дебиторской задолженности. Нам необходимо не только изменить основной текст запроса, но и правильно прописать поля в секциях расширения. Выясним причину ошибки «Поле не найдено»: чаще всего она возникает из-за отсутствия поля в блоке {ВЫБРАТЬ ...}.

Посмотрим на пример правильной структуры запроса для ПостроителяОтчета:


УниверсальныйОтчет.ПостроительОтчета.Текст = 
"ВЫБРАТЬ РАЗРЕШЕННЫЕ
|   Источник.Организация КАК Организация,
|   Источник.Контрагент КАК Контрагент,
|   Источник.СуммаОтгрузки КАК Отгрузка, // Добавляем поле в основную выборку
|   Источник.СуммаОплаты КАК Оплата
|{ВЫБРАТЬ
|   Организация.*,
|   Контрагент.*,
|   Отгрузка, // ОБЯЗАТЕЛЬНО: расширение выбора для Построителя
|   Оплата} 
|ИЗ
|   (ВЫБРАТЬ ... ) КАК Источник
|{ИТОГИ ПО
|   Организация.*,
|   Контрагент.*}
|ИТОГИ
|   СУММА(Отгрузка), // Добавляем итоги, чтобы поле могло быть показателем
|   СУММА(Оплата)
|ПО
|   ОБЩИЕ";

Обратите внимание, что если поле является числовым показателем (ресурсом), его крайне желательно добавить в секцию ИТОГИ. Без этого Универсальный отчет не сможет корректно суммировать данные по группировкам контрагентов или организаций.

Шаг 2. Программная инициализация новых полей

После изменения запроса нам нужно сообщить объекту УниверсальныйОтчет, что появились новые доступные поля. Обычно это делается в процедуре УстановитьНачальныеНастройки() модуля объекта отчета. Проанализируем необходимые действия:

  1. Добавление представления поля: Чтобы пользователь видел в настройках понятное название (например, "Сумма оплаты"), а не имя из запроса, добавим строку в структуру представлений.
  2. Регистрация показателя: Используем метод ДобавитьПоказатель, чтобы поле появилось в списке доступных колонок отчета.

Пример кода для инициализации:


// Устанавливаем заголовки для полей
УниверсальныйОтчет.мСтруктураПредставлениеПолей.Вставить("Отгрузка", "Отгрузка за период");
УниверсальныйОтчет.мСтруктураПредставлениеПолей.Вставить("Оплата", "Оплата за период");

// Добавляем показатели в отчет
// Параметры: Имя, Заголовок, ИспользованиеПоУмолчанию, Формат, ИмяГруппы, ПолеСвязи
УниверсальныйОтчет.ДобавитьПоказатель("Отгрузка", "Отгрузка за период", Истина, "ЧЦ=15; ЧДЦ=2");
УниверсальныйОтчет.ДобавитьПоказатель("Оплата", "Оплата за период", Истина, "ЧЦ=15; ЧДЦ=2");

Важный момент: если вы добавили поле в запрос, но забыли вызвать ДобавитьПоказатель, колонка не появится в списке доступных для вывода, даже если запрос работает корректно.

Шаг 3. Работа с вложенными запросами

Зачастую отчеты в УПП имеют сложную структуру с несколькими уровнями вложенности. Разберем ситуацию, когда данные берутся из вложенного запроса. Чтобы поле "ОплатаЗаПериод" попало в финальный отчет, его нужно «протащить» через все уровни выборки.

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

  1. Во внутреннем запросе (где происходит соединение с регистрами) пишем: СУММА(Обороты.СуммаРасход) КАК ОплатаЗаПериод.
  2. Во вложенном запросе (средний уровень) выбираем это поле: ВложенныйЗапрос.ОплатаЗаПериод КАК ОплатаЗаПериод.
  3. В самом верхнем запросе (основной ВЫБРАТЬ) снова указываем: ВерхнийУровень.ОплатаЗаПериод КАК ОплатаЗаПериод.

Только после такой сквозной передачи поле станет доступным для секции {ВЫБРАТЬ ...} основного запроса Построителя.

Шаг 4. Решение проблемы кэширования (стандартные настройки)

Бывает так: код написан идеально, запрос проверен в консоли, но при запуске отчета всё равно вылетает ошибка "Поле не найдено". Выясним причину этого странного поведения. 1С сохраняет настройки отчетов для каждого пользователя. Если вы ранее открывали этот отчет, система пытается восстановить старую структуру полей, в которой ваших новых колонок еще не существовало.

Чтобы изменения вступили в силу, необходимо выполнить одно из действий:

Подведение итогов

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

← На главную