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