К статье
Практический материал

Отчеты и Аналитика · 13 мин

Как программно добавить поле в СКД 1С

Как программно добавить поле в СКД 1С: работа со схемой компоновки данных, настройки компоновщика, вычисляемые поля и ресурсы. Примеры кода и типичные ошибки.

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

Ключевое ограничение, о котором часто забывают: настройки компоновщика позволяют выбирать только те поля, которые уже описаны в схеме (в наборе данных, вычисляемых полях или ресурсах). Если поля в схеме нет, его сначала нужно туда добавить — либо в конфигураторе, либо программно через объектную модель СКД. Просто «приписать» произвольное поле к выводу отчёта нельзя.

Ниже разобраны оба сценария с примерами кода, способами добавления вычисляемых полей и ресурсов, а также типичные ошибки, из-за которых новое поле не появляется в отчёте или выдаёт пустые значения.

Как устроена СКД и где «живут» поля

Схема компоновки данных — это XML-описание отчёта, доступное в коде как объект СхемаКомпоновкиДанных. Поля в ней существуют на нескольких уровнях: поля наборов данных (результат запроса или объектного источника), вычисляемые поля, ресурсы (итоговые показатели), параметры и поля итогов. Настройки компоновщика (НастройкиКомпоновкиДанных) лишь ссылаются на эти поля по имени.

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

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

Способ 1: добавить поле в настройки компоновщика

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

Пример кода для модуля формы отчёта или внешней обработки:

КомпоновщикНастроек.ЗагрузитьНастройки(СхемаКД.НастройкиПоУмолчанию);

Настройки = КомпоновщикНастроек.Настройки;

НовоеПоле = Настройки.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));

НовоеПоле.Поле = Новый ПолеКомпоновкиДанных("СуммаДокумента");

НовоеПоле.Использование = Истина;

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

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

Добавление поля через настройки
  1. 1
    Убедитесь, что поле есть в схеме: проверьте ДоступныеПоляВыбора у настроек
  2. 2
    Загрузите настройки по умолчанию или текущий вариант в компоновщик настроек
  3. 3
    Добавьте элемент в Настройки.Выбор.Элементы с типом ВыбранноеПолеКомпоновкиДанных
  4. 4
    Установите Поле, Использование и при необходимости Заголовок
  5. 5
    Выполните компоновку и проверьте, что колонка появилась и заполнена

Способ 2: программно изменить саму схему

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

Добавление поля в набор данных

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

СхемаКД = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");

НаборДанных = СхемаКД.НаборыДанных.Найти("НаборДанных1");

НовоеПоле = НаборДанных.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));

НовоеПоле.Поле = "Менеджер";

НовоеПоле.ПутьКДанным = "Менеджер";

НовоеПоле.Заголовок = "Менеджер";

НовоеПоле.ТипЗначения = Новый ОписаниеТипов("СправочникСсылка.Пользователи");

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

Способ 3: вычисляемые поля

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

ВычисляемоеПоле = СхемаКД.ВычисляемыеПоля.Добавить();

ВычисляемоеПоле.ПутьКДанным = "СуммаСНДС";

ВычисляемоеПоле.Выражение = "Сумма * 1.2";

ВычисляемоеПоле.Заголовок = "Сумма с НДС";

ВычисляемоеПоле.ТипЗначения = Новый ОписаниеТипов("Число", , , Новый КвалификаторыЧисла(15, 2));

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

Способ 4: добавление ресурса

Ресурсы — это поля, по которым СКД считает итоги (сумма, количество, среднее). Если вы добавили в набор данных новое числовое поле и хотите видеть по нему итоги в группировках, его нужно объявить ресурсом:

Ресурс = СхемаКД.ПоляИтога.Добавить();

Ресурс.ПутьКДанным = "СуммаДокумента";

Ресурс.Выражение = "Сумма(СуммаДокумента)";

Частая ситуация: поле выведено, но в строках группировок и в общем итоге стоит пустое значение. Причина почти всегда в том, что поле не добавлено в ресурсы либо для ресурса задана группировка расчёта, не совпадающая со структурой отчёта. Проверяйте свойство Группировки ресурса — если оно заполнено, итог считается только в перечисленных группировках.

Сравнение способов добавления поля

Настройки компоновщика

Подходит, если поле уже есть в схеме. Не меняет отчёт, работает только в текущем запуске, безопасно

Поле набора данных

Нужно, когда данные берутся из запроса. Требует синхронизации с текстом запроса

Вычисляемое поле

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

Ресурс

Для итоговых показателей по группировкам. Без него числовое поле не даст итогов

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

Ниже сквозной фрагмент, который получает схему, добавляет вычисляемое поле, выводит его в настройки и формирует отчёт в табличный документ:

СхемаКД = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");

ВычисляемоеПоле = СхемаКД.ВычисляемыеПоля.Добавить();

ВычисляемоеПоле.ПутьКДанным = "Наценка";

ВычисляемоеПоле.Выражение = "ЦенаПродажи - ЦенаЗакупки";

ВычисляемоеПоле.Заголовок = "Наценка";

Настройки = СхемаКД.НастройкиПоУмолчанию;

Выбранное = Настройки.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));

Выбранное.Поле = Новый ПолеКомпоновкиДанных("Наценка");

Выбранное.Использование = Истина;

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

МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКД, Настройки);

ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;

ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);

Результат = Новый ТабличныйДокумент;

ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;

ПроцессорВывода.УстановитьДокумент(Результат);

ПроцессорВывода.Вывести(ПроцессорКомпоновки);

Если отчёт строится на управляемой форме с реквизитом Отчет и компоновщиком настроек, достаточно подменить схему до формирования: присвоить модифицированную схему через ПоместитьВоВременноеХранилище и установить адрес в КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресСхемы)).

Частые ошибки и как их диагностировать

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

Вторая ошибка — поле добавлено в набор данных, но отсутствует в тексте запроса. На этапе компоновки возникает ошибка выполнения запроса. Решение — синхронно править НаборДанных.Запрос, добавляя выражение в секцию выборки.

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

Типичные ошибки
01
Добавление поля только в настройки при отсутствии его в схеме — поле не выводится или возникает ошибка «Поле не найдено»
02
Поле есть в наборе данных, но не в тексте запроса — ошибка выполнения запроса при формировании отчёта
03
Числовое поле не добавлено в ресурсы — пустые итоги в группировках и общем итоге
04
Изменение схемы после создания компоновщика макета — правки игнорируются
05
Совпадение ПутьКДанным с существующим полем — конфликт имён и непредсказуемый вывод

Проверка результата

После формирования отчёта убедитесь в трёх вещах: колонка с новым полем присутствует в табличном документе, значения в детальных строках заполнены и соответствуют ожидаемой логике, итоги по группировкам считаются корректно (для ресурсов). Если колонка есть, но пуста — проверяйте выражение вычисляемого поля и тип значения; если колонки нет вовсе — проверяйте флаг Использование у выбранного поля и у родительских группировок.

Полезный приём отладки — вывести XML схемы и настроек через СериализаторXDTO и посмотреть, действительно ли ваши добавления присутствуют в итоговом описании. Это быстро локализует проблему: либо поле не добавилось, либо отключено использованием на верхнем уровне структуры.

Контрольные точки

Как проверить результат

Наличие колонки в отчёте
Норма

Колонка выведена с заданным заголовком

Тревожный признак

Колонки нет — проверить Использование и доступность поля

Значения в строках
Норма

Значения соответствуют формуле или данным запроса

Тревожный признак

Пустые значения — ошибка в выражении или типе

Итоги по группировкам
Норма

Итоги суммируются корректно

Тревожный признак

Итоги пусты — поле не добавлено в ресурсы

FAQ

Можно ли добавить поле в СКД без изменения макета отчёта?

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

Почему добавленное поле не видно в доступных полях настроек?

Скорее всего, компоновщик настроек был инициализирован до модификации схемы или схема загружена из другого источника. Переинициализируйте компоновщик, указав источник доступных настроек с адресом изменённой схемы во временном хранилище.

Как добавить поле в отчёт на управляемой форме, созданный на СКД в конфигураторе?

В модуле формы получите схему, модифицируйте её, поместите во временное хранилище и вызовите КомпоновщикНастроек.Инициализировать с новым источником настроек. После этого добавьте поле в выбранные поля и сформируйте отчёт стандартно.

Чем вычисляемое поле отличается от пользовательского поля?

Вычисляемое поле задаётся в схеме выражением на языке выражений СКД и доступно во всех вариантах отчёта. Пользовательское поле создаётся в настройках (выражение или выбор по условию) и существует только в рамках конкретных настроек, не меняя схему.

Можно ли программно добавить поле в макет СКД типового отчёта, не снимая конфигурацию с поддержки?

Да, через расширение конфигурации: заимствуйте отчёт и измените его макет СКД в расширении. Альтернатива без расширения — программная модификация схемы в памяти при формировании, например через подмену схемы в обработчике формы отчёта.

Почему в группировках по новому ресурсу пустые итоги?

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

Итог

Что важно запомнить

Поле можно вывести в отчёт только если оно описано в схеме компоновки. Если поля нет — добавляйте его в набор данных, вычисляемые поля или ресурсы до создания компоновщика макета; если есть — достаточно добавить его в выбранные поля настроек. Числовые поля для итогов обязательно объявляйте ресурсами.