Главная Статьи Разработки Обратная связь

Использование внешних наборов данных в системе компоновки данных.

Напомню, что наборы данных в СКД бывают 3-х видов:

  • Запрос;
  • Объект;
  • Объединение.

Так что же такое «Объект»? Объект – это «внешний» набор данных, таблица, которая может быть загружена данными результата запроса, другой таблицы значений, набора записей и т.д. Главная сложность, при использовании набора данных «объект», заключается в том, что перед формированием собственно отчета, разработчику необходимо заполнить этот объект, а следовательно, и вывод отчета, и использование возможностей «расшифровки» СКД приходиться реализовывать программным путем.

Итак, представим следующую, гипотетическую задачу: нам необходимо сравнить остатки товара по складам в 2-х базах 1С, текущей и внешней (данные из которой получаем с помощью СОМ-соединения). Предполагается, что элементы справочника «Склады» в этих двух базах синхронизированы по коду.

Создаем новый отчет, открываем схему компоновки данных и на закладке «Наборы данных», добавляем два набора: Запрос и Объект. Запрос – это получение остатков в текущей базе, а Объект – это таблица в которую будут помещены данные из внешней базы.

Рис 1

Так как задача гипотетическая, то упростим текст запроса до получения общего остатка по складу без разделения на номенклатуру, ед. измерения и т.д. Таким образом, текст запроса следующий:

 ВЫБРАТЬ
    ТоварыНаСкладахОстатки.Склад КАК Склад,
    СУММА(ТоварыНаСкладахОстатки.КоличествоОстаток) КАК ОстатокЭтаБаза
 ИЗ
    РегистрНакопления.ТоварыНаСкладах.Остатки КАК ТоварыНаСкладахОстатки
 СГРУППИРОВАТЬ ПО
    ТоварыНаСкладахОстатки.Склад

Для набора данных «Объект» добавляем имя «ВнешниеДанные» и поля: «КодСклада» (по этому полю будет выполняться связь наборов данных) и «ОстатокВнешняяБаза».

Рис 2

Далее, на закладке «Связи наборов данных», описываем связь наших наборов данных. В целом, связи наборов данных, аналогичны связям таблиц в конструкторе запросов, за исключением того, что в СКД соединение может быть только ЛЕВЫМ.
Заполняем поля следующим образом:
1. Источник связи: Запрос;
2. Приемник связи: Объект;
3. Выражение источник: Склад.Код;
4. Выражение приемник: КодСклада.

Рис 3

Теперь, на вкладке «Настройки», добавим вывод детальных записей. Для этого щелкните правой кнопкой на «Отчет», выберите «Новая группировка» и, не выбирая никакого поля, нажмите «ОК».
Здесь же добавим в «Выбранные поля»: Склад, ОстатокЭтаБаза и ОстатокВнешняяБаза.

Рис 4

На этом конструирование отчета завершено, пора переходить непосредственно к программированию!
Сгенерируем основную форму отчета и на верхней командной панели формы, добавим кнопку «Загрузить внешние данные».

Рис 5

Добавим в наш отчет табличную часть «ВнешниеДанные», с реквизитами «КодСклада» и «ОстатокВнешняяБаза», в которую будут выгружаться данные из внешней базы перед передачей процессору компоновки данных.
Замечание: Использование табличной части не обязательно, можно использовать и просто таблицу значений.

Рис 6

Далее реализуем загрузку данных из внешней базы с помощью СОМ-соединения, подробно описывать эту процедуру я не буду, так как это не относиться к теме данной статьи, а просто приведу её код:

 Процедура ДействияФормыЗагрузитьВнешниеДанные(Кнопка)
    ВнешниеДанные.Очистить();
    Попытка
       КОМ=Новый COMОбъект("V81.COMConnector");
       База=КОМ.Connect("Srvr=server;Ref=Base;Usr=user;Pwd=password");
       ТекстЗапроса="
       |ВЫБРАТЬ
       |   Склад.Код КАК КодСклада,
       |   СУММА(КоличествоОстаток) КАК ОстатокВнешняяБаза
       |ИЗ
       |   РегистрНакопления.ТоварыНаСкладах.Остатки
       |СГРУППИРОВАТЬ ПО
       |   Склад"
;
       Запрос=База.NewObject("Запрос");
       Запрос.Текст=ТекстЗапроса;
       Выборка=Запрос.Выполнить().Выбрать();
       Пока Выборка.Следующий() Цикл
          НовСтр=ВнешниеДанные.Добавить();
          ЗаполнитьЗначенияСвойств(НовСтр,Выборка);
       КонецЦикла;
    Исключение
       Сообщить(ОписаниеОшибки(),СтатусСообщения.Внимание);
    КонецПопытки;
    База=Неопределено;
 КонецПроцедуры

Затем переопределим нажатие кнопки «Сформировать»:

 Процедура ДействияФормыСформировать (Кнопка)
    ВывестиОтчет();
 КонецПроцедуры

Программный вывод отчета в системе компоновки данных реализуем с помощью типового алгоритма, который детально рассмотрен в соответствующей литературе и на дисках ИТС. Единственное на что бы я хотел обратить внимание – это расширение формы отчета ДанныеРасшифровки. При компоновке макета, необходимо передать эту переменную в метод «Выполнить» компоновщика макета, иначе расшифровка (это то, что происходит по двойному клику на ячейке табличного документа) доступна не будет. Так же передаем ДанныеРасшифровки процессору компоновки при инициализации.

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

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

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

    ПроцессорВывода.НачатьВывод();

    Пока Истина Цикл
       ЭлементРезультата=ПроцессорКомпоновки.Следующий();
       Если ЭлементРезультата=Неопределено Тогда
          Прервать;
       Иначе
          ПроцессорВывода.ВывестиЭлемент(ЭлементРезультата);
       КонецЕсли;
    КонецЦикла;

    ПроцессорВывода.ЗакончитьВывод();

    ДокументРезультат.ОтображатьСетку=Ложь;
    ДокументРезультат.ОтображатьЗаголовки=Ложь;
    ДокументРезультат.Показать();
 КонецПроцедуры

Проверим работу отчета в режиме «Предприятие».

Рис 7

Отчет работает. Но есть одно НО. При попытке отфильтровать, упорядочить, оформить и т.д. возникает ошибка исполнения: «Не найден внешний набор данных ВнешниеДанные». Дело в том, что фильтрация, упорядочивание и пр. по сути, являются установкой настроек отчета и переформированием результата. А так как используется внешний набор данных, необходимо передавать его при инициализации процессора компоновки. С учетом этого, определим для поля табличного документа «Результат», процедуру «ОбработкаРасшифровки»:

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

Здесь, «ВыполненноеДействие» - это переменная, куда помещается выбранное пользователем действие. «НастройкиРасшифровки» - это настройки, полученные вследствие выбора пользователя. То есть, если пользователь выбрал действие, влияющее на настройки компоновки данных, то мы устанавливаем новые настройки и формируем отчет заново.
Вот теперь наш гипотетический отчет полностью готов к работе!

Назад
Copyright © coder1cv8 2008 г. Все права защищены
Сайт создан в системе uCoz