Monday, February 11, 2013

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

Очень странно, но единой схемы в интернете по работе в системе компоновки данных я не нашел и на вылетающие ошибки пришлось потратить время, а так имеем задачу соединить остатки 2 разных баз "Управленческой" и бухгалтерской. Так как синхронизация в базах выполняется регулярно имеем одинаковые уникальные идентификаторы.
Начинаем
1. Создаем внешний отчет



1.1. В "наборы данных" добавляем "Набор данных - объединение"
1.2. В созданный набор добавляем "Набор данных - запрос" И формируем необходимый нам запрос с помощью конструктора.
1.3. В набор объединение добавляем также "Набор данных - объект" и прописываем поля которые будут загружены с таблицызначений, не забываем что поля должны совпадать с полями из набора данных запрос

2. После этого переходим в модуль объекта, и добавляем стандартную процедуру "ПриКомпоновкеРезультата". 1С автоматически генерирует процедуру со всеми входящими параметрами. И начинаем формировать заполнение процедуры



Exported from Notepad++




Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
// При формирование отключаем стандартную обработку, в противном случае постоянно будет выдавать следующую ошибку
// Ошибка исполнения отчета
//по причине:
//Ошибка инициализации
//по причине:
//Ошибка создания набора данных "НаборДанных"
//по причине:
//Не найден внешний набор данных "ТаблОст"

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


//Формируем подключение к внешней базе 1с
Подкл = Новый COMОбъект("V82.COMConnector");
COMОбъект = Подкл.Connect("Srvr=""mws-01"";Ref=""GlobalBase"";Usr=""*****"";Pwd=""******""");

//Формируем запрос во внешней базе

Запрос = COMОбъект.NewObject("Запрос");

Запрос.Текст = "ВЫБРАТЬ
| ТоварыНаСкладахОстатки.Номенклатура,
| ТоварыНаСкладахОстатки.ВНаличииОстаток КАК КоличествоОстаток,
| ТоварыНаСкладахОстатки.ВРезервеОстаток КАК ВРезерве
|ИЗ
| РегистрНакопления.ТоварыНаСкладах.Остатки КАК ТоварыНаСкладахОстатки
|ГДЕ
| ТоварыНаСкладахОстатки.Склад В
| (ВЫБРАТЬ
| Склады.Ссылка
| ИЗ
| Справочник.Склады КАК Склады
| ГДЕ
| Склады.Родитель.Наименование = ""Центральные Склады"")"
;



Результат = Запрос.Выполнить();
//Получаем результат и создаем и заполняем таблицу значений в текущей
ТаблОст = Новый ТаблицаЗначений;
ТаблОст.Колонки.Добавить("Номенклатура",новый ОписаниеТипов("СправочникСсылка.Номенклатура"));
ТаблОст.Колонки.Добавить("Организация",ОбщегоНазначения.ПолучитьОписаниеТиповСтроки(10));
ТаблОст.Колонки.Добавить("КоличествоОстаток", ОбщегоНазначения.ПолучитьОписаниеТиповЧисла(15,3));
ТаблОст.Колонки.Добавить("СуммаОстаток", ОбщегоНазначения.ПолучитьОписаниеТиповЧисла(15,2));
Табл = Результат.Выгрузить();
Для х=0 по Табл.Количество()-1 Цикл
ЗначСтр = Табл.Получить(х);
НоваяСтрока = ТаблОст.Добавить();
//По уникальному идентификатору получаем значение и преобразуем в ссылку в текущей базе
НоваяСтрока.Номенклатура = Справочники.Номенклатура.ПолучитьСсылку(Новый УникальныйИдентификатор(COMОбъект.String(ЗначСтр.Номенклатура.УникальныйИдентификатор())));
НоваяСтрока.Организация = "Упр"; // формируем левое название, так как управленческой базы нет в бухгалтерии
НоваяСтрока.СуммаОстаток = 0;
НоваяСтрока.КоличествоОстаток = Число(ЗначСтр.КоличествоОстаток);
КонецЦикла;
COMОбъект = неопределено;
Подкл = неопределено;


ВнешниеНаборыДанных = Новый Структура;
ВнешниеНаборыДанных.Вставить("ТаблОст",ТаблОст); // Формируем структуру для передечи в СКД


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

НастройкиКомпоновкиДанных = КомпоновщикНастроек.ПолучитьНастройки();

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

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

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

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

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



3. Далее, заполняем настройки, ресурсы и параметры

Как итог получаем отчет с нужными данными





1 comment:

  1. Anonymous23/7/13 17:16

    Спасибо за подробную статью! Получилось передать таблицу значений в СКД (перерыв минимум пару страниц поисковиков чтобы избавиться от ошибок) только после вашей статьи.

    ReplyDelete