Настройки системы компоновки данных (СКД) в 1С не предоставляют прямого способа для горизонтального расположения двух диаграмм. По умолчанию, они будут выводиться одна под другой. Однако, эту задачу можно успешно решить программным способом, манипулируя объектами отчета после его формирования. Рассмотрим подробнее, как это сделать.
ПриКомпоновкеРезультатаОсновной подход заключается в перехвате процесса формирования отчета и последующем изменении положения диаграмм. Для этого мы будем использовать предопределенную процедуру ПриКомпоновкеРезультата в модуле объекта отчета.
Отключаем стандартную обработку и формируем отчет программно.
По умолчанию, 1С сам формирует отчет. Чтобы взять процесс под контроль, мы должны установить параметр СтандартнаяОбработка в Ложь и выполнить все шаги компоновки вручную.
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Настройки = КомпоновщикНастроек.ПолучитьНастройки;
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки,, ДанныеРасшифровки);
Здесь мы получаем текущие настройки компоновщика, создаем макет компоновки, инициализируем процессор компоновки данных.
Выводим отчет во временный ТабличныйДокумент.
Важный нюанс: если мы будем выводить отчет непосредственно в ДокументРезультат, который передается в процедуру ПриКомпоновкеРезультата, то коллекция рисунков (Рисунки) может быть недоступна или работать некорректно для манипуляций. Поэтому мы сначала выведем отчет во временный объект ТабличныйДокумент, произведем с ним необходимые действия, а затем скопируем его содержимое в ДокументРезультат.
ТД = Новый ТабличныйДокумент;
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ТД);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
После выполнения этого шага, все элементы отчета, включая диаграммы, будут находиться в объекте ТД.
Перемещаем диаграммы.
Теперь, когда диаграммы находятся в ТД, мы можем получить к ним доступ через коллекцию Рисунки. Каждая диаграмма представлена объектом РисунокТабличногоДокумента, который имеет свойства Верх (смещение по оси Y) и Лево (смещение по оси X).
Предположим, у нас есть две диаграммы, и мы хотим вторую диаграмму (индекс [1]) переместить правее и, возможно, немного поднять, чтобы она оказалась рядом с первой (индекс [0]).
// Здесь перемещаем диаграммы
// Доступ к первой диаграмме: ТД.Рисунки[0]
// Доступ ко второй диаграмме: ТД.Рисунки[1]
Если ТД.Рисунки.Количество() > 1 Тогда
ТД.Рисунки[1].Верх = ТД.Рисунки[1].Верх - 100; // Поднимаем вторую диаграмму (уменьшаем значение "Верх")
ТД.Рисунки[1].Лево = ТД.Рисунки[1].Лево + 200; // Сдвигаем вторую диаграмму вправо (увеличиваем значение "Лево")
КонецЕсли;
Значения -100 и +200 являются примерами и подбираются экспериментально. Вы можете изменять их, чтобы добиться желаемого расположения. Также, помимо Верх и Лево, вы можете манипулировать свойствами Ширина и Высота для изменения размеров диаграмм. Не забывайте о проверке ТД.Рисунки.Количество() > 1, чтобы избежать ошибок при отсутствии второй диаграммы.
Выводим обработанный отчет в итоговый ДокументРезультат.
После всех манипуляций с диаграммами во временном ТабличномДокументе ТД, мы должны вывести его содержимое в ДокументРезультат, который будет отображен пользователю.
ДокументРезультат.Вывести(ТД);
КонецПроцедуры
Таким образом, полный код процедуры ПриКомпоновкеРезультата будет выглядеть следующим образом:
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Настройки = КомпоновщикНастроек.ПолучитьНастройки;
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки,, ДанныеРасшифровки);
ТД = Новый ТабличныйДокумент;
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ТД);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
// Здесь перемещаем диаграммы
// Предполагаем, что диаграммы имеют индексы 0 и 1
// и нам нужно переместить вторую диаграмму (индекс 1)
Если ТД.Рисунки.Количество() > 1 Тогда
// Например, поднимаем вторую диаграмму на 100 единиц и сдвигаем вправо на 200 единиц
ТД.Рисунки[1].Верх = ТД.Рисунки[1].Верх - 100;
ТД.Рисунки[1].Лево = ТД.Рисунки[1].Лево + 200;
КонецЕсли;
ДокументРезультат.Вывести(ТД);
КонецПроцедуры
Важно: Процедура ПриКомпоновкеРезультата работает как для обычных, так и для управляемых форм, что делает это решение универсальным.
Как правило, заголовок диаграммы не является частью объекта РисунокТабличногоДокумента, который мы перемещаем. Если вы хотите переместить заголовок вместе с диаграммой или позиционировать его отдельно, это может потребовать дополнительных усилий:
Отключение стандартных заголовков. В настройках СКД для диаграммы можно отключить вывод заголовка. Это позволит вам полностью контролировать отображение текста.
Создание программных заголовков. Вы можете программно добавить текстовую область в ТабличныйДокумент в нужной позиции рядом с перемещенной диаграммой. Для этого используйте методы ТД.ВывестиОбласть() или ТД.ВывестиТекст(), предварительно определив нужные координаты и текст. Это более сложный, но гибкий подход.
Часто возникает ситуация, когда в одном отчете СКД существует несколько вариантов, но перемещение диаграмм требуется только для конкретного варианта. Мы можем реализовать это, передавая информацию о текущем варианте отчета из формы в модуль объекта.
Передача ключа варианта из формы.
В модуле формы отчета (например, в обработчике формы ПриОбновленииСоставаПользовательскихНастроекНаСервере) мы можем добавить ключ текущего варианта в дополнительные свойства пользовательских настроек компоновщика.
// В модуле формы отчета
&НаСервере
Процедура ПриОбновленииСоставаПользовательскихНастроекНаСервере(СтандартнаяОбработка)
Отчет.КомпоновщикНастроек.ПользовательскиеНастройки.ДополнительныеСвойства.Вставить("КлючВарианта", ЭтаФорма.КлючТекущегоВарианта);
КонецПроцедуры
Метод Вставить() добавляет новое свойство или обновляет существующее. ЭтаФорма.КлючТекущегоВарианта содержит строковое представление текущего выбранного варианта отчета. Этот обработчик выполняется на сервере при обновлении пользовательских настроек, что гарантирует передачу актуального ключа.
Проверка ключа варианта в модуле объекта отчета.
Теперь в процедуре ПриКомпоновкеРезультата (в модуле объекта отчета) мы можем получить это значение из дополнительных свойств и выполнить код перемещения диаграмм только в том случае, если выбран нужный вариант.
// В модуле объекта отчета, внутри процедуры ПриКомпоновкеРезультата
// ... (стандартное формирование отчета, как описано выше) ...
ВариантОтчета = Неопределено; // Инициализируем переменную для безопасного получения значения
Если КомпоновщикНастроек.ПользовательскиеНастройки.ДополнительныеСвойства.Свойство("КлючВарианта", ВариантОтчета)
И ВариантОтчета = "ПродажиПоМенеджерам" Тогда // "ПродажиПоМенеджерам" - пример названия варианта
// Здесь выполняем код перемещения диаграмм
// Например:
Если ТД.Рисунки.Количество() > 1 Тогда
ТД.Рисунки[1].Верх = ТД.Рисунки[1].Верх - 100;
ТД.Рисунки[1].Лево = ТД.Рисунки[1].Лево + 200;
КонецЕсли;
КонецЕсли;
// ... (ДокументРезультат.Вывести(ТД); КонецПроцедуры) ...
Крайне важно использовать метод Свойство("КлючВарианта", ВариантОтчета) для безопасного получения значения. Этот метод возвращает Истина, если свойство существует, и записывает его значение в переменную ВариантОтчета. Если свойство не существует, метод вернет Ложь, и переменная ВариантОтчета останется Неопределено, предотвращая ошибку обращения к несуществующему ключу. Прямое обращение КомпоновщикНастроек.ПользовательскиеНастройки.ДополнительныеСвойства.КлючВарианта может привести к ошибке, если такого ключа не существует.
Переменная ВариантОтчета = Неопределено; нужна для инициализации, чтобы метод Свойство() имел куда записать значение и работал корректно.
Таким образом, хотя СКД не предлагает прямого функционала для горизонтального размещения диаграмм, программный подход через процедуру ПриКомпоновкеРезультата позволяет гибко управлять положением и размером графических элементов в отчете. Сочетая это с механизмом передачи ключа варианта, вы можете создавать сложные и функциональные отчеты, адаптированные под различные потребности.