Является ли СКД универсальным механизмом для создания любых отчетов в 1С и как решать сложные задачи компоновки?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Когда стоит выбирать СКД, а когда — программный вывод?

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

  1. Регламентированная отчетность: Если вам необходимо создать форму, где строго регламентированы размеры ячеек в миллиметрах, отступы и специфическое расположение элементов, стандартный механизм вывода СКД может быть избыточен или неудобен. В таких случаях проще использовать макет табличного документа и заполнять его вручную.
  2. Сверхсложные статические таблицы: Когда отчет представляет собой «шахматку» или таблицу со 100+ фиксированными колонками, каждая из которых имеет уникальное условное оформление и логику заполнения, попытка реализовать это в СКД может привести к созданию монструозной схемы, которую сложно поддерживать.
  3. Высокие требования к производительности: Иногда механизм «Автозаполнения» в СКД добавляет лишние соединения в SQL-запрос. В критических для производительности местах программисты предпочитают писать «чистый» запрос и выводить данные через ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент.

Тем не менее, даже в сложных случаях мы можем использовать гибридный подход: собрать данные программно в ТаблицаЗначений, а затем передать её в СКД как «Внешний набор данных». Это позволит сохранить преимущества гибких настроек для пользователя.

Решение задачи подмены ресурсов: выражения и логика

Часто возникает вопрос: как изменить значение ресурса в конкретной строке, не ломая при этом общие итоги по иерархии? Рассмотрим несколько способов решения этой задачи.

Способ 1. Использование выражений в ресурсах. Мы можем прописать сложную логику непосредственно на вкладке «Ресурсы». Вместо простой суммы используйте конструкцию Выбор Когда. Это позволит системе правильно агрегировать данные на разных уровнях группировок.

Пример выражения ресурса:


Сумма(Выбор 
    Когда ТипСтроки = "Специфическая" 
    Тогда СуммовоеПоле * Коэффициент 
    Иначе СуммовоеПоле 
Конец)

Способ 2. Условное оформление через параметр «Текст». Если нам нужно только визуально подменить значение, сохранив математическую точность итогов, мы можем использовать вкладку «Условное оформление». Чтобы подмена работала корректно даже без вывода вспомогательного поля в отчет, убедитесь, что это поле включено в состав используемых полей компоновки.

Работа с иерархией и вычисляемыми полями

Разберем ситуацию, когда расчеты должны выполняться на уровне запроса, но при этом необходимо сохранить корректную иерархию 1С. Важно помнить, что если мы изменяем данные в запросе, СКД будет суммировать уже измененные значения. Чтобы этого избежать при работе с остатками, крайне важно правильно настроить Роли полей на закладке «Наборы данных».

Для полей периодов и измерений укажите соответствующие роли. Это позволит системе использовать механизм «Рассчитывать по...», который корректно обрабатывает остатки и обороты, не допуская «раздувания» итогов при наличии множественных соединений.

Программная манипуляция данными перед выводом

Если возможностей языка запросов и выражений СКД не хватает, мы можем прибегнуть к программному вмешательству. Рассмотрим алгоритм использования внешнего набора данных:

  1. Подготовим структуру данных в коде (например, заполним ТаблицаЗначений сложными расчетами).
  2. Создадим ВнешниеНаборыДанных (объект типа Структура).
  3. Передадим эту структуру в ПроцессорКомпоновкиДанных.

Пример программного вывода:


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

ВнешниеДанные = Новый Структура("ТЗ_Данных", МояТаблицаЗначений);

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

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

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

Продвинутое оформление через Макеты СКД

Выясним, как добиться индивидуального дизайна, не отказываясь от СКД. На закладке «Макеты» мы можем переопределить стандартный вид любой группировки. Это позволяет:

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

Использование функций общих модулей

Для реализации сложнейшей логики, которую невозможно описать даже в выражениях СКД, мы можем вызывать экспортные функции общих модулей. Это делается прямо в вычисляемых полях или ресурсах. Например:

ИмяОбщегоМодуля.РассчитатьСложныйНалог(Сумма, Ставка, Дата)

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

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

← На главную