СКД программное дополнение

1. SantiouS 02.03.20 12:14 Сейчас в теме
Есть отчёт СКД в образно:
Водитель/Номер пропуска/

Хочу добавить в него во время компоновки колонку /Время прихода/, которое получить совершенно с другой системы.
Для этого мне нужно что бы когда пользователь нажмет кнопку "Сформировать" - получить готовый отчёт формата: "Водитель/Номер пропуска/", после чего проанализировать по каким "Номер пропуска" мне нужно время - обратиться в другую БД и после чего добавить колонку и заполнить ее полученным временем.
Вообще не могу понять как такое сделать. Может кто то реализовывал что то подобное - подскажите пожалуйста.
По теме из базы знаний
Найденные решения
2. herfis 499 02.03.20 12:31 Сейчас в теме
1. Перехватываешь событие компоновки (при компоновке результата) и получаешь данные по водителям обычным запросом в таблицу значений.
2. Там же делаешь запрос во внешнюю БД по полученным номерам пропуска и получаешь данные во вторую таблицу значений
3. Передаешь обе таблицы значений в параметры компоновки
4. Сама схема СКД будет выглядеть как два набора данных вида "Объект" (куда попадут таблицы значений) и настройка их связи по номеру пропуска на закладке связей наборов данных
5. Ну а остальное все штатно
ЗЫ. Ну или просто попробовать подтянуть данные внешней БД в качестве внешнего источника данных
SantiouS; +1 Ответить
19. SantiouS 02.03.20 17:31 Сейчас в теме
(18) Спасибо за помощь ещё раз.
Для тех, кто наткнется на тему прилагаю код компоновки:
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
	СтандартнаяОбработка=Ложь;
	
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ ********ТЕКСТ ЗАПРОСА*************";	
	
	СхемаКомпоновкиДанных = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
	Настройки = КомпоновщикНастроек.ПолучитьНастройки(); 
	Период=Настройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("Период"));
	ПараметрДатаНачала=Период.Значение.ДатаНачала;
	ПараметрДатаКонец=Период.Значение.ДатаОкончания;
	
	Запрос.УстановитьПараметр("ДатаНачачала", ПараметрДатаНачала);
	Запрос.УстановитьПараметр("ДатаОкончания", ПараметрДатаКонец);
	
	РезультатЗапроса = Запрос.Выполнить();
	ТаблицаРезультат=РезультатЗапроса.Выгрузить().Скопировать();	
	ТаблицаРезультат.Колонки.Добавить("ВремяВПути");
	ТаблицаРезультат.Колонки.Добавить("ОтклонениеПоГрафику");
	ТаблицаРезультат.Колонки.Добавить("ОтклонениеПоВыезду");
	ТаблицаРезультат.Колонки.Добавить("ВремяПрихода");

	Для каждого СтрокаТаблицы Из ТаблицаРезультат Цикл
		СтрокаТаблицы.ВремяВПути=ОбщийМодульСервер.ВычислитьВремя(СтрокаТаблицы.ВремяВыезда,СтрокаТаблицы.ВремяЗаезда);
		СтрокаТаблицы.ОтклонениеПоГрафику=ОбщийМодульСервер.ВычислитьВремя(ОбщийМодульСервер.ВычислитьВремя(СтрокаТаблицы.ВремяВыезда,СтрокаТаблицы.ВремяЗаезда),СтрокаТаблицы.ВремяОбслуживанияМаршрута,Истина);
		СтрокаТаблицы.ОтклонениеПоВыезду=ОбщийМодульСервер.ВычислитьВремя(СтрокаТаблицы.ВремяВыезда,СтрокаТаблицы.ВремяВыездаРегламентированое,Истина);
		Если ЗначениеЗаполнено(СтрокаТаблицы.ВремяВыездаРегламентированое) Тогда
			СтрокаТаблицы.ВремяПрихода=ОбщийМодульСервер.СторонняяБДПолучитьВремяПрихода(НачалоДня(СтрокаТаблицы.ДатаЯрлыка)+(СтрокаТаблицы.ВремяВыездаРегламентированое-Дата(1,1,1))-60*60*4,НачалоДня(СтрокаТаблицы.ДатаЯрлыка)+(СтрокаТаблицы.ВремяВыездаРегламентированое-Дата(1,1,1))+60*60*4,СтрокаТаблицы.НомерПропуска);	
		КонецЕсли; 
	КонецЦикла; 
		

    ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных; 
 
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;	
    МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки);	
	
	ВнешнийНаборДанных = Новый Структура("АналитикаВремени", ТаблицаРезультат); 
    ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных; 
    ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки, ВнешнийНаборДанных, ДанныеРасшифровки); 
    
    ДокументРезультат.Очистить();
    
 	ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент; 
    ПроцессорВывода.УстановитьДокумент(ДокументРезультат); 
    ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
	
КонецПроцедуры
Показать


В самом СКД создается набор данных - "объект". Кусок приведен на скрине ниже.
Прикрепленные файлы:
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. herfis 499 02.03.20 12:31 Сейчас в теме
1. Перехватываешь событие компоновки (при компоновке результата) и получаешь данные по водителям обычным запросом в таблицу значений.
2. Там же делаешь запрос во внешнюю БД по полученным номерам пропуска и получаешь данные во вторую таблицу значений
3. Передаешь обе таблицы значений в параметры компоновки
4. Сама схема СКД будет выглядеть как два набора данных вида "Объект" (куда попадут таблицы значений) и настройка их связи по номеру пропуска на закладке связей наборов данных
5. Ну а остальное все штатно
ЗЫ. Ну или просто попробовать подтянуть данные внешней БД в качестве внешнего источника данных
SantiouS; +1 Ответить
3. SantiouS 02.03.20 12:40 Сейчас в теме
(2) Подобного примера программного нет случайно? Что бы понять принцип что за чем делать.

А как "подтянутся" данные с внешней БД? (просто интересно что скрыто за данной фразой)
4. herfis 499 02.03.20 12:52 Сейчас в теме
(3)
1) загугливаем "1С предприятие СКД набор данных объект"
2) загугливаем "1С предприятие внешние источники данных"
6. SantiouS 02.03.20 14:36 Сейчас в теме
(4) Сформировал кодом "Объект" - вывелось. В объекте есть поля "Поле1" и "Поле2".
В вычисляемые поля добавил поле "ПолеРасчёта" в выражение которого написал
"НазваниеОбщегоМодуля.ИмяФункции"(Поле1,Поле2)".
В результате получаю ошибку формирования. Поставил точку остановы на первой строке в функции "ИмяФункции" и даже на нее не попадаю, то есть проблема кроется ещё перед вызовом... Подскажите что это может быть?
8. herfis 499 02.03.20 14:45 Сейчас в теме
(6) По дефолту использовать внешние функции в СКД нельзя. Эту возможность необходимо программно активировать при программной компоновке.
Читайте описание Инициализировать() у ПроцессорКомпоновкиДанных.
7. SantiouS 02.03.20 14:41 Сейчас в теме
(4) При формировании пишет:
"Синтаксическая ошибка "Общий модуль****Сервер.ВычислитьВремя""
Прикрепленные файлы:
5. herfis 499 02.03.20 12:54 Сейчас в теме
По первому вопросу еще хорошо гуглится "1С предприятие СКД таблица значений"
9. herfis 499 02.03.20 14:46 Сейчас в теме
Я только одного не пойму. Нафига вам внешние функции в схеме, если вы в СКД и так уже таблицы значений загоняете.
10. SantiouS 02.03.20 14:50 Сейчас в теме
(9) Хороший вопрос на который у меня есть глупый ответ.
У меня уже есть рабочий отчёт СКД, который основан на наборе данных типа запрос и в нем уже приписаны эти вычисляемые поля.

Для шаблона использовал его. В нем это все работало, а тут не работает. Уже понял в какую сторону смотреть благодаря вашему комментарию.
11. herfis 499 02.03.20 14:52 Сейчас в теме
(10)
Для шаблона использовал его. В нем это все работало, а тут не работает. Уже понял в какую сторону смотреть благодаря вашему комментарию.

Тогда просто загляните в ПриКомпоновкеРезультата отчета-шаблона. Там это уже должно быть прописано.
13. SantiouS 02.03.20 14:58 Сейчас в теме
(11) В своем шаблонном отчёте у меня нет кода в "ПриКомпоновкеРезультата".
Обычный отчёт СКД:
1. создаем отчёт;
2. создаем СКД;
3. создаем объект типа "Набор данных";
4. пишем запрос;
5. добавил вычисляемые поля в СКД;
6. формируем параметры вывода... все работает :)
Ничего дополнительно не писал :)
14. herfis 499 02.03.20 15:00 Сейчас в теме
(13)
У меня уже есть рабочий отчёт СКД, который основан на наборе данных типа запрос и в нем уже приписаны эти вычисляемые поля. Для шаблона использовал его. В нем это все работало, а тут не работает.

Вы уверены что модуль объекта у этого отчета пустой? Тогда я без малейшего представления, как он у вас работал.
15. SantiouS 02.03.20 15:08 Сейчас в теме
(14) Абсолютно уверен, так как сам писал его с нуля. Достаточно в общем модуле сделать экспортную процедуру и все отлично считается... Не первый раз так делаю... Конфигурация УТ 3.2.
16. herfis 499 02.03.20 15:21 Сейчас в теме
(15) Странно. Возможно, это багофича файловой. Но тогда не очень понятно, почему теперь у вас перестало работать. Возможно, другая багофича :)
17. SantiouS 02.03.20 15:25 Сейчас в теме
(16) Да нет, я работаю как на файловой так и на клиент-сервере. Все отрабатывает.
Думаю стандартная обработка компоновки все учитывает. Но когда я отключил ее и сам написал свою компоновку, то не учёл что то и в результате получил плохое сообщение. В любом случае сейчас переписываю что бы сразу добавить то что нужно в ТЗ "перед заводом" данных в компоновщик. Спасибо Вам за помощь уже в который раз :)

Надеюсь получится реализовать по окончанию то, что за задумал.
18. herfis 499 02.03.20 15:27 Сейчас в теме
(17) Хм... Возможно, с какого-то релиза умолчания поменяли. По просьбам телезрителей, так сказать :)
Потому что с давних времен у меня почему-то отложилось, что по-дефолту не фурычило.
19. SantiouS 02.03.20 17:31 Сейчас в теме
(18) Спасибо за помощь ещё раз.
Для тех, кто наткнется на тему прилагаю код компоновки:
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
	СтандартнаяОбработка=Ложь;
	
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ ********ТЕКСТ ЗАПРОСА*************";	
	
	СхемаКомпоновкиДанных = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
	Настройки = КомпоновщикНастроек.ПолучитьНастройки(); 
	Период=Настройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("Период"));
	ПараметрДатаНачала=Период.Значение.ДатаНачала;
	ПараметрДатаКонец=Период.Значение.ДатаОкончания;
	
	Запрос.УстановитьПараметр("ДатаНачачала", ПараметрДатаНачала);
	Запрос.УстановитьПараметр("ДатаОкончания", ПараметрДатаКонец);
	
	РезультатЗапроса = Запрос.Выполнить();
	ТаблицаРезультат=РезультатЗапроса.Выгрузить().Скопировать();	
	ТаблицаРезультат.Колонки.Добавить("ВремяВПути");
	ТаблицаРезультат.Колонки.Добавить("ОтклонениеПоГрафику");
	ТаблицаРезультат.Колонки.Добавить("ОтклонениеПоВыезду");
	ТаблицаРезультат.Колонки.Добавить("ВремяПрихода");

	Для каждого СтрокаТаблицы Из ТаблицаРезультат Цикл
		СтрокаТаблицы.ВремяВПути=ОбщийМодульСервер.ВычислитьВремя(СтрокаТаблицы.ВремяВыезда,СтрокаТаблицы.ВремяЗаезда);
		СтрокаТаблицы.ОтклонениеПоГрафику=ОбщийМодульСервер.ВычислитьВремя(ОбщийМодульСервер.ВычислитьВремя(СтрокаТаблицы.ВремяВыезда,СтрокаТаблицы.ВремяЗаезда),СтрокаТаблицы.ВремяОбслуживанияМаршрута,Истина);
		СтрокаТаблицы.ОтклонениеПоВыезду=ОбщийМодульСервер.ВычислитьВремя(СтрокаТаблицы.ВремяВыезда,СтрокаТаблицы.ВремяВыездаРегламентированое,Истина);
		Если ЗначениеЗаполнено(СтрокаТаблицы.ВремяВыездаРегламентированое) Тогда
			СтрокаТаблицы.ВремяПрихода=ОбщийМодульСервер.СторонняяБДПолучитьВремяПрихода(НачалоДня(СтрокаТаблицы.ДатаЯрлыка)+(СтрокаТаблицы.ВремяВыездаРегламентированое-Дата(1,1,1))-60*60*4,НачалоДня(СтрокаТаблицы.ДатаЯрлыка)+(СтрокаТаблицы.ВремяВыездаРегламентированое-Дата(1,1,1))+60*60*4,СтрокаТаблицы.НомерПропуска);	
		КонецЕсли; 
	КонецЦикла; 
		

    ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных; 
 
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;	
    МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки);	
	
	ВнешнийНаборДанных = Новый Структура("АналитикаВремени", ТаблицаРезультат); 
    ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных; 
    ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки, ВнешнийНаборДанных, ДанныеРасшифровки); 
    
    ДокументРезультат.Очистить();
    
 	ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент; 
    ПроцессорВывода.УстановитьДокумент(ДокументРезультат); 
    ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
	
КонецПроцедуры
Показать


В самом СКД создается набор данных - "объект". Кусок приведен на скрине ниже.
Прикрепленные файлы:
20. bad_wag 48 04.03.20 20:02 Сейчас в теме
(19) Возможно тут и без внешних источников можно было. У вас каждое поле получается в общем модуле, можно было их просто в вычисляемых полях получать и все
12. herfis 499 02.03.20 14:53 Сейчас в теме
Но проще (и эффективнее) самому добавить колонку в ТЗ и программно заполнить ее перед передачей ТЗ в СКД.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот