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