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