Отчеты и Аналитика · 12 мин
Как добавить поле в отчет 1С программно
Разбираем, как программно добавить поле в отчет 1С на СКД: через настройки компоновщика, схему компоновки и вычисляемые поля. Примеры кода и типичные ошибки.
Задача добавить поле в отчет 1С программно возникает, когда типовой настройки в режиме предприятия недостаточно: нужно вывести дополнительную колонку из связанного справочника, посчитать показатель на лету или сформировать состав полей динамически в зависимости от прав пользователя. В большинстве конфигураций отчеты построены на системе компоновки данных (СКД), поэтому почти все манипуляции сводятся к работе с настройками компоновщика или самой схемой.
Существует три принципиально разных подхода: изменить пользовательские настройки отчета перед формированием, добавить вычисляемое поле в схему компоновки или модифицировать структуру настроек программно через объект КомпоновщикНастроек. Выбор зависит от того, где выполняется код — в модуле объекта отчета, в форме отчета или во внешней обработке.
Ниже разобраны рабочие способы с примерами кода на встроенном языке 1С. Примеры ориентированы на управляемые формы и типовой механизм СКД, который используется в конфигурациях на базе БСП (УТ, ERP, БП, ЗУП), а также применим к самописным отчетам.
Как устроен отчет на СКД и где «живут» поля
Прежде чем менять что-то программно, важно понимать трехуровневую структуру отчета на СКД. Первый уровень — схема компоновки данных: она описывает наборы данных (запросы), ресурсы, вычисляемые поля и связи. Поля, которых нет в схеме, добавить в настройки невозможно в принципе. Второй уровень — настройки компоновщика: здесь определяется, какие из доступных полей реально выводятся, их порядок, группировки и отборы. Третий уровень — пользовательские настройки, которые в типовых конфигурациях редактирует пользователь в режиме предприятия.
Отсюда следует главное правило диагностики: если поле недоступно в настройках, сначала проверяют схему. Если поле есть в схеме, но не выводится — работают с настройками. Если поле выводится, но пустое — проблема в запросе набора данных или в связях, а не в составе полей.
Способ 1. Включить существующее поле в настройках
Самый частый сценарий: поле уже есть в схеме (например, «ОсновнойМенеджер» у документа), но в типовом варианте отчета оно скрыто. Тогда программно его нужно просто включить. Код обычно размещают в модуле объекта отчета в обработчике ПередКомпоновкойРезультата или в форме отчета перед формированием.
Настройки = КомпоновщикНастроек.ПолучитьНастройки();
НовоеПоле = Настройки.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
НовоеПоле.Поле = Новый ПолеКомпоновкиДанных("ОсновнойМенеджер");
НовоеПоле.Использование = Истина;
КомпоновщикНастроек.ЗагрузитьНастройки(Настройки);
Если отчет построен на группировках (например, «Номенклатура» внутри «Склад»), простое добавление в корневой выбор может не сработать так, как ожидается: поле появится на верхнем уровне, а не внутри нужной группировки. В этом случае сначала находят нужную группировку в Настройки.Структура и добавляют поле в её коллекцию Выбор.Элементы.
Признак успешного результата: после перезагрузки настроек и формирования отчета новая колонка появляется в табличном документе с заполненными значениями. Если колонка появилась, но пустая — поле выбрано, но данные для него не собираются, и нужно смотреть запрос схемы.
- 1Откройте схему компоновки данных отчета и убедитесь, что нужное поле доступно в наборе данных
- 2В модуле отчета или формы получите текущие настройки компоновщика
- 3Добавьте элемент в Настройки.Выбор.Элементы с указанием ПолеКомпоновкиДанных
- 4Загрузите измененные настройки обратно в компоновщик
- 5Сформируйте отчет и проверьте, что колонка выводится и заполнена
Способ 2. Добавить вычисляемое поле в схему программно
Когда нужного поля нет в исходном запросе, но его можно посчитать из существующих, используют вычисляемые поля. Их можно добавить прямо в объект СхемаКомпоновкиДанных перед компоновкой — например, в событии ПриКомпоновкеРезультата модуля объекта отчета.
СхемаКД = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
ВычПоле = СхемаКД.ВычисляемыеПоля.Добавить();
ВычПоле.ПутьКДанным = "СуммаСНДС";
ВычПоле.Выражение = "Сумма + Сумма * 0.2";
ВычПоле.ТипЗначения = Новый ОписаниеТипов("Число");
ВычПоле.Заголовок = "Сумма с НДС";
После добавления вычисляемого поля схему передают в компоновщик макета, и дальше поле доступно в настройках наравне с полями запроса. В типовом механизме это выглядит так: создается новый КомпоновщикМакетаКомпоновкиДанных, ему передается измененная схема, настройки и данные расшифровки.
Важное ограничение: выражение вычисляемого поля пишется на языке выражений СКД, а не на встроенном языке 1С. В нем доступны арифметика, функции работы со строками и датами, но нельзя вызвать произвольную функцию общего модуля без специальных приемов. Для сложной логики лучше перенести расчет в запрос набора данных.
Способ 3. Добавить поле через запрос набора данных
Самый надежный способ получить поле, которого нет в исходных данных, — доработать текст запроса в наборе данных схемы. Программно это делают, когда текст запроса нужно менять динамически: например, подставлять разные соединения в зависимости от параметров.
НаборДанных = СхемаКД.НаборыДанных.НаборДанных1;
ТекстЗапроса = НаборДанных.Запрос;
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "Продажи.Сумма",
"Продажи.Сумма, Продажи.Документ.Ответственный КАК Ответственный");
НаборДанных.Запрос = ТекстЗапроса;
После изменения текста запроса необходимо убедиться, что новое поле появилось в коллекции НаборДанных.Поля — либо добавить его туда вручную с указанием пути к данным и типа. Без этого СКД не увидит поле, даже если запрос его возвращает. Также поле нужно включить в настройки выбранных полей, как описано в первом способе.
Этот подход предпочтителен, когда значение поля берется из базы данных: вычисление на уровне СУБД работает быстрее, чем вычисляемые поля СКД, особенно на больших объемах. Минус — модификация запроса строковыми операциями хрупка: при изменении типового текста запроса замена может перестать находить нужный фрагмент.
Добавление поля в отчет на управляемой форме
В форме отчета (особенно в отчетах на БСП) программное добавление поля обычно выполняют в обработчике ПередЗагрузкойВариантаНаСервере или в команде перед вызовом СкомпоноватьРезультат. В БСП-отчетах доступ к настройкам идет через реквизит формы Отчет.КомпоновщикНастроек, а пользовательские настройки лежат отдельно и имеют приоритет над основными.
Ключевой нюанс: если пользователь ранее сохранил свои настройки, ваши программные изменения основных настроек могут не отразиться — пользовательские настройки перекроют их. Поэтому в типовых механизмах программно добавленное поле либо добавляют и в пользовательские настройки, либо сбрасывают пользовательские настройки к стандартным при необходимости.
Проверка результата в форме простая: после формирования откройте «Настройки» отчета в режиме предприятия — добавленное поле должно быть видно в списке выбранных полей с установленным флажком. Если поле есть в списке, но снят флажок, значит, признак использования не применился.
При отладке удобно вывести состав доступных полей: перебрать КомпоновщикНастроек.Настройки.Выбор.ДоступныеПоляВыбора.Элементы и записать их имена в журнал регистрации. Это сразу показывает, существует ли нужное поле в схеме и как точно называется его путь к данным.
Типичные ошибки и ограничения
Первая ошибка — обращение к полю по синониму вместо пути к данным. В ПолеКомпоновкиДанных указывается именно путь (например, «Номенклатура.Артикул»), а не заголовок колонки. Вторая частая проблема — добавление поля в настройки, когда отчет использует вариант с детальными записями: поле надо добавлять в выбор той группировки, где оно должно отображаться, иначе оно появится только в итоговой строке или не появится вовсе.
Третья группа ошибок связана с ресурсами. Если добавляемое числовое поле должно суммироваться по группировкам, его нужно объявить ресурсом в схеме с выражением агрегирования (например, Сумма(СуммаСНДС)). Без этого в итогах по группам поле будет пустым, хотя в детальных строках значения есть.
Проверка результата и выбор подходящего способа
После любого способа результат проверяют по трем признакам: поле присутствует в списке выбранных полей настроек, колонка выводится в табличный документ, значения и итоги заполнены корректно. Если хотя бы один пункт не выполняется, возвращаются к соответствующему уровню: схема, настройки или запрос.
Как проверить результат
Поле видно в списке выбранных полей, флажок установлен
Поля нет в списке — его нет в схеме или настройки не загрузились
Колонка выводится в нужной группировке
Колонки нет или она только в итогах — поле добавлено не в ту структуру
Детальные строки и итоги заполнены
Итоги пустые — поле не объявлено ресурсом
Итоговый выбор способа сводится к простому правилу: поле есть в схеме — включайте в настройках; поле считается из имеющихся — используйте вычисляемое поле; поле нужно взять из базы — дорабатывайте запрос набора данных. Для типовых конфигураций любые изменения безопаснее выполнять через расширение или внешний отчет.
Сравнение способов
Подходит, когда поле уже есть в схеме. Самый простой и безопасный вариант, но не решает задачу отсутствующих данных
Подходит для расчетов на основе имеющихся полей. Ограничение — язык выражений СКД, нельзя обратиться к базе данных
Подходит, когда данные нужно получить из информационной базы. Гибко и быстро, но строковая модификация запроса чувствительна к изменениям типового текста
Что важно запомнить
Поле можно вывести только если оно объявлено в схеме компоновки. Существующее поле включают через Настройки.Выбор.Элементы, расчетное — добавляют как вычисляемое, отсутствующее — через запрос набора данных. Числовое поле для итогов объявляют ресурсом, а доработки типовых отчетов делают через расширение или внешний отчет.
Частые вопросы
Можно ли добавить поле в отчет без изменения конфигурации?
Да, если поле уже есть в схеме компоновки: пользователь может включить его сам через кнопку «Настройки» в режиме предприятия. Программно это делается через расширение конфигурации или внешний отчет, не затрагивая основную конфигурацию.
Почему добавленное поле выводится пустым?
Чаще всего поле включено в настройках, но запрос набора данных его не возвращает, либо для числового поля не задан ресурс с агрегатной функцией. Проверьте текст запроса схемы и список ресурсов.
Как добавить поле программно в отчет на обычных формах?
Механика та же — работа с объектом КомпоновщикНастроек и схемой, отличается только место размещения кода: модуль формы обычного приложения или модуль объекта отчета. Сами объекты СКД идентичны.
Что делать, если пользовательские настройки перекрывают программные изменения?
Добавляйте поле и в пользовательские настройки (коллекция ПользовательскиеНастройки компоновщика), либо сбрасывайте их к стандартным методом установки стандартных настроек. В отчетах на БСП для этого есть служебные процедуры в модуле менеджера отчета.
Можно ли в вычисляемом поле вызвать функцию из общего модуля?
Напрямую нет: язык выражений СКД не вызывает произвольный код. Обходные пути — перенести расчет в запрос, использовать события процессора вывода (ПриВыводеРезультата) для постобработки табличного документа или подключить внешние функции через специальные механизмы расширения языка выражений, что требует аккуратной реализации.
Как добавить поле из табличной части документа?
Через запрос набора данных: в тексте запроса обращаются к табличной части (например, Документ.РеализацияТоваровУслуг.Товары) и выбирают нужные реквизиты. После этого поле становится доступным в схеме и включается в настройки обычным способом.