8.х Добавление внешних данных к отчёту, СКД

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем maerde, 10 окт 2010.

  1. TopicStarter Overlay
    maerde
    Offline

    maerde

    Регистрация:
    12 июл 2010
    Сообщения:
    21
    Симпатии:
    0
    Баллы:
    1
    Необходимо добавить дополнительную колонку к отчёту из программно сформированных данных. Пытаюсь реализовать с помощью соединения двух наборов данных в СКД: запроса и объекта. Имя объекта, содержащего данные указано (Вознаграждения). Однако при выполнении отчёта выдаётся ошибка:
    Отладка показала, что все значения структур и массивов заполняются при формировании отчёта, но в последней строчке приведённого ниже кода возникает ошибка.


    Код:
    Результат1 = Запрос1.Выполнить();
    
    Выборка1 = Результат1.Выбрать();
    
    АгентскиеДоговора =  Новый Массив;
    Запись = Новый Структура;
    
    Запрос2 = Новый Запрос;
    Запрос2.Текст = 	  
    "ВЫБРАТЬ
    |	РегламентированныйПроизводственныйКалендарь.ДатаКалендаря,
    |	КурсыВалют.Курс,
    |	КурсыВалют.Кратность,
    |	ХозрасчетныйОстаткиИОбороты.ВалютнаяСуммаКонечныйОстатокКт КАК СуммаВал
    |ИЗ
    |	РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь
    |		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют КАК КурсыВалют
    |		ПО РегламентированныйПроизводственныйКалендарь.ДатаКалендаря = КурсыВалют.Период
    |		ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(
    |				,
    |				День,
    |				,
    |				Организация = &Организация
    |					И Валюта = &Валюта
    |					И Субконто2 = &Договор) КАК ХозрасчетныйОстаткиИОбороты
    |		ПО РегламентированныйПроизводственныйКалендарь.ДатаКалендаря = ХозрасчетныйОстаткиИОбороты.Период
    |ГДЕ
    |	РегламентированныйПроизводственныйКалендарь.ДатаКалендаря МЕЖДУ &Начало И &Конец
    |	И (КурсыВалют.Валюта = &Валюта
    |			ИЛИ КурсыВалют.Валюта ЕСТЬ NULL )";
    Запрос2.УстановитьПараметр("Организация",Организация);
    
    
    Пока Выборка1.Следующий() Цикл
    
    Запрос2.УстановитьПараметр("Начало",Выборка1.ДатаНачалаРасчета);
    Запрос2.УстановитьПараметр("Конец",Выборка1.ДатаКонцаРасчета);
    Запрос2.УстановитьПараметр("Валюта", Выборка1.ВалютаЗайма);
    Запрос2.УстановитьПараметр("Договор",Выборка1.Договор);
    Результат2 = Запрос2.Выполнить();
    Выборка2 = Результат2.Выбрать();    
    СуммаВознаграждения = 0;
    Остаток = 0;
    Пока Выборка2.Следующий() Цикл
    Если ЗначениеЗаполнено(Выборка2.СуммаВал) Тогда 
    СуммаВознаграждения = СуммаВознаграждения + Выборка2.СуммаВал*Выборка2.Курс*Выборка2.Кратность*0.01;
    Остаток = Выборка2.СуммаВал;
    Иначе
    СуммаВознаграждения = СуммаВознаграждения + Остаток*Выборка2.Курс*Выборка2.Кратность*0.01;
    КонецЕсли; 
    КонецЦикла; 
    Запись.Вставить("Договор",Выборка1.Договор); 
    Запись.Вставить("СуммаВознаграждения",СуммаВознаграждения);
    
    АгентскиеДоговора.Добавить(Запись);
    Запись.Очистить();		
    КонецЦикла; 
    
    ВнешниеНаборыДанных = Новый Структура;
    ВнешниеНаборыДанных.Вставить("Вознаграждения",АгентскиеДоговора);
    
    //Отчёт
    СхемаКомпоновкиДанных = Отчеты.Отчет3.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
    Настройки = СхемаКомпоновкиДанных.НастройкиПоУмолчанию;
    
    //Установка настроек
    ПараметрДанныхОрганизация = КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы[0];
    ПараметрДанныхОрганизация.Значение = Организация;
    ПараметрДанныхОрганизация.Использование = Истина;
    ПараметрДанныхНачалоПериода = КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы[1];
    ПараметрДанныхНачалоПериода.Значение = От;
    ПараметрДанныхНачалоПериода.Использование = Истина;
    ПараметрДанныхКонецПериода = КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы[2];
    ПараметрДанныхКонецПериода.Значение = КонецДня(До);
    ПараметрДанныхКонецПериода.Использование = Истина;
    
    Настройки = КомпоновщикНастроек.Настройки;
    
    //Формирование отчёта
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных,Настройки);
    
    ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки,ВнешниеНаборыДанных);
    
    
    Я так понимаю, что наверное нельзя передавать массив в качестве элемента структуры внешнего набора данных:

    Код:
    ВнешниеНаборыДанных = Новый Структура;
    ВнешниеНаборыДанных.Вставить("Вознаграждения",АгентскиеДоговора);
    //где АгентскиеДоговора - массив
    
    Получить Набор данных как результат запроса мне не удаётся. Если моя ошибка в этом, то каким другим способом можно вывести дополнительную колонку с программно сформированными данными в отчёт? Или Можно применить другой способ передачи внешнего набора данных?
  2. mialord
    Offline

    mialord Модераторы Команда форума Модератор

    Регистрация:
    31 июл 2009
    Сообщения:
    5.398
    Симпатии:
    40
    Баллы:
    54
    Здраствуйте!
    1. Если нужно добавить только одну колонку, тогда используйте "Вычисляемые поля" в них можно указать вызываемую процедуру для получения данных.
    2. Если всё делали правильно, то должно работать, проверяйте связи наборов.
  3. TopicStarter Overlay
    maerde
    Offline

    maerde

    Регистрация:
    12 июл 2010
    Сообщения:
    21
    Симпатии:
    0
    Баллы:
    1
    Здравствуйте, mialord! Большое спасибо за Ваш ответ (конкретно пункт 1). Я упустил из виду эту возможность СКД а между тем с использованием "Вычисляемых полей" решение стало более простым и, что очень важно, заработало!
    Всё же интересно, что следует изменить в моём исходном варианте (с использованием внешнего набора данных). В литературе говорится, что набор данных объект используется для вывода в отчёт информации из некоторого объекта встроенного языка: таблицы значений, результата запроса, текущего документа и т.п. В результате выполнения программы я получаю набор Записей типа структура: как правильно собрать их и передать СКД?
  4. mialord
    Offline

    mialord Модераторы Команда форума Модератор

    Регистрация:
    31 июл 2009
    Сообщения:
    5.398
    Симпатии:
    40
    Баллы:
    54

    Вложения:

Поделиться этой страницей