Как программно работать с СКД в 1С: библиотеки, модули БСП и примеры реализации

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

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

Где искать API для работы с СКД?

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

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

  1. Встроенная справка (Syntax Assistant): Основной источник информации о методах и свойствах объектов.
  2. Библиотека стандартных подсистем (БСП): Это и есть та самая «библиотека», которую ищут многие программисты. В ней уже реализованы сотни вспомогательных функций.
  3. ИТС: Содержит методические рекомендации и примеры реализации сложных схем.
  4. Инструменты сообщества: Сторонние разработки, такие как «Инструменты разработчика» (ИР), которые позволяют генерировать код программного формирования схемы на основе визуальных настроек.

Использование БСП как готового API

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

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

Модуль ТиповыеОтчеты: Предоставляет высокоуровневое API для работы с отчетами. Здесь реализованы механизмы вывода, управления пользовательскими настройками и расшифровками. Рассмотрим подробнее, как можно использовать эти наработки в своих «нетленках».

Программное выполнение схемы и вывод в таблицу значений

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

Разберем по шагам функцию, которая автоматизирует этот процесс:


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

Проанализируем ситуацию: в этом коде ключевым моментом является использование объекта ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений. В отличие от стандартного генератора для табличного документа, он оптимизирован для формирования плоской структуры данных, которую понимает ТаблицаЗначений.

Программная работа с параметрами данных

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

Посмотрим на пример функции, которая надежно извлекает начало и конец периода из настроек СКД:


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

Этот подход позволяет быстро получить значения для использования в других частях кода, например, для передачи во ВнешниеНаборыДанных или для заголовков.

Расширенные возможности: создание схемы с нуля

Если вам требуется создать отчет, структура которого заранее неизвестна (динамические колонки, переменное количество наборов данных), вы можете формировать объект СхемаКомпоновкиДанных полностью программно. Рассмотрим основные этапы этого процесса:

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

Важный момент: Программное создание схемы — процесс трудоемкий. Если вам нужно лишь слегка изменить запрос, рассмотрите вариант использования XDTO-сериализации. Вы можете выгрузить схему в XML, программно заменить фрагмент текста (например, через строковые функции или регулярные выражения) и загрузить обратно в объект схемы.

Пользовательские настройки vs Настройки схемы

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

Для корректной работы вашего программного кода всегда проверяйте, не перекрываются ли ваши программные настройки пользовательскими. Метод КомпоновщикНастроек.ЗагрузитьНастройки() полностью замещает текущие настройки, а метод Восстановить() помогает синхронизировать значения между основным объектом и его визуальным представлением в форме.

Заключение

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

← На главную