Перейти к содержимому


- - - - -

Создание Запроса по ком


Сообщений в теме: 5

#1 Djyarilo

    Активист


  • 400 сообщений

Отправлено 09 февраля 2012 - 12:20

Задача следующая нужно сравнить суммы по контрагентам между белой и черной. Инфа такая же как отчет ведомость с контрагентом. Ну я решил в отчете ведомость по контрагентам. добавить подключение к базе. и попробовать на стороне базе создать объект запрос и выполнить его. написал подлключение пытаюсь подключится выдает ошибку на Период с по. В чем может быть причина?

КаталогБазыОле = "D:\Копии\ЧЕРНАЯ";
ПользовательОле = "Программист";
ПарольОле = "sasa5";
МонопольныйРежимOLE = "";
ЗапускБезЗаставки = 0;

Попытка
в7 = СоздатьОбъект("V77.Application");
_открыта = в7.initialize(в7.RMTrade, "/d" + КаталогБазыОле + " /n" + СокрЛП(ПользовательОле) + " /p" + сокрЛП(ПарольОле), "NO_SPLASH_SHOW");
Исключение
Состояние("/d" + КаталогБазыОле + "/n" + СокрЛП(ПользовательОле) + ОписаниеОшибки());
КонецПопытки;Запрос = в7.createobject("Запрос");//СоздатьОбъект("Запрос");
//Запрос =СоздатьОбъект("Запрос");
ТекстЗапроса =
"//{{ЗАПРОС(Сформировать)
|Период с ДатаНачала по ДатаКонца;";//заведомо на эту строк
ДобПеремЗапроса(ТекстЗапроса,"Фирма", "Фирма");
ДобПеремЗапроса(ТекстЗапроса,"УпрАналитика","Фирма.УпрАналитика");
ДобПеремЗапроса(ТекстЗапроса,"ЮрЛицо", "Фирма.ЮрЛицо");
ДобПеремЗапроса(ТекстЗапроса,"Контрагент", "Договор.Владелец");
ДобПеремЗапроса(ТекстЗапроса,"Менеджер", "Договор.Владелец.МенеджерНов");
ДобПеремЗапроса(ТекстЗапроса,"СвойствоКонтр","Договор.Владелец.ОсновноеСвойство.ЗначениеСвойства");
ДобПеремЗапроса(ТекстЗапроса,"Договор", "Договор");
ДобПеремЗапроса(ТекстЗапроса,"КодОперации", "КодОперации");
Если СписокВидовОтчетов.ТекущаяСтрока()=1 Тогда // по покупателям
ДобПеремЗапроса(ТекстЗапроса,"СтавкаНП","СтавкаНП");
КонецЕсли;
ДобПеремЗапроса(ТекстЗапроса,"ВидДолга","ВидДолга");
ДобПеремЗапроса(ТекстЗапроса,"КредДокумент","КредДокумент");
ДобПеремЗапроса(ТекстЗапроса,"Проект","ТекущийДокумент.Проект");
  
ДобПеремЗапроса(ТекстЗапроса,"СуммаВ","СуммаВал");
Если ВыбВидВалюты = 1 Тогда
ДобПеремЗапроса(ТекстЗапроса,"Сумма","СуммаРуб");
Иначе
ДобПеремЗапроса(ТекстЗапроса,"Сумма","СуммаУпр");
КонецЕсли;												   ТекстЗапроса = ТекстЗапроса +
"
|Функция НачОст = НачОст(Сумма);
|Функция Приход = Приход(Сумма);
|Функция Расход = Расход(Сумма);
|Функция КонОст = КонОст(Сумма);
|Функция НачОстВ = НачОст(СуммаВ);
|Функция ПриходВ = Приход(СуммаВ);
|Функция РасходВ = Расход(СуммаВ);
|Функция КонОстВ = КонОст(СуммаВ);
|Функция ВозвратОтПокупателя = Расход(Сумма)Когда (КодОперации = глКО.ВозвратОтПокупателя);
|Функция ВозвратПоставщику = Приход(Сумма)Когда (КодОперации = глКО.ВозвратПоставщику);
|Функция ВозвратОтПокупателяВ = Расход(СуммаВ)Когда( КодОперации = глКО.ВозвратОтПокупателя);
|Функция ВозвратПоставщикуВ = Приход(СуммаВ)Когда (КодОперации = глКО.ВозвратПоставщику);";Если СтрДолги <> "все" Тогда
ТекстЗапроса = ТекстЗапроса + "
|Функция КонОстП = КонОст(Сумма)Когда((ПустоеЗначение(ДатаОплаты(КредДокумент)) = 0)и(ДатаОплаты(КредДокумент) < ДатаКонца));
|Функция КонОстВП= КонОст(СуммаВ)Когда((ПустоеЗначение(ДатаОплаты(КредДокумент)) = 0)и(ДатаОплаты(КредДокумент) < ДатаКонца));";
КонецЕсли;
Для СчЦикла =1 по СписокОперДебет.РазмерСписка() Цикл
НазвОперации = СписокОперДебет.ПолучитьЗначение(СчЦикла).Идентификатор();
ТекстЗапроса = ТекстЗапроса + РазделительСтрок+
"Функция "+НазвОперации+"Приход  = Приход(Сумма)  когда (КодОперации = глКО."+НазвОперации+");"+
"Функция "+НазвОперации+"ПриходВ = Приход(СуммаВ) когда (КодОперации = глКО."+НазвОперации+");";
КонецЦикла;
Для СчЦикла=1 по СписокОперКредит.РазмерСписка() Цикл
НазвОперации = СписокОперКредит.ПолучитьЗначение(СчЦикла).Идентификатор();
ТекстЗапроса = ТекстЗапроса + РазделительСтрок+
"Функция "+НазвОперации+"Расход  = Расход(Сумма)  когда (КодОперации = глКО."+НазвОперации+");"+
"Функция "+НазвОперации+"РасходВ = Расход(СуммаВ) когда (КодОперации = глКО."+НазвОперации+");";
КонецЦикла;//Проверка на право просмотра для менеджеров
//(клиент закреплен за менеджером значит только он может смотреть отчет по этим клиентам)
Если глПользователь.МенеджерКонтров=0 Тогда
спрФизЛица = СоздатьОбъект("Справочник.ФизЛица");
спрФизЛица.НайтиЭлемент(глПользователь.ФизЛицо);
физЛицо = спрФизЛица.ТекущийЭлемент();
ТекстЗапроса=ТекстЗапроса+"
|Условие (Менеджер = физЛицо);
|";
КонецЕсли;
Загол="";
НетОш = 1; // нет ошибок при наложении фильтров
Если ВидРазделителя = 1 Тогда
НетОш = НетОш * глФильтрПоПеременнойЗапроса(ТаблицаМФ, "Фирма",ВыбРазделитель1,"ВыбРазделитель1",ТекстЗапроса,Загол);
НетОш = НетОш * глФильтрПоПеременнойЗапроса(ТаблицаМФ, "ЮрЛицо",,,ТекстЗапроса,Загол);
НетОш = НетОш * глФильтрПоПеременнойЗапроса(ТаблицаМФ, "УпрАналитика",,,ТекстЗапроса,Загол);
ИначеЕсли ВидРазделителя = 2 Тогда												  
НетОш = НетОш * глФильтрПоПеременнойЗапроса(ТаблицаМФ, "ЮрЛицо",ВыбРазделитель2,"ВыбРазделитель2",ТекстЗапроса,Загол);
НетОш = НетОш * глФильтрПоПеременнойЗапроса(ТаблицаМФ, "Фирма",,,ТекстЗапроса,Загол);
НетОш = НетОш * глФильтрПоПеременнойЗапроса(ТаблицаМФ, "УпрАналитика",,,ТекстЗапроса,Загол);
ИначеЕсли ВидРазделителя = 3 Тогда												  
НетОш = НетОш * глФильтрПоПеременнойЗапроса(ТаблицаМФ, "УпрАналитика",ВыбРазделитель3,"ВыбРазделитель3",ТекстЗапроса,Загол);
НетОш = НетОш * глФильтрПоПеременнойЗапроса(ТаблицаМФ, "Фирма",,,ТекстЗапроса,Загол);
НетОш = НетОш * глФильтрПоПеременнойЗапроса(ТаблицаМФ, "ЮрЛицо",,,ТекстЗапроса,Загол);
КонецЕсли;
НетОш = НетОш * глФильтрПоПеременнойЗапроса(ТаблицаМФ, "Контрагент",ВыбКонтрагент,"ВыбКонтрагент",ТекстЗапроса,Загол,"СвойстваКонтрагентов");
НетОш = НетОш * глФильтрПоПеременнойЗапроса(ТаблицаМФ, "Договор",ВыбДоговор,"ВыбДоговор",ТекстЗапроса,Загол);Если НетОш = 0 Тогда
Возврат;
КонецЕсли;
						 
НомерГруппировкиПоДоговору	 = 9999; // невозможно большое значение
НомерГруппировкиПоКонтрагенту = 9999; // невозможно большое значение
НомерГруппировкиПоВидуДолга	 = 9999; // невозможно большое значение
НомерГруппировкиПоКредДокументу = 9999; // невозможно большое значение
НомерГруппировкиПоПроекту = 9999; // невозможно большое значение
ПечЗаголовокСтолбца = ""; 
Если СтрДолги = "все" Тогда 
ПечЗаголовок = "Ведомость по контрагентам: "+ СписокВидовОтчетов.ПолучитьЗначение(СписокВидовОтчетов.ТекущаяСтрока())+", "+ВалютаОтчета; 
  ИначеЕсли СтрДолги = "только контрагентов" Тогда 
ПечЗаголовок = "Долги контрагентов " + ?(Просроченные = 1, "(просроченные):", ":") + СписокВидовОтчетов.ПолучитьЗначение(СписокВидовОтчетов.ТекущаяСтрока())+", " + ВалютаОтчета; 
  Иначе 
ПечЗаголовок = "Долги контрагентам " + ?(Просроченные = 1, "(просроченные):", ":") + СписокВидовОтчетов.ПолучитьЗначение(СписокВидовОтчетов.ТекущаяСтрока())+", " + ВалютаОтчета; 
  КонецЕсли; 
УстановитьГруппировкиЗапроса(ТекстЗапроса, ПечЗаголовокСтолбца);
КоличествоГруппировок = СписокГруппировок.РазмерСписка();Если КоличествоГруппировок > 5 Тогда
Предупреждение("Нельзя сделать больше 5 группировок!",60);
Возврат;
КонецЕсли;	   
  
Если Долги.ТекущаяСтрока() <> 1 Тогда
Поз = Группировки.НайтиЗначение("Контрагент");
Если Группировки.Пометка(Поз) = 0 Тогда
Предупреждение("При установке фильтра по долгам обязательна группировка по контрагентам!");
Возврат;
КонецЕсли;																					 
КонецЕсли;
					  
Если (НомерГруппировкиПоВидуДолга = 9999) и (НомерГруппировкиПоКредДокументу = 9999) Тогда
ТекстЗапроса = ТекстЗапроса + "
|Условие ((КодОперации <> глКО.ЗачтенАвансПоставщику) И (КодОперации <> глКО.ЗачтенАвансПоставщикуВал));
|Условие (КодОперации <> глКО.ЗачтенАвансПокупателя);
|Условие (КодОперации <> глКО.СторнированАванс);
|Условие (КодОперации <> глКО.ЗачтенВозвратПокупателя);
|Условие (КодОперации <> глКО.ЗачтенВозвратПоставщику);
|Условие (КодОперации <> глКО.СторнированВозврат);";
Иначе
ТекстЗапроса = ТекстЗапроса + "
|Функция ДельтаПриход = Приход(Сумма)Когда((КодОперации = глКО.ЗачтенАвансПоставщику) или (КодОперации = глКО.ЗачтенАвансПокупателя) или (КодОперации = глКО.СторнированАванс) или (КодОперации = глКО.ЗачтенВозвратПокупателя) или (КодОперации = глКО.СторнированВозврат) или (КодОперации = глКО.ЗачтенВозвратПоставщику)  или (КодОперации = глКО.ЗачтенАвансПоставщикуВал));
|Функция ДельтаРасход = Расход(Сумма)Когда((КодОперации = глКО.ЗачтенАвансПоставщику) или (КодОперации = глКО.ЗачтенАвансПокупателя) или (КодОперации = глКО.СторнированАванс) или (КодОперации = глКО.ЗачтенВозвратПокупателя) или (КодОперации = глКО.СторнированВозврат) или (КодОперации = глКО.ЗачтенВозвратПоставщику) или (КодОперации = глКО.ЗачтенАвансПоставщикуВал));
|Функция ДельтаПриходВ = Приход(СуммаВ)Когда((КодОперации = глКО.ЗачтенАвансПоставщику) или (КодОперации = глКО.ЗачтенАвансПокупателя) или (КодОперации = глКО.СторнированАванс) или (КодОперации = глКО.ЗачтенВозвратПокупателя) или (КодОперации = глКО.СторнированВозврат) или (КодОперации = глКО.ЗачтенВозвратПоставщику) или (КодОперации = глКО.ЗачтенАвансПоставщикуВал));
|Функция ДельтаРасходВ = Расход(СуммаВ)Когда((КодОперации = глКО.ЗачтенАвансПоставщику) или (КодОперации = глКО.ЗачтенАвансПокупателя) или (КодОперации = глКО.СторнированАванс) или (КодОперации = глКО.ЗачтенВозвратПокупателя) или (КодОперации = глКО.СторнированВозврат) или (КодОперации = глКО.ЗачтенВозвратПоставщику) или (КодОперации = глКО.ЗачтенАвансПоставщикуВал));";
КонецЕсли;


#2 WaRDeR

    Работа у меня такая ;)


  • 2 920 сообщений

Отправлено 09 февраля 2012 - 12:37

Ну в этом коде нет самого интересного - это создание самого запроса.

Так как запрос будет выполняться по ОЛЕ, а запрос - это объект ИБ, то и создаваться он должен как объект ОЛЕ ИБ. Т.е. Запрос = ОЛЕИБ.CreateObject("Запрос");

Ну и соответственно все объекты, используемые в запросе, тоже должны быть объектами ОЛЕ ИБ.

Таким образом, использование стандартных функций фильтрации по регистрам вряд ли уместны.

Могу предложить альтернативный вариант. Весь этот код разместить в подключаемой базе. Создать там глобальную функцию, которая будет собирать остатки и возвращать их в приемлемом виде, например, как ТЗ. А в исходной базе уже обрабатывать эту ТЗ.
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. (Э.Йодан)

#3 Djyarilo

    Активист


  • 400 сообщений

Отправлено 09 февраля 2012 - 12:46

охото матерится. если уж на то пошло лучше отобрать документы которые входят в регистр циклом. потому что так то эта процедура, которую я описал описана в отчете ведомостьпоконтрагенту. или как то попытатся открыть отчет и от туда мутить хз ваще.

вопрос. как завершить сеанс к подключаемой базе. Потому что в 8.2 ест ЗаверешениеСеанса. не могу найти тут аналога. а то как то 1 раз подрубаться и больше а тата не реал

#4 WaRDeR

    Работа у меня такая ;)


  • 2 920 сообщений

Отправлено 09 февраля 2012 - 13:18

Из всего набора слов понятны только выражения "охото матерится", "хз" и "как завершить сеанс к подключаемой базе".

Первые 2 - это лирические отступления. На последнее можно ответить: в семерке для освобождения объекта достаточно очистить значение переменной. Т.е.
в7 = СоздатьОбъект("V77.Application");
// ...
в7 = "";

Пользователь не знает, чего он хочет, пока не увидит то, что он получил. (Э.Йодан)

#5 Djyarilo

    Активист


  • 400 сообщений

Отправлено 15 февраля 2012 - 07:00

Да я уже разобрался сделал по другому)

#6 Бухгалтерский угодник

    Ветеран


  • 13 289 сообщений

Отправлено 15 февраля 2012 - 13:07

Ну так поделитесь как... Вдруг кому пригодится ваша идея
"Любая проблема имеет Фамилию, Имя, Отчество....." (И. Сталин)
Жмакнувшим Изображение буду благодарен.





Количество пользователей, читающих эту тему: 1

0 пользователей, 1 гостей, 0 анонимных