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

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

Часто при работе с типовыми отчетами, например, в Управление торговлей 11, разработчики сталкиваются с ситуацией, когда стандартного запроса СКД недостаточно для получения специфических данных, таких как сложный расчет себестоимости. В таких случаях возникает логичный вопрос: как вмешаться в процесс формирования отчета, чтобы «допилить» данные перед их выводом пользователю?

Основные подходы к решению задачи

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

Использование дополнительного макета СКД с набором данных «Объект»

Этот метод считается наиболее профессиональным, так как он отделяет получение сырых данных от их финальной обработки. Вместо того чтобы пытаться модифицировать уже сформированный ТабличныйДокумент, мы вмешаемся на этапе подготовки источника данных.

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

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

Пример программной реализации

Давайте разберем, как это выглядит схематично. Вам необходимо перехватить процесс компоновки и подменить данные:


// Пример логики заполнения набора данных "Объект"
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
    
    СтандартнаяОбработка = Ложь;
    
    // 1. Получаем данные через основной запрос
    Настройки = КомпоновщикНастроек.ПолучитьНастройки();
    КомпоновщикКомпоновки = Новый КомпоновщикКомпоновкиДанных;
    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    
    // ... Инициализация процессора компоновки ...
    
    // 2. Выгружаем данные в ТЗ и модифицируем их
    ТЗ = Новый ТаблицаЗначений;
    // Заполняем ТЗ данными
    Для Каждого СтрокаТЗ Из ТЗ Цикл
        СтрокаТЗ.Себестоимость = РассчитатьСебестоимость(СтрокаТЗ.Товар);
    КонецЦикла;
    
    // 3. Выводим результат используя дополнительный набор данных
    ВнешниеНаборыДанных = Новый Структура;
    ВнешниеНаборыДанных.Вставить("НаборДанныхОбъект", ТЗ);
    
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
    ПроцессорВывода.Вывести(ПроцессорКомпоновки, Истина);
    
КонецПроцедуры

Альтернативные методы

Помимо использования набора данных Объект, важно учитывать еще несколько вариантов оптимизации работы с СКД:

Почему важно использовать расширения?

Поскольку мы работаем с типовой конфигурацией УТ 11, все изменения мы вносим исключительно через Расширение конфигурации. Это критически важное условие, которое позволит вам обновлять основную конфигурацию 1С без потери вашей логики расчета себестоимости. Переопределяя запрос или используя событийную модель ПриКомпоновкеРезультата в расширении, вы сохраняете целостность системы и обеспечиваете стабильность работы в будущем.

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

← На главную