Мне хотелось, чтобы добавление новых отчетов в мою систему было также легко, как на СКД в 1С. Потому я делал свое решение схожим по функционалу c СКД. Для развития проекта решил адаптировать его в 1С.
Для демонстрации механизма я разработал небольшую конфигурацию, в которой реализовал отчет с различными схемами компоновки. Я не стал все делать в одной схеме, а разделил на несколько схем, для того чтобы схемами было проще воспользоваться используя мои примеры. А так все эти схемы можно объединять в одну или комбинировать в зависимости от задачи.
В форме отчета идет получение данных для отчета и формируется html с JavaScript, которые передаются в поле HTMLДокумента на форме
&НаКлиенте
Процедура Сформировать(Команда)
Результат = ПолучитьHTML();
КонецПроцедуры
&НаСервере
Функция ПолучитьHTML()
ОбъектОтчет = РеквизитФормыВЗначение("Отчет");
СКД_JS = ОбъектОтчет.ПолучитьМакет("СКД_JS"+Тип).ПолучитьТекст();
ДанныеДляТаблица = ПолучитьДанные();
СКД_JS = СтрЗаменить(СКД_JS,"{ДанныеДляТаблица}",ДанныеДляТаблица);
Основа = js_СКД_JS.ПолучитьСКДJS();
Основа = СтрЗаменить(Основа,"{СКД_JS}",СКД_JS);
Возврат Основа;
КонецФункции
&НаСервере
Функция ПолучитьДанные()
Запрос = Новый Запрос;
Запрос.Текст = ПолучитьТекстЗапроса();
Запрос.УстановитьПараметр("Д1",Период.ДатаНачала);
Запрос.УстановитьПараметр("Д2",Период.ДатаОкончания);
ТЗ = Запрос.Выполнить().Выгрузить();
Возврат js_СКД_JS.ТаблицаЗначенийВМассивJSON(ТЗ);
КонецФункции
Пример запроса для расчета итогов по группировкам через AlaSQL
После выполнения запроса выгружаю данные в таблицу значений и преобразую ее в Массив структур в формате JSON. Название русских полей автоматически преобразуются в английские. И если в поле содержалась ссылка, то дополняю структуру свойством "название поля + guid" эти данные пригодятся если в отчете нужно реализовать открытие объекта по ссылке.
Дизайн отчетов реализован с помощью стилей bootstrap 5 (https://getbootstrap.com/), подключаю их из макета так что для работы отчетов не требуется подключение к интернету. Также к шаблону html подключаю таблицу стилей CSS при желании дизайн можно полностью переписать на чистый CSS.
Структура макета СКД_JS.
1. В groups располагаются запросы группировок и общих итогов
2. Выполняем запросы в библиотеке AlaSQL
let group2 = alasql(this.groups[0],[state.data])
let group1 = alasql(this.groups[1],[group2])
let total = alasql(this.groups[2],[group2])
3. Циклы по группировкам (вложенность зависит от количества группировок)
4. В getTD хранятся функции обработки группировок, строк, итогов. Они используются в циклах через this.
5. Шапка таблицы
6.Данные в формате json (массив структур)
7. Описание общих стилей таблицы bootstrap 5
Далее переменная state будет передана в объект класса Table, который выведет таблицу.
Примеры отчетов:
Google таблица расположена в теге iframe в принципе там можно расположить любой сайт, портал, которые поддерживают отображение в теге iframe.
Чтобы получить iframe для google таблице нужно зайти файл->поделиться->Опубликовать в интернете->Встроить. Выбрать нужный лист и нажать опубликовать. При изменении google таблицы автоматически обновляется публикация. Поэкспериментировав данные обновляются не мгновенно, но в течении нескольких минут.
Тестировал:
- Платформа 1С:Предприятие 8.3 (8.3.22.1709).