9 окт. 2012 г.

Загрузка внешних данных в СКД

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

Создаем новую обработку, добавляем ей макет компоновки данных. В моем примере макет называется "СхемаКомпоновкиДанных". Я строю свой запрос по остаткам товаров.
ВЫБРАТЬ
 ТоварыНаСкладеОстатки.Склад,
 ТоварыНаСкладеОстатки.Номенклатура,
 ТоварыНаСкладеОстатки.КоличествоОстаток КАК Количество
ИЗ
 РегистрНакопления.ТоварыНаСкладе.Остатки КАК ТоварыНаСкладеОстатки 

В форму обработки добавляем реквизит "Результат", тип "Табличный документ".

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

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
 
 СформироватьСКД();
 
КонецПроцедуры
Формирование вынесено в отдельную процедуру, поскольку в дальнейшем мы будем  повторно формировать отчет. В результате получаем следующее:

Теперь добавим реакцию на выбор в табличном документе. Добавим в процедуру СформироватьСКД новый объект ДанныеРасшифровкиКомпоновкиДанных:
&НаСервере
Процедура СформироватьСКД()
 
 Результат.Очистить();
 
 ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;
 
 СхемаКомпоновкиДанных = РеквизитФормыВЗначение("Объект").ПолучитьМакет("СхемаКомпоновкиДанных");
 КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
 МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, СхемаКомпоновкиДанных.НастройкиПоУмолчанию, ДанныеРасшифровки);
 
 ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
 ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки);
 
 ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
 ПроцессорВывода.УстановитьДокумент(Результат);
 ПроцессорВывода.ОтображатьПроцентВывода = Истина;
 
 ПроцессорВывода.Вывести(ПроцессорКомпоновки);  
 
КонецПроцедуры // СформироватьСКД() 
Появляется реакция на выбор. Теперь добавим процедуру события "Обработка расшифровки" табличного документа. Если посмотреть в текущей реализации в отладчике значение параметра "Расшифровка", то оно будет иметь тип "ИдентификаторРасшифровкиКомпоновкиДанных".

Теперь надо назначить необходимые нам параметры расшифровки для детальных записей. Переходим в макет компоновки, предварительно задаем имя детальной группировки (в моем случае "Детали"), настраиваем свой макет. Добавляем макет группировки для детальной группировки.

Затем в макете прописываем поля "Номенклатура", "Количество", в параметрах расшифровки этих полей указываем "Номенклатура", задаем область для для группировки.

Теперь для детальной группировки параметр "Расшифровка" будет содержать ссылку на элемент справочника номенклатуры.
Прежде, чем реализовывать обработку выбора, добавим новый реквизит формы "Товар", тип "Таблица значений", в него поместим колонку "Номенклатура", тип "СправочникСсылка.Номенклатура". После этого пишем код:
&НаКлиенте
Процедура РезультатОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка)
 
 СтандартнаяОбработка = Ложь;
 Если ТипЗнч(Расшифровка) = Тип("СправочникСсылка.Номенклатура") Тогда
  
  мСтроки = Товар.НайтиСтроки(Новый Структура("Номенклатура", Расшифровка));
  Если мСтроки.Количество() = 0 Тогда
   СтрокаТЧ = Товар.Добавить();
   СтрокаТЧ.Номенклатура = Расшифровка;
  КонецЕсли;
 КонецЕсли;
 
КонецПроцедуры
 
Наша таблица заполняется, пришло время передать ее в СКД. Добавим новый макет компоновки данных "ЗагрузкаТЧ". Настроим его следующим образом:

Вывод в настройках - обычный список. В форме добавим реквизит "ТЧ", тип "Табличный документ", разместим его на форме.

Добавим процедуру СформироватьТЧ, в обработку расшифровки добавим вызов этой процедуры:
&НаСервере
Процедура СформироватьТЧ()

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

КонецПроцедуры // СформироватьТЧ()

&НаКлиенте
Процедура РезультатОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка)
 
 СтандартнаяОбработка = Ложь;
 Если ТипЗнч(Расшифровка) = Тип("СправочникСсылка.Номенклатура") Тогда
  
  мСтроки = Товар.НайтиСтроки(Новый Структура("Номенклатура", Расшифровка));
  Если мСтроки.Количество() = 0 Тогда
   СтрокаТЧ = Товар.Добавить();
   СтрокаТЧ.Номенклатура = Расшифровка;
   СформироватьТЧ();
  КонецЕсли;
 КонецЕсли;
 
КонецПроцедуры
В результате, при выборе значения в левом табличном документе оно появится в правом:

Напоследок, загрузим эту же таблицу в первый макет СКД, сделаем цветовое отображение выбранных значений. Добавляем в макет новый источник данных:

Настраиваем связи:

Добавляем вычисляемое поле:

В настройках добавляем элемент условного оформления:

Добавляем в процедуру СформироватьСКД загрузку внешних данных, в обработку расшифровки вызов этой процедуры:
&НаСервере
Процедура СформироватьСКД()
 
 Результат.Очистить();
 
 ВнешДанные = Новый Структура("ТЧ", Товар.Выгрузить());
 
 ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;
 
 СхемаКомпоновкиДанных = РеквизитФормыВЗначение("Объект").ПолучитьМакет("СхемаКомпоновкиДанных");
 КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
 МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, СхемаКомпоновкиДанных.НастройкиПоУмолчанию, ДанныеРасшифровки);
 
 ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
 ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, ВнешДанные, ДанныеРасшифровки);
 
 ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
 ПроцессорВывода.УстановитьДокумент(Результат);
 ПроцессорВывода.ОтображатьПроцентВывода = Истина;
 
 ПроцессорВывода.Вывести(ПроцессорКомпоновки);  
 
КонецПроцедуры // СформироватьСКД()

&НаКлиенте
Процедура РезультатОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка)
 
 СтандартнаяОбработка = Ложь;
 Если ТипЗнч(Расшифровка) = Тип("СправочникСсылка.Номенклатура") Тогда
  
  мСтроки = Товар.НайтиСтроки(Новый Структура("Номенклатура", Расшифровка));
  Если мСтроки.Количество() = 0 Тогда
   СтрокаТЧ = Товар.Добавить();
   СтрокаТЧ.Номенклатура = Расшифровка;
   СформироватьТЧ();
   СформироватьСКД();
  КонецЕсли;
 КонецЕсли;
 
КонецПроцедуры
Теперь выбранные данные подсвечиваются:

Выгрузка базы

Комментариев нет:

Отправить комментарий