Имя: Пароль:
1C
1C 7.7
v7: ЗиК 77 SQL: 1C++ и ВыбратьПодчиненныеДокументы()
0 егаис
 
08.10.14
13:57
Добрый день. Впервые сталкиваюсь с 1с++, необходимо оптимизировать ВыбратьПодчиненныеДокументы в базе ЗиК, т.к. ужасные тормоза при начислении з/п.
Что сделал,
1.подключил 1С++
2.добавил переменные
Перем Сервис1С, Запрос1С;
их надо описывать?????
3. добавить функцию
Функция глВыбратьПодчиненныеДокументы(ДатаНач,ДатаКон,Док,ТипДок="",Проведен="") Экспорт
    СкульЗапрос="
    |SELECT
    | TabJ.IDDOC,
    | TabJ.IDDOCDEF
    |FROM
    | _1SCRDOC As TabRod(NOLOCK)
    |INNER JOIN
    | _1SJOURN As TabJ(NOLOCK) ON (TabRod.CHILDID = TabJ.IDDOC)
    |WHERE
    | TabRod.MDID = 0 -- только документы, без граф отбора
    | AND TabRod.PARENTVAL = '"+Сервис1С.ЗначениеВСамуюДлиннуюСтрокуБД(Док.ТекущийДокумент())+"'
    |";
    Если ПустоеЗначение(ДатаНач)=0 Тогда
        СкульЗапрос=СкульЗапрос+"
        |and DATE_TIME_IDDOC>='"+Сервис1С.ПолучитьСтрИзДаты(ДатаНач)+"'
        |";
    КонецЕсли;
    Если ПустоеЗначение(ДатаКон)=0 Тогда
        СкульЗапрос=СкульЗапрос+"
        |and DATE_TIME_IDDOC<'"+Сервис1С.ПолучитьСтрИзДаты(ДатаКон+1)+"'
        |";
    КонецЕсли;
    Если ТипДок<>"" Тогда
        СкульЗапрос=СкульЗапрос+"
        |and IDDOCDEF='"+Сервис1С.ИДДокумента(ТипДок)+"'
        |";
    КонецЕсли;
    Если Проведен=1 Тогда
        СкульЗапрос=СкульЗапрос+"
        |and CLOSED=1
        |";
    КонецЕсли;
    СкульЗапрос=СкульЗапрос+"
    |ORDER BY
    |TabRod.CHILD_DATE_TIME_IDDOC
    |";
    ТЗЗапрос =СоздатьОбъект("ТаблицаЗначений");
    ТЗ =СоздатьОбъект("ТаблицаЗначений");
    ТЗ.НоваяКолонка("Док");
    Запрос1С.Подготовить(СкульЗапрос);
    Если Запрос1С.Открыть()=1 Тогда
        Запрос1С.ПолучитьРезультатыВ_ТЗ(ТЗЗапрос,1);
        ТЗЗапрос.ВыбратьСтроки();
        Пока ТЗЗапрос.ПолучитьСтроку() = 1 Цикл
            ТЗ.НоваяСтрока();
            ТЗ.Док=Сервис1С.ЗначениеИзСтрокиБД(12,ТЗЗапрос.IDDOCDEF,ТЗЗапрос.IDDOC);
        КонецЦикла;
        Запрос1С.Закрыть();
        Возврат ТЗ;
    Иначе
        Возврат 0;
    КонецЕсли;
КонецФункции

4. изменил стандартную глДокументФункционирует на
Функция глДокументФункционирует(Документ,ОтменяющийДокумент="") Экспорт

    // если документ не проведен - он не функционирует
    Если Документ.Проведен()=0 Тогда
        Возврат 0
    КонецЕсли;
    
    ВидДокумента = Документ.Вид();
    ПодчиненныеДокументы = глВыбратьПодчиненныеДокументы('01.01.10', КонМесяца(Документ.ДатаДок), Документ, , 1);
    Если ПодчиненныеДокументы = 0 Тогда
        Возврат 0;
    КонецЕсли;

    ПодчиненныеДокументы.ВыбратьПодчиненныеДокументы(, Документ);
    Пока ПодчиненныеДокументы.ПолучитьДокумент()=1 Цикл
        
        Если ПодчиненныеДокументы.Проведен()=1 Тогда
            
            // если нашли документ-корректировку,
            // то проверяемый документ не действует
            Если ПодчиненныеДокументы.КорректируемыйДокумент=Документ Тогда
                ОтменяющийДокумент = ПодчиненныеДокументы.ТекущийДокумент();
                Возврат 0
                
                // если нашли документ-сторно,
                // то проверяемый документ не действует
            ИначеЕсли ПодчиненныеДокументы.Вид()="Сторно" Тогда
                Если ПодчиненныеДокументы.СторнируемыйДокумент=Документ Тогда
                    ОтменяющийДокумент = ПодчиненныеДокументы.ТекущийДокумент();
                    Возврат 0
                КонецЕсли;
                
            КонецЕсли;
            
        КонецЕсли;
        
    КонецЦикла;

    // все предыдущие проверки прошли неудачно
    // соотв. документ функционирует
    Возврат 1

КонецФункции    // глДокументФункционирует

5. В момент начисления з/п получаем ошибку
СкульЗапрос="
{Глобальный модуль(123)}: Значение не представляет агрегатный объект (ЗначениеВСамуюДлиннуюСтрокуБД)

Подскажите, люди добрые!
1 Ёпрст
 
гуру
08.10.14
14:01
(0)
Сервис1С = СоздатьОбъект("MetaDataWork");
2 Ёпрст
 
гуру
08.10.14
14:03
Запрос1С = СоздатьОбъект("ODBCRecordSet");
3 егаис
 
08.10.14
14:03
Епрст, благодарю. Пробую
4 Ёпрст
 
гуру
08.10.14
14:03
ну и.. запросы без типизации - в топку
5 егаис
 
08.10.14
14:05
ты имеешь в виду 4-ый параметр?
Туда передается тип документа родителя или типы подчиненных? пока не врубаюсь в методы
6 Ёпрст
 
гуру
08.10.14
14:08
(5) нет
имею ввиду вот этот кусок


Запрос1С.Подготовить(СкульЗапрос);
    Если Запрос1С.Открыть()=1 Тогда
        Запрос1С.ПолучитьРезультатыВ_ТЗ(ТЗЗапрос,1);
        ТЗЗапрос.ВыбратьСтроки();
        Пока ТЗЗапрос.ПолучитьСтроку() = 1 Цикл
            ТЗ.НоваяСтрока();
            ТЗ.Док=Сервис1С.ЗначениеИзСтрокиБД(12,ТЗЗапрос.IDDOCDEF,ТЗЗапрос.IDDOC);
        КонецЦикла;
        Запрос1С.Закрыть();

это всё надо выкинуть, воткнуть типизацию в текст запроса и просто ВыполнитьИнструкцию..
7 Serginio1
 
08.10.14
14:18
2 + 2 = 3.9999999999999999999999999999999...