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

Хочу добавить в него во время компоновки колонку /Время прихода/, которое получить совершенно с другой системы.
Для этого мне нужно что бы когда пользователь нажмет кнопку "Сформировать" - получить готовый отчёт формата: "Водитель/Номер пропуска/", после чего проанализировать по каким "Номер пропуска" мне нужно время - обратиться в другую БД и после чего добавить колонку и заполнить ее полученным временем.
Вообще не могу понять как такое сделать. Может кто то реализовывал что то подобное - подскажите пожалуйста.
---
1. Перехватываешь событие компоновки (при компоновке результата) и получаешь данные по водителям обычным запросом в таблицу значений.
2. Там же делаешь запрос во внешнюю БД по полученным номерам пропуска и получаешь данные во вторую таблицу значений
3. Передаешь обе таблицы значений в параметры компоновки
4. Сама схема СКД будет выглядеть как два набора данных вида "Объект" (куда попадут таблицы значений) и настройка их связи по номеру пропуска на закладке связей наборов данных
5. Ну а остальное все штатно
ЗЫ. Ну или просто попробовать подтянуть данные внешней БД в качестве внешнего источника данных
---
Спасибо за помощь ещё раз.
Для тех, кто наткнется на тему прилагаю код компоновки:

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

    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ ********ТЕКСТ ЗАПРОСА*************";

    СхемаКомпоновкиДанных = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
    Настройки = КомпоновщикНастроек.ПолучитьНастройки();
    Период=Настройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("Период"));
    ПараметрДатаНачала=Период.Значение.ДатаНачала;
    ПараметрДатаКонец=Период.Значение.ДатаОкончания;

    Запрос.УстановитьПараметр("ДатаНачачала", ПараметрДатаНачала);
    Запрос.УстановитьПараметр("ДатаОкончания", ПараметрДатаКонец);

    РезультатЗапроса = Запрос.Выполнить();
    ТаблицаРезультат=РезультатЗапроса.Выгрузить().Скопировать();
    ТаблицаРезультат.Колонки.Добавить("ВремяВПути");
    ТаблицаРезультат.Колонки.Добавить("ОтклонениеПоГрафику");
    ТаблицаРезультат.Колонки.Добавить("ОтклонениеПоВыезду");
    ТаблицаРезультат.Колонки.Добавить("ВремяПрихода");

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

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

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

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

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

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

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

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

А как "подтянутся" данные с внешней БД? (просто интересно что скрыто за данной фразой)
---
1) загугливаем "1С предприятие СКД набор данных объект"
2) загугливаем "1С предприятие внешние источники данных"
---
Сформировал кодом "Объект" - вывелось. В объекте есть поля "Поле1" и "Поле2".
В вычисляемые поля добавил поле "ПолеРасчёта" в выражение которого написал
"НазваниеОбщегоМодуля.ИмяФункции"(Поле1,Поле2)".
В результате получаю ошибку формирования. Поставил точку остановы на первой строке в функции "ИмяФункции" и даже на нее не попадаю, то есть проблема кроется ещё перед вызовом... Подскажите что это может быть?
---
По дефолту использовать внешние функции в СКД нельзя. Эту возможность необходимо программно активировать при программной компоновке.
Читайте описание Инициализировать() у ПроцессорКомпоновкиДанных.
---
При формировании пишет:
"Синтаксическая ошибка "Общий модуль****Сервер.ВычислитьВремя""
---
По первому вопросу еще хорошо гуглится "1С предприятие СКД таблица значений"
---
Я только одного не пойму. Нафига вам внешние функции в схеме, если вы в СКД и так уже таблицы значений загоняете.
---
Хороший вопрос на который у меня есть глупый ответ.
У меня уже есть рабочий отчёт СКД, который основан на наборе данных типа запрос и в нем уже приписаны эти вычисляемые поля.

Для шаблона использовал его. В нем это все работало, а тут не работает. Уже понял в какую сторону смотреть благодаря вашему комментарию.
---
Для шаблона использовал его. В нем это все работало, а тут не работает. Уже понял в какую сторону смотреть благодаря вашему комментарию.
Тогда просто загляните в ПриКомпоновкеРезультата отчета-шаблона. Там это уже должно быть прописано.
---
В своем шаблонном отчёте у меня нет кода в "ПриКомпоновкеРезультата".
Обычный отчёт СКД:
1. создаем отчёт;
2. создаем СКД;
3. создаем объект типа "Набор данных";
4. пишем запрос;
5. добавил вычисляемые поля в СКД;
6. формируем параметры вывода... все работает :)
Ничего дополнительно не писал :)
---
У меня уже есть рабочий отчёт СКД, который основан на наборе данных типа запрос и в нем уже приписаны эти вычисляемые поля. Для шаблона использовал его. В нем это все работало, а тут не работает.
Вы уверены что модуль объекта у этого отчета пустой? Тогда я без малейшего представления, как он у вас работал.
---
Абсолютно уверен, так как сам писал его с нуля. Достаточно в общем модуле сделать экспортную процедуру и все отлично считается... Не первый раз так делаю... Конфигурация УТ 3.2.
---
Странно. Возможно, это багофича файловой. Но тогда не очень понятно, почему теперь у вас перестало работать. Возможно, другая багофича :)
---
Да нет, я работаю как на файловой так и на клиент-сервере. Все отрабатывает.
Думаю стандартная обработка компоновки все учитывает. Но когда я отключил ее и сам написал свою компоновку, то не учёл что то и в результате получил плохое сообщение. В любом случае сейчас переписываю что бы сразу добавить то что нужно в ТЗ "перед заводом" данных в компоновщик. Спасибо Вам за помощь уже в который раз :)

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

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

    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ ********ТЕКСТ ЗАПРОСА*************";

    СхемаКомпоновкиДанных = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
    Настройки = КомпоновщикНастроек.ПолучитьНастройки();
    Период=Настройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("Период"));
    ПараметрДатаНачала=Период.Значение.ДатаНачала;
    ПараметрДатаКонец=Период.Значение.ДатаОкончания;

    Запрос.УстановитьПараметр("ДатаНачачала", ПараметрДатаНачала);
    Запрос.УстановитьПараметр("ДатаОкончания", ПараметрДатаКонец);

    РезультатЗапроса = Запрос.Выполнить();
    ТаблицаРезультат=РезультатЗапроса.Выгрузить().Скопировать();
    ТаблицаРезультат.Колонки.Добавить("ВремяВПути");
    ТаблицаРезультат.Колонки.Добавить("ОтклонениеПоГрафику");
    ТаблицаРезультат.Колонки.Добавить("ОтклонениеПоВыезду");
    ТаблицаРезультат.Колонки.Добавить("ВремяПрихода");

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

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

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

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

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

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

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

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