Поля СКД 1С: роль, заголовок, ограничения и оформление

Дата: 02.10.2026 17:34:55
СКД
Отчеты
Поля СКД
Компоновка данных
Условное оформление
Комментарий:
0
Платформа:
8.3
Конфигурация:
Любая
Формы:
Управляемые

Поля СКД в 1С описываются на закладке «Наборы данных» схемы компоновки. От них зависит, какие колонки пользователь выведет, по чему отберет и сгруппирует, как назовется колонка, сколько знаков будет у суммы и верно ли посчитаются остатки. Ниже — что значит каждая колонка описания поля, почему поле пропадает из доступных и как работать с полями схемы и настроек из кода. Общее устройство схемы — в статье что такое СКД.

Поля СКД в 1С: что хранит строка набора данных

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

КолонкаЧто задаетЕсли не заполнить
ПолеПсевдоним в запросе или имя колонки таблицыЗаполняется автозаполнением
ПутьИмя в настройках, выражениях и кодеРавен «Поле»
ЗаголовокНазвание колонки и поля в спискеСтроится из пути: «СуммаОборот» → «Сумма оборот»
Ограничение поляЗапрет на выбор, отбор, группировку, порядокПоле доступно везде
Ограничение реквизитовТо же для реквизитов через точкуРеквизиты доступны
РольПериод, измерение, остаток, счет, обязательноеОстатки в группировках могут быть неверны
Выражение представленияТекст вместо значенияСтандартное представление
Тип значенияТип поляУ запроса — из запроса, у набора-объекта неизвестен
Доступные значенияСписок значений для отбораВыбор по типу
ОформлениеФормат, цвет, шрифт, выделение отрицательныхПо умолчанию
Параметры редактированияВыбор значения в отборе: быстрый выбор, параметры выбораСтандартный выбор

Путь к данным и заголовок

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

В наборе-объединении путь склеивает данные: поля вложенных наборов с одинаковым путем дают одну колонку. Если в одном запросе сумма называется «Сумма», а в другом «СуммаДокумента», в отчете окажутся две полупустые колонки.

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

Поля набора данных СКД из кода

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

// Общий модуль ПоляСКД.
// Свойства модуля: Сервер - Истина, Вызов сервера - Ложь.
// Объекты схемы компоновки на клиенте недоступны, весь код - серверный.

// Возвращает набор данных верхнего уровня по имени или Неопределено.
Функция НаборДанныхПоИмени(Схема, ИмяНабора) Экспорт

    Для Каждого Набор Из Схема.НаборыДанных Цикл
        Если ВРег(Набор.Имя) = ВРег(ИмяНабора) Тогда
            Возврат Набор;
        КонецЕсли;
    КонецЦикла;

    Возврат Неопределено;

КонецФункции

// Возвращает описание поля набора по пути к данным, при необходимости добавляет его.
// В наборе-запросе с автозаполнением поле бывает доступно и без описания,
// но заголовок, оформление и ограничения задаются только описанному полю.
// Для нового описания путь должен совпадать с псевдонимом в запросе (КАК ...).
Функция ОписаниеПоля(Набор, ПутьКДанным) Экспорт

    Для Каждого Элемент Из Набор.Поля Цикл
        Если ТипЗнч(Элемент) = Тип("ПолеНабораДанныхСхемыКомпоновкиДанных")
            И ВРег(Элемент.ПутьКДанным) = ВРег(ПутьКДанным) Тогда
            Возврат Элемент;
        КонецЕсли;
    КонецЦикла;

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

    Возврат Поле;

КонецФункции

// Пример для отчета о продажах. Запрос набора "Продажи" возвращает поля
// Номенклатура, Контрагент, Регистратор, Количество, Выручка, Себестоимость.
// Вызывать до инициализации компоновщика настроек.
Процедура НастроитьПоляПродаж(Схема) Экспорт

    Набор = НаборДанныхПоИмени(Схема, "Продажи");
    Если Набор = Неопределено Тогда
        ВызватьИсключение "В схеме нет набора данных ""Продажи""";
    КонецЕсли;

    // Заголовок: так поле называется в колонке отчета и в списке полей.
    Контрагент = ОписаниеПоля(Набор, "Контрагент");
    Контрагент.Заголовок = "Покупатель";

    // Формат и выделение отрицательных действуют везде, где выводится поле.
    Выручка = ОписаниеПоля(Набор, "Выручка");
    Выручка.Заголовок = "Выручка, руб.";
    Выручка.Оформление.УстановитьЗначениеПараметра("Формат", "ЧДЦ=2; ЧН='—'");
    Выручка.Оформление.УстановитьЗначениеПараметра("ВыделятьОтрицательные", Истина);

    Количество = ОписаниеПоля(Набор, "Количество");
    Количество.Оформление.УстановитьЗначениеПараметра("Формат", "ЧДЦ=3");

    // В ячейке - артикул и наименование, значением поля остается ссылка.
    Номенклатура = ОписаниеПоля(Набор, "Номенклатура");
    Номенклатура.ВыражениеПредставления =
        "Номенклатура.Артикул + "" "" + Номенклатура.Наименование";

    // Регистратор выводить можно, раскрывать в реквизиты - нет.
    Регистратор = ОписаниеПоля(Набор, "Регистратор");
    Регистратор.ОграничениеИспользованияРеквизитов.Поле = Истина;
    Регистратор.ОграничениеИспользованияРеквизитов.Условие = Истина;
    Регистратор.ОграничениеИспользованияРеквизитов.Группировка = Истина;
    Регистратор.ОграничениеИспользованияРеквизитов.Порядок = Истина;

КонецПроцедуры
  • ОписаниеПоля ищет по пути; у нового описания «Поле» должно совпадать с псевдонимом в запросе.
  • Параметры оформления называются как в окне «Оформление», только без пробелов.
  • Выражение представления пишется на языке выражений СКД, кавычки в строке 1С удваиваются. Группировка и расшифровка работают со ссылкой.
  • Схему правят до инициализации компоновщика: доступные поля строятся в момент Инициализировать. В форме отчета схему после правки кладут во временное хранилище и заново инициализируют Отчет.КомпоновщикНастроек.

Ограничение использования поля СКД

Четыре флажка ограничения — это запреты: каждый отмеченный убирает поле из одного списка доступных полей. В коде им соответствуют свойства ОграничениеИспользования и ОграничениеИспользованияРеквизитов с булевыми Поле, Условие, Группировка и Порядок.

ФлажокГде поле пропадает
ПолеВыбранные поля: колонкой не вывести
УсловиеОтбор
ГруппировкаПоля группировок
ПорядокСортировка

«Ограничение реквизитов» делает то же для реквизитов через точку; при всех четырех флажках плюсика у поля нет. Так страхуются от тяжелых запросов: реквизит составного поля вроде регистратора СКД получает соединением со всеми таблицами документов.

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

// Продолжение общего модуля ПоляСКД.

// Прячет поле от пользователя: его нет в списках выбора, отбора, группировки
// и порядка, реквизиты тоже недоступны. Выражения схемы поле по-прежнему видят.
// Обходит наборы верхнего уровня и вложенные наборы объединений.
//
// Возвращаемое значение:
//  Число - сколько описаний поля изменено.
//
Функция СкрытьПолеОтПользователя(НаборыДанных, ПутьКДанным) Экспорт

    Изменено = 0;

    Для Каждого Набор Из НаборыДанных Цикл

        Для Каждого Элемент Из Набор.Поля Цикл
            Если ТипЗнч(Элемент) = Тип("ПолеНабораДанныхСхемыКомпоновкиДанных")
                И ВРег(Элемент.ПутьКДанным) = ВРег(ПутьКДанным) Тогда
                ЗапретитьВсе(Элемент.ОграничениеИспользования);
                ЗапретитьВсе(Элемент.ОграничениеИспользованияРеквизитов);
                Изменено = Изменено + 1;
            КонецЕсли;
        КонецЦикла;

        Если ТипЗнч(Набор) = Тип("НаборДанныхОбъединениеСхемыКомпоновкиДанных") Тогда
            Изменено = Изменено + СкрытьПолеОтПользователя(Набор.Элементы, ПутьКДанным);
        КонецЕсли;

    КонецЦикла;

    Возврат Изменено;

КонецФункции

Процедура ЗапретитьВсе(Ограничение)

    Ограничение.Поле = Истина;
    Ограничение.Условие = Истина;
    Ограничение.Группировка = Истина;
    Ограничение.Порядок = Истина;

КонецПроцедуры

// Наценка из скрытой себестоимости: себестоимости в отчете не видно,
// а вычисляемое поле и ресурс на ее основе работают.
Процедура ДобавитьНаценку(Схема) Экспорт

    Для Каждого ВычисляемоеПоле Из Схема.ВычисляемыеПоля Цикл
        Если ВРег(ВычисляемоеПоле.ПутьКДанным) = ВРег("Наценка") Тогда
            Возврат; // уже добавлена
        КонецЕсли;
    КонецЦикла;

    Если СкрытьПолеОтПользователя(Схема.НаборыДанных, "Себестоимость") = 0 Тогда
        ВызватьИсключение "В наборах схемы нет описания поля ""Себестоимость""";
    КонецЕсли;

    Наценка = Схема.ВычисляемыеПоля.Добавить();
    Наценка.ПутьКДанным = "Наценка";
    Наценка.Выражение = "Выручка - ЕстьNULL(Себестоимость, 0)";
    Наценка.Заголовок = "Наценка, руб.";
    Наценка.ТипЗначения = Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 2));
    Наценка.Оформление.УстановитьЗначениеПараметра("Формат", "ЧДЦ=2");
    Наценка.ОграничениеИспользования.Группировка = Истина;

    Ресурс = Схема.ПоляИтога.Добавить();
    Ресурс.ПутьКДанным = "Наценка";
    Ресурс.Выражение = "Сумма(Наценка)";

КонецПроцедуры
  • Обходятся и вложенные наборы объединения — запрет попадет во все описания поля.
  • Поле, не описанное в наборе, сначала описывают функцией ОписаниеПоля.
  • Вычисляемое поле описывается теми же колонками, что и поле набора, а итоги по нему дает строка в ресурсах.

Роль поля СКД: что меняет каждая

Роль не создает группировок. Она подсказывает компоновке, как считать остатки, когда группировки идут не по всем измерениям и периодам. Если остатков в наборе нет, роли почти всегда можно не трогать.

РольЧто указываютЧто меняет
ПериодНомер периода и тип: основной или дополнительныйНачальный остаток группы берется по первому периоду, конечный — по последнему
ИзмерениеФлажок, при необходимости родительское измерениеОстаток группы складывается по сочетаниям измерений, а не из всех строк подряд
ОстатокГруппа остатка (пара начальный — конечный), тип остатка, тип бухгалтерского остатка, поле счетаПоле считается как остаток, а не простой суммой; для счетов — развернутое сальдо
СчетФлажок и выражение вида счетаКомпоновка знает, активный счет или пассивный
ОбязательноеФлажокПоле попадает в запрос, даже если в настройках не выбрано

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

Для полей виртуальных таблиц регистров роли расставляет автозаполнение, вручную их задают для остатков из своего запроса. Симптом пропущенной роли — начальный остаток группы равен сумме начальных остатков всех ее строк. Методические рекомендации 1С предъявляют требования и к данным: начальный остаток идет в паре с конечным, периоды пронумерованы подряд с единицы, нет двух строк с одинаковым периодом и измерениями, конечный остаток периода равен начальному следующего.

Тип значения и реквизиты через точку

У набора-запроса тип известен из запроса; смешанный тип поля-выражения приводят в самом запросе через ВЫРАЗИТЬ. Ссылочный тип дает полю плюсик с реквизитами — обращение через точку СКД допишет в запрос сама.

У набора-объекта автозаполнения нет: неописанное поле в настройки не попадет, а поле без типа не раскроется в реквизиты. Функция строит схему по таблице значений и берет типы из колонок.

// Продолжение общего модуля ПоляСКД.

// Схема для отчета по таблице значений. У набора-объекта автозаполнения нет:
// поле, которое не описали, в настройках не появится, а поле без типа
// не раскроется в реквизиты.
//
// Параметры:
//  Таблица    - ТаблицаЗначений - колонки созданы с типами.
//  ИмяОбъекта - Строка - ключ таблицы в структуре внешних наборов данных.
//
// Возвращаемое значение:
//  СхемаКомпоновкиДанных
//
Функция СхемаПоТаблицеЗначений(Таблица, ИмяОбъекта = "Данные") Экспорт

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

    Источник = Схема.ИсточникиДанных.Добавить();
    Источник.Имя = "ИсточникДанных1";
    Источник.ТипИсточникаДанных = "Local";

    Набор = Схема.НаборыДанных.Добавить(Тип("НаборДанныхОбъектСхемыКомпоновкиДанных"));
    Набор.Имя = "НаборДанных1";
    Набор.ИсточникДанных = Источник.Имя;
    Набор.ИмяОбъекта = ИмяОбъекта;

    Для Каждого Колонка Из Таблица.Колонки Цикл

        // Колонки выгрузки запроса часто содержат в типе Null - для схемы он лишний.
        ТипПоля = Новый ОписаниеТипов(Колонка.ТипЗначения, , "Null");
        Типы = ТипПоля.Типы();
        Если Типы.Количество() = 0 Тогда
            ВызватьИсключение "У колонки " + Колонка.Имя + " не задан тип значения";
        КонецЕсли;

        Поле = Набор.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
        Поле.Поле = Колонка.Имя;
        Поле.ПутьКДанным = Колонка.Имя;
        Поле.ТипЗначения = ТипПоля;
        Если ЗначениеЗаполнено(Колонка.Заголовок) Тогда
            Поле.Заголовок = Колонка.Заголовок;
        КонецЕсли;

        Если Типы.Количество() = 1 И Типы[0] = Тип("Число") Тогда
            // Число без других типов - ресурс с суммой в группировках и итоге.
            Ресурс = Схема.ПоляИтога.Добавить();
            Ресурс.ПутьКДанным = Колонка.Имя;
            Ресурс.Выражение = "Сумма(" + Колонка.Имя + ")";
            Поле.Оформление.УстановитьЗначениеПараметра("Формат", "ЧДЦ=2");
            Поле.Оформление.УстановитьЗначениеПараметра("ВыделятьОтрицательные", Истина);
        КонецЕсли;

    КонецЦикла;

    Возврат Схема;

КонецФункции
  • Null из типа колонки убирается, иначе числовая колонка не станет ресурсом.
  • Пустой заголовок колонки не переносится — платформа построит его из имени.
  • Таблицу передают процессору во внешних наборах данных под ключом ИмяОбъекта; вывод целиком — в статье про СКД программно.

Почему поля нет в доступных полях

Причины в порядке частоты:

  1. Поля нет в запросе, или автозаполнение выключено, а строку поля не добавили.
  2. Стоит флажок ограничения: поле есть в отборе, но нет в группировках — ищите «Группировка».
  3. Это ресурс — в группировки он не попадает.
  4. Реквизит не раскрывается: ограничение реквизитов, тип не ссылочный или не задан, роль «Период».
  5. Схему поменяли кодом после инициализации компоновщика.
  6. Реквизит отключен функциональной опцией.

Функция ниже проверяет описание поля и списки доступных полей компоновщика и возвращает текст для сообщения.

// Продолжение общего модуля ПоляСКД. Режим совместимости не ниже 8.3.6.

// Объясняет, почему поле не видно в настройках отчета.
//
// Параметры:
//  Схема     - СхемаКомпоновкиДанных
//  ПутьКПолю - Строка - путь как в настройках, можно через точку: "Контрагент.ИНН".
//
// Возвращаемое значение:
//  Строка - результат проверки, по пункту в строке.
//
Функция ПочемуНетПоля(Схема, ПутьКПолю) Экспорт

    Итог = Новый Массив;
    ИмяПоля = СтрРазделить(ПутьКПолю, ".")[0];
    ЭтоРеквизит = (ИмяПоля <> ПутьКПолю);

    // 1. Описание поля в наборах верхнего уровня.
    Описание = Неопределено;
    Для Каждого Набор Из Схема.НаборыДанных Цикл
        Для Каждого Элемент Из Набор.Поля Цикл
            Если ТипЗнч(Элемент) = Тип("ПолеНабораДанныхСхемыКомпоновкиДанных")
                И ВРег(Элемент.ПутьКДанным) = ВРег(ИмяПоля) Тогда
                Описание = Элемент;
                Прервать;
            КонецЕсли;
        КонецЦикла;
        Если Описание <> Неопределено Тогда
            Прервать;
        КонецЕсли;
    КонецЦикла;

    Если Описание = Неопределено Тогда
        Итог.Добавить("Описания поля " + ИмяПоля + " в наборах нет: если это не вычисляемое "
            + "поле, проверьте запрос и флажок автозаполнения набора.");
    Иначе
        Ограничение = ?(ЭтоРеквизит, Описание.ОграничениеИспользованияРеквизитов,
            Описание.ОграничениеИспользования);
        Итог.Добавить(СтрШаблон("Запреты %1: выбор %2, отбор %3, группировка %4, порядок %5",
            ?(ЭтоРеквизит, "реквизитов", "поля"),
            Формат(Ограничение.Поле, "БЛ=нет; БИ=да"),
            Формат(Ограничение.Условие, "БЛ=нет; БИ=да"),
            Формат(Ограничение.Группировка, "БЛ=нет; БИ=да"),
            Формат(Ограничение.Порядок, "БЛ=нет; БИ=да")));
        Если ЭтоРеквизит И Описание.Роль.НомерПериода > 0 Тогда
            Итог.Добавить("У поля роль ""Период"": его реквизиты не группируются.");
        КонецЕсли;
    КонецЕсли;

    Для Каждого Ресурс Из Схема.ПоляИтога Цикл
        Если ВРег(Ресурс.ПутьКДанным) = ВРег(ПутьКПолю) Тогда
            Итог.Добавить("Поле - ресурс: в поля группировки ресурсы не попадают.");
            Прервать;
        КонецЕсли;
    КонецЦикла;

    // 2. Что видит компоновщик: доступные поля строятся при инициализации.
    Компоновщик = Новый КомпоновщикНастроекКомпоновкиДанных;
    Попытка
        Компоновщик.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(Схема));
    Исключение
        Итог.Добавить("Схема не инициализируется: "
            + КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
        Возврат СтрСоединить(Итог, Символы.ПС);
    КонецПопытки;
    Компоновщик.ЗагрузитьНастройки(Схема.НастройкиПоУмолчанию);

    Настройки = Компоновщик.Настройки;
    // Временная группировка - ради списка доступных полей группировок.
    Группировка = Настройки.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));

    Списки = Новый Структура;
    Списки.Вставить("Выбор", Настройки.Выбор.ДоступныеПоляВыбора);
    Списки.Вставить("Отбор", Настройки.Отбор.ДоступныеПоляОтбора);
    Списки.Вставить("Порядок", Настройки.Порядок.ДоступныеПоляПорядка);
    Списки.Вставить("Группировка", Группировка.ПоляГруппировки.ДоступныеПоляПолейГруппировок);

    Поле = Новый ПолеКомпоновкиДанных(ПутьКПолю);
    Для Каждого Список Из Списки Цикл
        Доступное = ?(Список.Значение = Неопределено, Неопределено,
            Список.Значение.НайтиПоле(Поле));
        Итог.Добавить(Список.Ключ + ": " + ?(Доступное = Неопределено, "недоступно", "доступно"));
    КонецЦикла;

    Доступное = Настройки.Выбор.ДоступныеПоляВыбора.НайтиПоле(Поле);
    Если Доступное <> Неопределено Тогда
        Итог.Добавить("Заголовок: " + Доступное.Заголовок
            + "; тип: " + Строка(Доступное.ТипЗначения));
    КонецЕсли;

    Возврат СтрСоединить(Итог, Символы.ПС);

КонецФункции
  • Для пути через точку проверяется ограничение реквизитов, для простого — ограничение поля.
  • Компоновщик создается заново и видит текущую схему, а не открытые в форме настройки.
  • Временная группировка дает список доступных полей группировок: у корня настроек его нет.

Как добавить поле в выбор и группировку программно

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

// Продолжение общего модуля ПоляСКД. Режим совместимости не ниже 8.3.6.

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

    Поле = Новый ПолеКомпоновкиДанных(ПутьКПолю);
    Если ДоступныеПоля = Неопределено Или ДоступныеПоля.НайтиПоле(Поле) = Неопределено Тогда
        ВызватьИсключение СтрШаблон("Поле ""%1"" нельзя добавить в %2: его нет среди доступных",
            ПутьКПолю, Куда);
    КонецЕсли;

    Возврат Поле;

КонецФункции

// Добавляет поле в выбранные поля без дублей.
//
// Параметры:
//  Выбор     - ВыбранныеПоляКомпоновкиДанных - Настройки.Выбор или Группировка.Выбор.
//  ПутьКПолю - Строка - например "Контрагент.ИНН".
//  Заголовок - Строка - заголовок колонки только в этом варианте.
//  Элементы  - коллекция элементов выбора или группы полей, по умолчанию Выбор.Элементы.
//
// Возвращаемое значение:
//  ВыбранноеПолеКомпоновкиДанных
//
Функция ДобавитьВыбранноеПоле(Выбор, ПутьКПолю, Заголовок = "", Элементы = Неопределено) Экспорт

    Поле = ПолеИзДоступных(Выбор.ДоступныеПоляВыбора, ПутьКПолю, "выбранные поля");
    Если Элементы = Неопределено Тогда
        Элементы = Выбор.Элементы;
    КонецЕсли;

    Для Каждого Элемент Из Элементы Цикл
        Если ТипЗнч(Элемент) = Тип("ВыбранноеПолеКомпоновкиДанных")
            И ВРег(Строка(Элемент.Поле)) = ВРег(ПутьКПолю) Тогда
            Элемент.Использование = Истина;
            Возврат Элемент;
        КонецЕсли;
    КонецЦикла;

    Выбранное = Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
    Выбранное.Поле = Поле;
    Выбранное.Использование = Истина;
    Если ЗначениеЗаполнено(Заголовок) Тогда
        Выбранное.Заголовок = Заголовок;
    КонецЕсли;

    Возврат Выбранное;

КонецФункции

// Добавляет группу полей с общим заголовком над колонками.
// Пути проверяются до создания группы, чтобы не оставить ее пустой.
Функция ДобавитьГруппуПолей(Выбор, Заголовок, ПутиКПолям) Экспорт

    Пути = СтрРазделить(ПутиКПолям, ",", Ложь);
    Для Индекс = 0 По Пути.ВГраница() Цикл
        Пути[Индекс] = СокрЛП(Пути[Индекс]);
        ПолеИзДоступных(Выбор.ДоступныеПоляВыбора, Пути[Индекс], "выбранные поля");
    КонецЦикла;

    Группа = Выбор.Элементы.Добавить(Тип("ГруппаВыбранныхПолейКомпоновкиДанных"));
    Группа.Заголовок = Заголовок;
    Для Каждого Путь Из Пути Цикл
        ДобавитьВыбранноеПоле(Выбор, Путь, , Группа.Элементы);
    КонецЦикла;

    Возврат Группа;

КонецФункции

// Добавляет поле к полям существующей группировки.
Функция ДобавитьПолеГруппировки(Группировка, ПутьКПолю) Экспорт

    Поле = ПолеИзДоступных(Группировка.ПоляГруппировки.ДоступныеПоляПолейГруппировок,
        ПутьКПолю, "поля группировки");

    ПолеГруппировки = Группировка.ПоляГруппировки.Элементы.Добавить(
        Тип("ПолеГруппировкиКомпоновкиДанных"));
    ПолеГруппировки.Поле = Поле;
    ПолеГруппировки.Использование = Истина;
    ПолеГруппировки.ТипГруппировки = ТипГруппировкиКомпоновкиДанных.Элементы;

    Возврат ПолеГруппировки;

КонецФункции

// Модуль формы отчета: команда добавляет поля в текущий вариант.
&НаКлиенте
Процедура ДобавитьКолонки(Команда)
    ДобавитьКолонкиНаСервере();
КонецПроцедуры

&НаСервере
Процедура ДобавитьКолонкиНаСервере()

    Настройки = Отчет.КомпоновщикНастроек.Настройки;
    ПоляСКД.ДобавитьВыбранноеПоле(Настройки.Выбор, "Выручка", "Выручка за период");
    ПоляСКД.ДобавитьГруппуПолей(Настройки.Выбор, "Покупатель", "Контрагент.ИНН, Контрагент.КПП");

    // Первая группировка варианта, например по контрагенту, станет "Контрагент, Договор".
    Для Каждого Элемент Из Настройки.Структура Цикл
        Если ТипЗнч(Элемент) = Тип("ГруппировкаКомпоновкиДанных") Тогда
            ПоляСКД.ДобавитьПолеГруппировки(Элемент, "Договор");
            Прервать;
        КонецЕсли;
    КонецЦикла;

КонецПроцедуры
  • Повторный вызов не создает дубль.
  • Заголовок выбранного поля переименовывает колонку только в этом варианте.
  • Группа выбранных полей дает общий заголовок над колонками.
  • Добавленное поле делит строку группировки с прежним: «Контрагент, Договор». Отдельный уровень — это вложенная группировка.

Оформление и формат поля

Оформление из схемы действует везде, где выводится поле: в детальных записях, группировках и итогах. Чаще всего в нем задают формат.

ЗадачаФорматная строка
Два знака после запятойЧДЦ=2
Ноль выводить прочеркомЧН='—'
Без пробелов между разрядамиЧГ=0
Дата без времениДФ=dd.MM.yyyy
Булево словамиБЛ=Нет; БИ=Да

«Выделять отрицательные» красит отрицательные числа без всяких условий. Если цвет зависит от значения или схему типового отчета менять нельзя, применяют условное оформление варианта: оно накладывается поверх оформления поля и сохраняется с вариантом. Ячейку целиком рисуют своим макетом.

// Продолжение общего модуля ПоляСКД. Режим совместимости не ниже 8.3.6.

// Красит отрицательные значения одной колонки. Условие проверяется
// по значению в выводимой строке: в строке группировки это итог группы.
Функция ОтрицательныеКрасным(Настройки, ПутьКПолю) Экспорт

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

    Элемент = Настройки.УсловноеОформление.Элементы.Добавить();
    Элемент.Представление = "Отрицательные значения: " + ПутьКПолю;

    ОформляемоеПоле = Элемент.Поля.Элементы.Добавить();
    ОформляемоеПоле.Поле = Поле;

    Условие = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    Условие.ЛевоеЗначение = Поле;
    Условие.ВидСравнения = ВидСравненияКомпоновкиДанных.Меньше;
    Условие.ПравоеЗначение = 0;

    Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", WebЦвета.Красный);

    Возврат Элемент;

КонецФункции

// Подсвечивает всю строку, если значение поля меньше порога:
// оформляемые поля не заданы, значит оформление действует на все колонки.
Функция ПодсветитьСтроки(Настройки, ПутьКПолю, Порог, ЦветФона) Экспорт

    Элемент = Настройки.УсловноеОформление.Элементы.Добавить();
    Элемент.Представление = СтрШаблон("Строки, где %1 меньше %2", ПутьКПолю, Порог);

    Условие = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    Условие.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ПутьКПолю);
    Условие.ВидСравнения = ВидСравненияКомпоновкиДанных.Меньше;
    Условие.ПравоеЗначение = Порог;

    Элемент.Оформление.УстановитьЗначениеПараметра("ЦветФона", ЦветФона);

    Возврат Элемент;

КонецФункции

// Меняет формат колонки в варианте, не трогая схему:
// элемент без условия действует на все строки.
Функция ЗадатьФормат(Настройки, ПутьКПолю, ФорматнаяСтрока) Экспорт

    Элемент = Настройки.УсловноеОформление.Элементы.Добавить();
    Элемент.Представление = "Формат: " + ПутьКПолю;

    ОформляемоеПоле = Элемент.Поля.Элементы.Добавить();
    ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных(ПутьКПолю);

    Элемент.Оформление.УстановитьЗначениеПараметра("Формат", ФорматнаяСтрока);

    Возврат Элемент;

КонецФункции

// Пример вызова на сервере, Настройки = Отчет.КомпоновщикНастроек.Настройки:
//  ПоляСКД.ОтрицательныеКрасным(Настройки, "Наценка");
//  ПоляСКД.ПодсветитьСтроки(Настройки, "Наценка", 0, Новый Цвет(255, 225, 225));
//  ПоляСКД.ЗадатьФормат(Настройки, "Количество", "ЧДЦ=0; ЧН='—'");
  • Пустой список оформляемых полей означает всю строку.
  • В строке группировки условие по ресурсу сравнивает итог группы, а не записи.
  • Элемент без условия меняет формат колонки без правки схемы.

Типичные ошибки

  • Переименовали путь ради понятного названия — сохраненные варианты потеряли поле. Название меняют заголовком.
  • Остатки в группировке по месяцам завышены: в своем запросе не заданы роли периода, измерений и остатка.
  • У набора-объекта не заданы типы — реквизиты через точку не раскрываются.
  • Флажками ограничения прячут данные вместо прав доступа.

Частые вопросы

Как переименовать колонку, не меняя схему?

Задайте заголовок выбранному полю в редакторе варианта («Еще → Изменить вариант»). В коде это свойство Заголовок у ВыбранноеПолеКомпоновкиДанных.

Чем роль «Измерение» отличается от группировки?

Роль ничего не группирует: она говорит компоновке, по каким полям различаются цепочки остатков. Группировку задают в структуре варианта независимо от роли.

Как оставить поле только для отбора?

Отметьте в ограничении поля «Поле», «Группировка» и «Порядок», а «Условие» оставьте снятым. Колонкой поле не вывести, а отбор по нему работает.

Можно ли поменять формат числа в типовом отчете без снятия с поддержки?

Да: элемент условного оформления без условия с параметром «Формат», как в функции ЗадатьФормат, сохраненный в варианте.

Когда проще заказать

Заголовок, формат или флажок ограничения поправить нетрудно. Если же отчет на остатках собран своим запросом, роли не сходятся, а типовую схему нельзя снимать с поддержки, закажите доработку отчетов и обработок 1С или разместите задание на площадке.

По теме

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

Станьте частью сообщества!
Войдите или зарегистрируйтесь, и вы сможете участвовать в обсуждениях.


1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.