Как получить макет отчета в управляемой форме

Функция ПолучитьМакетНаСервере()

ОбъектОтчета = РеквизитФормыВЗначение(«Отчет»);
Макет = ОбъектОтчета.ПолучитьМакет(«Макет»);
Возврат Макет;

КонецФункции

Форматирование области табличного документа

Программное изменение внешнего вида табличного документа позволяет изменить границу ячейки или области (на примере — пунктирная граница):

ГраницаПунктир = Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.РедкийПунктир,1);

ОбластьМакета = Макет.ПолучитьОбласть(«СтрокаТаблицы»);

ОбластьМакета.Область(«R1C4:R1C7»).ГраницаСнизу = ГраницаПунктир;
ОбластьМакета.Область(«R2C4:R2C7»).ГраницаСверху = ГраницаПунктир;
ОбластьМакета.Область(«R1C4:R1C7»).ГраницаСлева = ГраницаПунктир;
ОбластьМакета.Область(«R1C4:R1C7»).ГраницаСправа = ГраницаПунктир;

Так же можно программно объединять ячейки в табличном документе:

ТабДок.Область(«R1C1:R1C4»).Объединить();

Удаление дублей иерархии при получении результата запроса

При использовании запросов с оператором ИЕРАРХИЯ и последующей выгрузке в дерево есть проблема, с которой знакомы большинство программистов — наличие дублей в иерархии, на справочника номенклатуры:

Запрос и результат:

request

Чтобы убрать дубли после получения дерева значений из результата запроса можно воспользоваться функциями ниже. Поле ключа — поле иерархии (Номенклатура).

Функция УдалитьДублирующиесяУзлыДерева(Дерево, _ПоляКлюча) Экспорт

ПоляКлюча = СтрРазделить(_ПоляКлюча, «,»);
Дерево2 = новый ДеревоЗначений;
для каждого колонка из Дерево.Колонки цикл
Дерево2.Колонки.Добавить(колонка.Имя, колонка.ТипЗначения);
КонецЦикла;
для каждого СтрКорня из Дерево.Строки цикл
НС = Дерево2.Строки.Добавить();
ЗаполнитьЗначенияСвойств(НС, СтрКорня);
СкопироватьРекурсивно(НС, СтрКорня, ПоляКлюча);
КонецЦикла;

Возврат Дерево2;

КонецФункции

Процедура СкопироватьРекурсивно(СтрокаКопия, СтрДерева, ПоляКлюча)

для каждого СтрПотомка из СтрДерева.Строки цикл
ЕстьРазличия = ложь;
для каждого ПолеКлюча из ПоляКлюча цикл
Если СтрПотомка[ПолеКлюча] <> СтрДерева[ПолеКлюча] тогда
ЕстьРазличия = истина;
Прервать;
КонецЕсли;
КонецЦикла;
Если ЕстьРазличия тогда
НС = СтрокаКопия.Строки.Добавить();
ЗаполнитьЗначенияСвойств(НС, СтрПотомка);
СкопироватьРекурсивно(НС, СтрПотомка, ПоляКлюча);
Иначе
СкопироватьРекурсивно(СтрокаКопия, СтрПотомка, ПоляКлюча);
КонецЕсли;
КонецЦикла;

КонецПроцедуры