gifts2017

Прямой запрос на выборку подчиненных документов

Опубликовал Vitalya Гуляев (Vix) в раздел Программирование - Практика программирования

Иногда необходимо получить список или таблицу документов, подчиненных выбранному. Для этого в глобальном модуле была написана функция с прямым запросом на выборку подчиненных документов. Работает только в SQL версии и при установленной внешней компоненте 1С++ !

 

 

 

 

 

//глобальные переменные

 

Перем RS Экспорт ;
Перем RSподч Экспорт ;
Перем RSДвиж Экспорт ;
Перем МетаДата Экспорт ;  

 

Функция глВыбратьПодчиненныеДокументы(Док,ВидДок="",УдПров=1) Экспорт
 Перем ТЗ;
 RSподч = СоздатьОбъект("ODBCRecordset");
    ТекстЗапроса="
    |SELECT
    |   TabJ.IDDOC as ИдДокумента
    |  ,TabJ.IDDOCDEF as ВидДокумента
    |FROM
    | _1SCRDOC as Отбор (NOLOCK)
    |INNER JOIN
    | _1SJOURN As TabJ (NOLOCK) ON Отбор.ChildID = TabJ.IDDOC
    |WHERE {Условие}
 |";
 Если ВидДок <> "" Тогда
        стр = "(Отбор.ParentVal=?)  AND (TabJ.IDDOCDEF=?) AND (Отбор.MDID=0) AND (TabJ.Closed&1>=?) AND (TabJ.ISMARK=0)";
 Иначе
  стр = "(Отбор.ParentVal=?) AND (Отбор.MDID=0) AND (TabJ.Closed&1>=?) AND (TabJ.ISMARK=0)";
 КонецЕсли;
    ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "{Условие}", стр) ;
    //Если ПустоеЗначение(ДатаНач)=0 Тогда
    //    ТекстЗапроса = ТекстЗапроса + "AND TabJ.DATE_TIME_IDDOC>=МетаДата.ПолучитьСтрИзДаты(ДатаНач)";
    //КонецЕсли;
    //Если ПустоеЗначение(ДатаКон)=0 Тогда
    //    ТекстЗапроса = ТекстЗапроса + "AND TabJ.DATE_TIME_IDDOC<МетаДата.ПолучитьСтрИзДаты(ДатаКон+1)";
    //КонецЕсли;
 RSподч.Подготовить(ТекстЗапроса) ;
 RSподч.ДобПараметр(1,14,23,0) ;
 RSподч.ДобПараметр(1,3,4,0) ;
 RSподч.ДобПараметр(1,2,1,0) ;
 RSподч.ДобПараметр(1,2,1,0) ;
 
    ТЗЗапрос =СоздатьОбъект("ТаблицаЗначений");
    ТЗЗапрос.НоваяКолонка("Документ");
    RSподч.УстПараметр(1, МетаДата.ЗначениеВСамуюДлиннуюСтрокуБД(Док.ТекущийДокумент()), 1) ;
 Если ВидДок <> "" Тогда
     RSподч.УстПараметр(2, МетаДата.ИДДокумента(ВидДок)) ;
    КонецЕсли;  
 RSподч.УстПараметр(3, ?(УдПров=2,1,0)) ;
 ТЗ = RSподч.ВыполнитьИнструкцию(ТекстЗапроса);
    Если  ПустоеЗначение(ТЗ) = 1 Тогда
  Возврат 0;
 Иначе
     ТЗ.ВыбратьСтроки();
     Пока ТЗ.ПолучитьСтроку() = 1 Цикл
         ТЗЗапрос.НоваяСтрока();
         ТЗЗапрос.Документ=МетаДата.ЗначениеИзСтрокиБД(12,ТЗ.ВидДокумента,ТЗ.ИдДокумента);
     КонецЦикла;
     RSподч.Закрыть();
     Возврат ТЗЗапрос;
 КонецЕсли; 
КонецФункции

 

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Артур Аюханов (artbear) 26.05.11 10:53
Почему не указано, что только для СКЛ?
2. Vitalya Гуляев (Vix) 26.05.11 11:09
3. Сергей Пшеничников (Зеленоград) 27.11.15 13:01
Спасибо, буду использовать. Скорость сравнивал?
4. Vitalya Гуляев (Vix) 08.01.16 16:57
(3) Зеленоград, Давно это было, но скорость в десятки раз была выше стандартных запросов 1С
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа