Главная | Статьи | Разработки | Обратная связь | |||||
Использование внешних наборов данных в системе компоновки данных.Напомню, что наборы данных в СКД бывают 3-х видов:
Так что же такое «Объект»? Объект – это «внешний» набор данных, таблица, которая может быть загружена данными результата запроса, другой таблицы значений, набора записей и т.д. Главная сложность, при использовании набора данных «объект», заключается в том, что перед формированием собственно отчета, разработчику необходимо заполнить этот объект, а следовательно, и вывод отчета, и использование возможностей «расшифровки» СКД приходиться реализовывать программным путем. Итак, представим следующую, гипотетическую задачу: нам необходимо сравнить остатки товара по складам в 2-х базах 1С, текущей и внешней (данные из которой получаем с помощью СОМ-соединения). Предполагается, что элементы справочника «Склады» в этих двух базах синхронизированы по коду. Создаем новый отчет, открываем схему компоновки данных и на закладке «Наборы данных», добавляем два набора: Запрос и Объект. Запрос – это получение остатков в текущей базе, а Объект – это таблица в которую будут помещены данные из внешней базы. ![]() Так как задача гипотетическая, то упростим текст запроса до получения общего остатка по складу без разделения на номенклатуру, ед. измерения и т.д. Таким образом, текст запроса следующий: |
||
ВЫБРАТЬ ТоварыНаСкладахОстатки.Склад КАК Склад, СУММА(ТоварыНаСкладахОстатки.КоличествоОстаток) КАК ОстатокЭтаБаза ИЗ РегистрНакопления.ТоварыНаСкладах.Остатки КАК ТоварыНаСкладахОстатки СГРУППИРОВАТЬ ПО ТоварыНаСкладахОстатки.Склад |
||
Для набора данных «Объект» добавляем имя «ВнешниеДанные» и поля: «КодСклада» (по этому полю будет выполняться связь наборов данных) и «ОстатокВнешняяБаза». ![]()
Далее, на закладке «Связи наборов данных», описываем связь наших наборов данных. В целом, связи наборов данных,
аналогичны связям таблиц в конструкторе запросов, за исключением того, что в СКД соединение может быть только ЛЕВЫМ. ![]()
Теперь, на вкладке «Настройки», добавим вывод детальных записей. Для этого щелкните правой кнопкой на «Отчет»,
выберите «Новая группировка» и, не выбирая никакого поля, нажмите «ОК». ![]()
На этом конструирование отчета завершено, пора переходить непосредственно к программированию! ![]()
Добавим в наш отчет табличную часть «ВнешниеДанные», с реквизитами «КодСклада» и «ОстатокВнешняяБаза», в которую
будут выгружаться данные из внешней базы перед передачей процессору компоновки данных. ![]() Далее реализуем загрузку данных из внешней базы с помощью СОМ-соединения, подробно описывать эту процедуру я не буду, так как это не относиться к теме данной статьи, а просто приведу её код: |
||
Процедура ДействияФормыЗагрузитьВнешниеДанные(Кнопка) ВнешниеДанные.Очистить(); Попытка КОМ=Новый COMОбъект("V81.COMConnector"); База=КОМ.Connect("Srvr=server;Ref=Base;Usr=user;Pwd=password"); ТекстЗапроса=" |ВЫБРАТЬ | Склад.Код КАК КодСклада, | СУММА(КоличествоОстаток) КАК ОстатокВнешняяБаза |ИЗ | РегистрНакопления.ТоварыНаСкладах.Остатки |СГРУППИРОВАТЬ ПО | Склад"; Запрос=База.NewObject("Запрос"); Запрос.Текст=ТекстЗапроса; Выборка=Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл НовСтр=ВнешниеДанные.Добавить(); ЗаполнитьЗначенияСвойств(НовСтр,Выборка); КонецЦикла; Исключение Сообщить(ОписаниеОшибки(),СтатусСообщения.Внимание); КонецПопытки; База=Неопределено; КонецПроцедуры |
||
Затем переопределим нажатие кнопки «Сформировать»: |
||
Процедура ДействияФормыСформировать (Кнопка) ВывестиОтчет(); КонецПроцедуры |
||
Программный вывод отчета в системе компоновки данных реализуем с помощью типового алгоритма, который детально рассмотрен в соответствующей литературе и на дисках ИТС. Единственное на что бы я хотел обратить внимание – это расширение формы отчета ДанныеРасшифровки. При компоновке макета, необходимо передать эту переменную в метод «Выполнить» компоновщика макета, иначе расшифровка (это то, что происходит по двойному клику на ячейке табличного документа) доступна не будет. Так же передаем ДанныеРасшифровки процессору компоновки при инициализации. |
||
Процедура ВывестиОтчет() ЭлементыФормы.Результат.Очистить(); Если ВнешниеДанные.Количество()=0 Тогда Предупреждение("Внешние данные не загружены. Нажмите кнопку <Загрузить внешние данные>"); Возврат; КонецЕсли; ВнешниеНаборыДанных=Новый Структура; ВнешниеНаборыДанных.Вставить("ВнешниеДанные",ВнешниеДанные); КомпоновщикМакета=Новый КомпоновщикМакетаКомпоновкиДанных; Настройки=КомпоновщикНастроек.ПолучитьНастройки(); МакетКомпоновки=КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных,Настройки,ДанныеРасшифровки); ПроцессорКомпоновки=Новый ПроцессорКомпоновкиДанных; ПроцессорКомпоновки.Инициализировать(МакетКомпоновки,ВнешниеНаборыДанных,ДанныеРасшифровки); ДокументРезультат=ЭлементыФормы.Результат; ПроцессорВывода=Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент; ПроцессорВывода.УстановитьДокумент(ДокументРезультат); ПроцессорВывода.НачатьВывод(); Пока Истина Цикл ЭлементРезультата=ПроцессорКомпоновки.Следующий(); Если ЭлементРезультата=Неопределено Тогда Прервать; Иначе ПроцессорВывода.ВывестиЭлемент(ЭлементРезультата); КонецЕсли; КонецЦикла; ПроцессорВывода.ЗакончитьВывод(); ДокументРезультат.ОтображатьСетку=Ложь; ДокументРезультат.ОтображатьЗаголовки=Ложь; ДокументРезультат.Показать(); КонецПроцедуры |
||
Проверим работу отчета в режиме «Предприятие». ![]() Отчет работает. Но есть одно НО. При попытке отфильтровать, упорядочить, оформить и т.д. возникает ошибка исполнения: «Не найден внешний набор данных ВнешниеДанные». Дело в том, что фильтрация, упорядочивание и пр. по сути, являются установкой настроек отчета и переформированием результата. А так как используется внешний набор данных, необходимо передавать его при инициализации процессора компоновки. С учетом этого, определим для поля табличного документа «Результат», процедуру «ОбработкаРасшифровки»: |
||
Процедура РезультатОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка) Перем ВыполненноеДействие; СтандартнаяОбработка=Ложь; ОбработкаРасшифровки=Новый ОбработкаРасшифровкиКомпоновкиДанных(ДанныеРасшифровки,Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных)); НастройкиРасшифровки=ОбработкаРасшифровки.Выполнить(Расшифровка,ВыполненноеДействие); Если НастройкиРасшифровки<>Неопределено Тогда КомпоновщикНастроек.ЗагрузитьНастройки(НастройкиРасшифровки); ВывестиОтчет(); КонецЕсли; КонецПроцедуры |
||
Здесь, «ВыполненноеДействие» - это переменная, куда помещается выбранное пользователем действие. «НастройкиРасшифровки» -
это настройки, полученные вследствие выбора пользователя. То есть, если пользователь выбрал действие, влияющее на
настройки компоновки данных, то мы устанавливаем новые настройки и формируем отчет заново. |
||
Назад | ||