![]() |
![]() |
![]() |
|
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
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |