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