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

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 7.7"", создана пользователем djyarilo, 9 фев 2012.

  1. TopicStarter Overlay
    djyarilo
    Offline

    djyarilo Опытный в 1С

    Регистрация:
    18 апр 2011
    Сообщения:
    435
    Симпатии:
    0
    Баллы:
    26
    Задача следующая нужно сравнить суммы по контрагентам между белой и черной. Инфа такая же как отчет ведомость с контрагентом. Ну я решил в отчете ведомость по контрагентам. добавить подключение к базе. и попробовать на стороне базе создать объект запрос и выполнить его. написал подлключение пытаюсь подключится выдает ошибку на Период с по. В чем может быть причина?
    Код:
    КаталогБазыОле = "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
    Offline

    WaRDeR Модераторы Команда форума Модератор

    Регистрация:
    23 ноя 2006
    Сообщения:
    3.263
    Симпатии:
    14
    Баллы:
    29
    Ну в этом коде нет самого интересного - это создание самого запроса.

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

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

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

    Могу предложить альтернативный вариант. Весь этот код разместить в подключаемой базе. Создать там глобальную функцию, которая будет собирать остатки и возвращать их в приемлемом виде, например, как ТЗ. А в исходной базе уже обрабатывать эту ТЗ.
  3. TopicStarter Overlay
    djyarilo
    Offline

    djyarilo Опытный в 1С

    Регистрация:
    18 апр 2011
    Сообщения:
    435
    Симпатии:
    0
    Баллы:
    26
    охото матерится. если уж на то пошло лучше отобрать документы которые входят в регистр циклом. потому что так то эта процедура, которую я описал описана в отчете ведомостьпоконтрагенту. или как то попытатся открыть отчет и от туда мутить хз ваще.

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

    WaRDeR Модераторы Команда форума Модератор

    Регистрация:
    23 ноя 2006
    Сообщения:
    3.263
    Симпатии:
    14
    Баллы:
    29
    Из всего набора слов понятны только выражения "охото матерится", "хз" и "как завершить сеанс к подключаемой базе".

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

    djyarilo Опытный в 1С

    Регистрация:
    18 апр 2011
    Сообщения:
    435
    Симпатии:
    0
    Баллы:
    26
    Да я уже разобрался сделал по другому)
  6. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.523
    Симпатии:
    407
    Баллы:
    104
    Ну так поделитесь как... Вдруг кому пригодится ваша идея

Поделиться этой страницей