Создание отчета в СКД с использованием данных из таблицы значений

Вот пример

https://1clancer.ru/article/primer_ispolzovaniya_vneshnego_istochnika_dannykh_v_skd_890

 

еще пример

https://fastcode.im/Templates/3701/skd-vneshnie-istochniki-dannyx

 

https://infostart.ru/1c/tools/409525/

 

Пример понятный. Тестировать!

http://1c8xx.ru/skdtzof.php

Используется предопределенная процедура

ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)



Внутри этой процедуры в примере формируют таблицу значений, и далее командами вызывается отчет на СКД, куда в качестве источника данных передается сформированная ранее таблица значений (см пример формирования простой ТЗ в статье).



В процедуре ПриКомпоновкеРезультата отключаем стандартную обработку.

СтандартнаяОбработка = Ложь;

Затем формируем таблицу значений произвольным образом. Имена колонок таблицы значений должны совпадать с будущими полями набора данных в СКД.

В статье сделана ТЗ из трех строк.

Далее по шагам создаем вывод отчета.

- Из схемы получаем настройки по умолчанию.

- В соответствующую переменную отправляем данные о расшифровке.

- Формируем макет с помощью компоновщика макета.

- Передаём в макет компоновки схему, настройки и данные расшифровки.

- Выполняем компоновку с помощью процессора компоновки. Для этого выполняем метод процессора компоновки данных Инициализировать(). В качестве параметров передаём макет компоновки данных, внешние наборы данных (тип: Структура, ключ структуры должен совпадать с именем объекта в схеме компоновки данных , значение - сформированная таблица значений), данные расшифровки.

- Очищаем поле табличного документа.

- Выводим результат в табличный документ.

 

В итоге в функцию "ПриКомпоновкеРезульатата" добавляется следующий код:

Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)

ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки, ВнешнийНаборДанных, ДанныеРасшифровки);
СтандартнаяОбработка=Ложь;

ТЗВывод=Новый ТаблицаЗначений;
ТЗВывод.Колонки.Добавить("Код");
ТЗВывод.Колонки.Добавить("Наименование");
ТЗВывод.Колонки.Остаток("Остаток");
ТЗВывод.Колонки.Продажи("Продажи");


НоваяСтрока=ТЗВывод.Добавить();
НоваяСтрока.Код=1234;
НоваяСтрока.Наименование="Хлеб белый";
НоваяСтрока.Остаток=3;
НоваяСтрока.Продажи=10;

НоваяСтрока=ТЗВывод.Добавить();
НоваяСтрока.Код=1235;
НоваяСтрока.Наименование="Хлеб черный";
НоваяСтрока.Остаток=1
НоваяСтрока.Продажи=15;

НоваяСтрока=ТЗВывод.Добавить();
НоваяСтрока.Код=1236;
НоваяСтрока.Наименование="Булочка";
НоваяСтрока.Остаток=1;
НоваяСтрока.Продажи=3;

СхемаКомпоновкиДанных = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");

Настройки = СхемаКомпоновкиДанных.НастройкиПоУмолчанию;

// - Если сделать так, как показано выше(рекомендуют на некоторых ресурсах), то при изменении настроек в режиме клиента
// этих изменений Вы не увидите, потому что настройки всегда будут по умолчанию. Как правильно - вариант ниже
// Настройки = КомпоновщикНастроек.ПолучитьНастройки(); // *** Разбираться!

ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;

КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;

МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки);

ВнешнийНаборДанных = Новый Структура("ПримерТаблицыЗначений", ТЗВывод);

ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;

ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки, ВнешнийНаборДанных, ДанныеРасшифровки);


ДокументРезультат.Очистить();

ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;

ПроцессорВывода.УстановитьДокумент(ДокументРезультат);

ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);

КонецПроцедуры // Не ставим точку с запятой. Гагага!

В обработке создается макет отчета СКД. Название по умолчанию "ОсновнаяСхемаКомпоновкиДанных"

В том макете создаем набор данных. Для этого добавляем новый набор данных типа Объект.

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

Затем добавляем поля. Имена должны точно совпадать с именами колонок в таблице значений. Далее можем указать допустимые значения, форматы и т.д.

Заметки

Таблица значений формируется с нужными значениями

Чтобы создать отчет на СКД на основании таблицы значений:

1) В макете СКД прописывается название источника, поля источника, как они указаны в таблице значений.


2) В предопределенной процедуре

Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)

 

прописывается вызов отчета на СКД, в тч прописывается ссылка на источник внешних данных — таблицу значений.

 

ВнешнийНаборДанных = Новый Структура("ПримерТаблицыЗначений", ТЗВывод);

// Передается имя источника данных, и значение источника данных — сама таблица значений

ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;

ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки, ВнешнийНаборДанных, ДанныеРасшифровки);

 

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

1. Есть команды, которыми формирование отчета на СКД вызывается от начала до конца. Я такое тестировал. Вот пример

https://infostart.ru/public/409525/

https://fastcode.im/Templates/7666/skd-vyvod-dannyx-iz-tablicy-znachenij

 

2. Есть процедура ПриКомпоновкеРезультата, которая зачем?

Ответ тут https://master1c8.ru/platforma-1s-predpriyatie-8/skd/7805/

Это для ОТЧЕТОВ! Поскольку я формировал отчеты внутри обработки, мне отчеты нужны как лог работы обработки, мне функция "ПриКомпоновкеРезультата" не нужна.



Событие ПриКомпоновкеРезультата вызывается при выполнении метода объекта отчета  СкомпоноватьРезультат.

https://master1c8.ru/platforma-1s-predpriyatie-8/skd/7764/ - снимок из СинтаксПомощника. Видно, что это метод для "ОтчетОбъект.ИмяОтчета". Т.е. это для отчетов.

В самих отчетах используется, к примеру, чтобы включить или отключить фоновое построение отчета. https://курсы-по-1с.рф



Про пользовательские настройки СКД

https://forum.infostart.ru/forum9/topic155693/

Метод ПолучитьНастройки()
Платформа 1С v8.3
1. ANARCHY1987 26.07.16 14:13
Добрый день.
Есть отчет СКД
В событии "ПриКомпоновкеРезультата" я хочу получить актуальные настройки компановщика.
Использую для этого функцию ЭтотОбъект.КомпоновщикНастроек.ПолучитьНастройки();
Далее смотрю через отладку отборы и вижу что там ничего нет.
При этом если смотрю через отладчик ЭтотОбъект.КомпоновщикНастроек.Настройки - там нужный мне отбор присутствует и стоит флаг использовать = Истина.
Если смотреть отборы в пользовательских настройках и фиксированных настройках - там ничего нет.
Насколько я понимаю метод ПолучитьНастройки() должен возвращать результирующие настройки на основании этих 3х настроек.
Так почему он может неправильно работать?

 

herfis 435 26.07.16 14:24
Ну так все правильно. Применяются пользовательские настройки, в которых нет отбора.

3. ANARCHY1987 26.07.16 14:29
А как сделать так чтобы пользовательские настройки не применялись тогда?
Мне нужно чтобы если в пользовательских настройках ничего нет, то срабатывали обычные настройки.
Иначе тогда я вообще не пойму смысла в обычных настройках если они затираются.

4. herfis 435 26.07.16 14:48
(3) ANARCHY1987, До появления УФ пользовательских настроек не было. Были только обычные настройки. С появлением УФ появились пользовательские настройки. Если какой-то блок вынесен в пользовательские настройки (отборы, допустим), то если пользователь что-то изменил (отключил отбор, например) - то хана. Пользовательские настройки сохраняются автоматически.
Вернуться к дефолтным пользовательским настройкам можно через "Установить стандартные настройки". Смысл в обычных настройках есть, хотя он и изменился. Если установлена настройка, не перекрываемая пользовательскими настройками, она будет действовать. Еще удобно создавать отдельные именованные элементы настроек (особый отбор, например) и выносить их в пользовательские настройки персонально. Таким образом можно довольно просто сделать непростые настройки для пользователя, причем чисто параметрически.
Если хочешь, чтобы пользовательские настройки не применялись, то не получай настройки через ПолучитьНастройки() компоновщика. Получай дефолтные настройки из схемы. Например, из НастройкиПоУмолчанию или из настроек конкретного варианта в схеме.

 

 

 

Внешние наборы данных (или внешние источники данных). Результат выводится в форму отчета, а не в табличный документ? А табличный документ не внутри формы отчета разве?

https://infostart.ru/public/409525/

 

Автор пишет:

"Перехватить событие кнопки «Сформировать» не получилось"

 

Ему отвечают:

1. demon_infernal 39 19.10.15 06:55

// Перехватить событие кнопки "Сформировать" не получилось

Событие "ПриКомпоновкеРезультата" модуля объекта отчета

В остальном ничего нового, всё есть в Хрусталёвой.

 

Хрусталева. "Разработка сложных отчетов"

 

 

Еще пишут:

2. Tishu 3 21.10.15 10:47

Пользуйтесь шаблоном универсального отчета , в нем есть возможность использовать внешние наборы данных в СКД и многое другое. Универсальный шаблон имеет некоторые ограничения, влияющие на представление настроек пользователя (простая или расширенная). Поэтому можно создать сложный запрос, а результат передать в объект СКД. Универсальный шаблон преступно мало используется, а пользователи к нему привыкают быстро.

 

 

Непонятное про СКД: запросы в СКД иногда работают не так, как в консоли отчетов; какие-то шаблоны для отчетов на СКД

https://planshet-info.ru/kompjutery/1s-skd-vneshnie-istochniki-dannyh - тут перепечатка;

первоисточник тут https://helpf.pro/faq83/view/1654.html

 

Пишут:

1. "Очень часто бывают ситуации, когда необходимо сделать отчет СКД на сложном запросе, который использует в себе вложенные запросы и объединения (?соединения) внутренние и полные и т.д. — в результате в консоли этот запрос формируется верно, а в скд половина полей пустые! Связано это с особенностью СКД в объединении (? соединении) внутренних данных, а так же не стоит забывать что в СКД наборы данных связываются как левое соединение.

Решения возможны следующие:

- Изменить запрос в СКД

- Сформировать запрос обычным способом и подставить эти данные в СКД как внешние".

 

РСА:

Видимо, речь о соединениях? Потому что "объединение" - это слияние строк, тогда как перечень полей один и тот же. Вот детально https://helpme1s.ru/obedinenie-v-zaprosax-v-1s-8-v-primerax

Я не сталкивался, чтобы в консоли отчетом результат был, а в СКД - пустое. Хорошо бы увидеть пример.

Внутренние соединения не использовал, использовал до сих пор в основном левые соединения. Какие у СКД особенности внутренних соединений?

 

2. Пишут:

"Внешний источник данных, грузим из ТЗ

Для вывода отчета я использую шаблон All4CF.ru_Template_SKD_v4.1, в нем уже реализованы почти все необходимые функции и работает в Обычных и УП формах. В модуле объекта уже есть функция."

 

РСА: Этот шаблон для 1С 8.2. Это не что-то универсальное, а просто ПРИМЕР, как данные из внешнего набора (?) вывести в отчет на СКД?

 

 

СКД. Для чего делают несколько запросов-источников, и уже потом средствами СКД объединяют результат?

https://forum.mista.ru/topic.php?id=795620

Puzoter:

Какое преимущество имеет использование нескольких наборов данных в СКД? Понятно, что иногда бывает нужно соединить несколько источников данных - например запрос с данными внешнего источника. Но для чего делают несколько источников - запросов и потом объединяют их средствами СКД, что это дает в сравнении с обычным соединением в запросе?



Ответы:

Timon1405

(0) классический пример http://catalog.mista.ru/public/77568/ "Срез последних на каждую дату в СКД и в запросе",Публикация № 77568, Приемы и методы разработки - СКД"

 

Armando

Для корректного расчета итогов. См тут https://its.1c.ru/db/metod8dev/content/2635/hdoc


РСА: Надо вчитываться и разбираться.

 

Как запомнить алгоритм программного вывода СКД. Ссылки на публикации, где функции формируют СКД программно

https://infostart.ru/1c/articles/654836/

 

Пишут:

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

https://infostart.ru/1c/articles/575659/

 

"7. dbachinsky 01.09.17 15:04

(1) А если нет макета СКД и его тоже нужно создать программно на основании текста запроса или таблицы значений, тогда стоит добавить в шаблон программное формирование схемы компоновки данных https://infostart.ru/public/575659/"

 

Вот ссылка на гитхуб

https://gist.github.com/artbear/e1cfd0f5dbf39373f4424a4b250fb690