Имя: Пароль:
1C
1C 7.7
v7: Отбор в прямом запросе
,
0 Альбатрос
 
18.04.13
09:34
Мужики, подскажите, что не так.

Было вот так и работало:

ТекстЗапроса = "INSERT INTO #tt1(f_0, f_1, f_2)
               |SELECT
               |    Клиенты.ID,
               |    ЮрЛица.ID,
               |    $Справочник.ЮрЛица.ТорговаяСеть
               |FROM
               |    $Справочник.ЮрЛица as ЮрЛица WITH(NOLOCK)
               |    INNER JOIN $Справочник.Клиенты as Клиенты WITH(NOLOCK)
               |        ON $Справочник.Клиенты.ЮрЛицо = ЮрЛица.ID
               |WHERE
               |    $Справочник.ЮрЛица.ТорговаяСеть = ?
               |AND
               |   $Справочник.Клиенты = ?
               |AND
               |   $Справочник.ЮрЛица = ?
               |";
глЗапросSQL.Подготовить(ТекстЗапроса);
Если глЗапросSQL.ПостроитьПараметры() = 1 Тогда
   глЗапросSQL.УстПараметр(1, Параметры.ТорговаяСеть);
КонецЕсли;
глЗапросSQL.ВыполнитьИнструкцию(ТекстЗапроса);


Добавил еще 2 условия и не работает... (((( без ошибок, но щаписей нет:

ТекстЗапроса = "INSERT INTO #tt1(f_0, f_1, f_2)
               |SELECT
               |    Клиенты.ID,
               |    ЮрЛица.ID,
               |    $Справочник.ЮрЛица.ТорговаяСеть
               |FROM
               |    $Справочник.ЮрЛица as ЮрЛица WITH(NOLOCK)
               |    INNER JOIN $Справочник.Клиенты as Клиенты WITH(NOLOCK)
               |        ON $Справочник.Клиенты.ЮрЛицо = ЮрЛица.ID
               |WHERE
               |    $Справочник.ЮрЛица.ТорговаяСеть = ?
               |AND
               |   $Справочник.Клиенты = ?
               |AND
               |   $Справочник.ЮрЛица = ?
               |";
глЗапросSQL.Подготовить(ТекстЗапроса);
Если глЗапросSQL.ПостроитьПараметры() = 1 Тогда
   глЗапросSQL.УстПараметр(1, Параметры.ТорговаяСеть);
   глЗапросSQL.УстПараметр(2, Параметры.ТорговаяТочка);
   глЗапросSQL.УстПараметр(3, Параметры.ЮрЛицо);
КонецЕсли;
глЗапросSQL.ВыполнитьИнструкцию(ТекстЗапроса);
1 Wobland
 
18.04.13
09:35
это два одинаковых куска текста?
2 spock
 
18.04.13
09:37
$Справочник.Клиенты = ?
$Справочник.ЮрЛица = ?

о_О
3 Альбатрос
 
18.04.13
09:38
(1) Сори, в первом вот так:

ТекстЗапроса = "INSERT INTO #tt1(f_0, f_1, f_2)
               |SELECT
               |    Клиенты.ID,
               |    ЮрЛица.ID,
               |    $Справочник.ЮрЛица.ТорговаяСеть
               |FROM
               |    $Справочник.ЮрЛица as ЮрЛица WITH(NOLOCK)
               |    INNER JOIN $Справочник.Клиенты as Клиенты WITH(NOLOCK)
               |        ON $Справочник.Клиенты.ЮрЛицо = ЮрЛица.ID
               |WHERE
               |    $Справочник.ЮрЛица.ТорговаяСеть = ?

               |";
глЗапросSQL.Подготовить(ТекстЗапроса);
Если глЗапросSQL.ПостроитьПараметры() = 1 Тогда
   глЗапросSQL.УстПараметр(1, Параметры.ТорговаяСеть);

КонецЕсли;
глЗапросSQL.ВыполнитьИнструкцию(ТекстЗапроса);
4 Альбатрос
 
18.04.13
09:39
(2) так низзя? =)
5 sapphire
 
18.04.13
09:39
|    $Справочник.ЮрЛица as ЮрЛица WITH(NOLOCK)

Здесь объявлен алиас таблицы $Справочник.ЮрЛица
стало быть   |    $Справочник.ЮрЛица.ТорговаяСеть = ?  - неверно, а условие
  |   $Справочник.Клиенты = ?
вообще бред ибо $Справочник.Клиенты - это таблица
6 spock
 
18.04.13
09:40
(4)можно, но работать не будет.
7 sapphire
 
18.04.13
09:41
(0) Было вот так и работало -
Не верю! (с)
8 sapphire
 
18.04.13
09:41
(6) Ну метаскулю - поровну, а вот СУБД - вряд ли :)
9 Mikeware
 
18.04.13
09:43
чойто я насторожился....
неужто бананан-2?
10 sapphire
 
18.04.13
09:43
// А если так?
ТекстЗапроса = "INSERT INTO #tt1(f_0, f_1, f_2)
               |SELECT
               |    Клиенты.ID,
               |    ЮрЛица.ID,
               |    $Справочник.ЮрЛица.ТорговаяСеть
               |FROM
               |    $Справочник.ЮрЛица as ЮрЛица WITH(NOLOCK)
               |    INNER JOIN $Справочник.Клиенты as Клиенты WITH(NOLOCK)
               |        ON $Справочник.Клиенты.ЮрЛицо = ЮрЛица.ID
               |WHERE

              |    $ЮрЛица.ТорговаяСеть = ?
              |AND
              |   Клиенты.ID = ?
               |AND
               |   ЮрЛица.ID = ?
               |";
глЗапросSQL.Подготовить(ТекстЗапроса);
Если глЗапросSQL.ПостроитьПараметры() = 1 Тогда
   глЗапросSQL.УстПараметр(1, Параметры.ТорговаяСеть);
   глЗапросSQL.УстПараметр(2, Параметры.ТорговаяТочка);
   глЗапросSQL.УстПараметр(3, Параметры.ЮрЛицо);
КонецЕсли;
глЗапросSQL.ВыполнитьИнструкцию(ТекстЗапроса);
11 sapphire
 
18.04.13
09:44
(9) Не, он до времянок и параметров врядли дошел.
Долбобей таки.
12 Альбатрос
 
18.04.13
09:45
(7) Клянусь! =)
13 Альбатрос
 
18.04.13
09:50
(10) не, так не пашет

Начало выгрузки:   18.04.13 13:50:59
Ошибка исполнения обработчика:  ПВД_ПередОбработкойПравила_ПродажиТовараНал
 - Недопустимое значение индекса параметра
Выгружено объектов:   0
Окончание выгрузки:   18.04.13 13:50:59
14 Альбатрос
 
18.04.13
09:53
Перед этим запросом еще такая штука есть:

ТекстЗапроса = "SELECT Existence = CASE COUNT(Id) WHEN 0 THEN 'НЕТ' WHEN 1 THEN 'ЕСТЬ' END
               |FROM tempdb..sysobjects WHERE id = object_id('tempdb..#tt1')";
Результат = глЗапросSQL.ВыполнитьИнструкцию(ТекстЗапроса);

Если Результат.ПолучитьЗначение(1,1) = "ЕСТЬ" Тогда
   ТекстЗапроса = "DROP TABLE #tt1";
   глЗапросSQL.ВыполнитьИнструкцию(ТекстЗапроса);
КонецЕсли;
15 Альбатрос
 
18.04.13
09:57
(10) Неее, втупляю, как раз так работает. Спасибо!!!
16 sapphire
 
18.04.13
09:57
ТекстЗапроса = "INSERT INTO #tt1(f_0, f_1, f_2) VALUES(?,?,?)";
17 sapphire
 
18.04.13
09:58
(15) Или тебе еще проверки нужны?
18 Альбатрос
 
18.04.13
09:59
Ради просвещения объясните, что происходит в этих строчках:
ТекстЗапроса = "SELECT Existence = CASE COUNT(Id) WHEN 0 THEN 'НЕТ' WHEN 1 THEN 'ЕСТЬ' END
               |FROM tempdb..sysobjects WHERE id = object_id('tempdb..#tt1')";
19 Альбатрос
 
18.04.13
09:59
(17) Нет, это все проверки =) еще раз спасибо!
20 sapphire
 
18.04.13
10:02
(14) ...
Я писал уже - ищи на просторахъ книжко Основы t-SQL.
Автор Ицик Бен-Ган.

ТекстЗапроса = "
               |IF OBJECT_ID('tempdb..#tt1') IS NOT NULL
               |DROP TABLE #tt1
               |CREATE TABLE #tt1(f_0 char(9), f_1 char(9), f_2 char(9))
               |INSERT INTO #tt1(f_0, f_1, f_2)
               |SELECT
               |    Клиенты.ID,
               |    ЮрЛица.ID,
               |    $Справочник.ЮрЛица.ТорговаяСеть
               |FROM
               |    $Справочник.ЮрЛица as ЮрЛица WITH(NOLOCK)
               |    INNER JOIN $Справочник.Клиенты as Клиенты WITH(NOLOCK)
               |        ON $Справочник.Клиенты.ЮрЛицо = ЮрЛица.ID
               |WHERE

              |    $ЮрЛица.ТорговаяСеть = ?
              |AND
              |   Клиенты.ID = ?
               |AND
               |   ЮрЛица.ID = ?
               |";
глЗапросSQL.Подготовить(ТекстЗапроса);
Если глЗапросSQL.ПостроитьПараметры() = 1 Тогда
   глЗапросSQL.УстПараметр(1, Параметры.ТорговаяСеть);
   глЗапросSQL.УстПараметр(2, Параметры.ТорговаяТочка);
   глЗапросSQL.УстПараметр(3, Параметры.ЮрЛицо);
КонецЕсли;
глЗапросSQL.ВыполнитьИнструкцию(ТекстЗапроса);
21 sapphire
 
18.04.13
10:02
(18) ФИгня. Так никто не пишет
22 sapphire
 
18.04.13
10:03
(18) Проверка, что такая таблица уже существует.
23 Mikeware
 
18.04.13
10:03
(18) так вроде все написано. только сомнения в адекватности писавшего это возникают...
24 sapphire
 
18.04.13
10:05
(23) или я уже привык, или принято такъ:
|IF OBJECT_ID('tempdb..#tt1') IS NOT NULL
|DROP TABLE #tt1
|CREATE TABLE #tt1(f_0 char(9), f_1 char(9), f_2 char(9))
25 Альбатрос
 
18.04.13
10:06
(22) Типо если такая временная таблица существует, он ее уничтожает и создает заново. Ясненько...
Книжку уже качаю, спасибо в третий раз =)
26 sapphire
 
18.04.13
10:09
(25) Вообще нахрена такой сыр-бор с join-ами, если речь об операции вставки во времянку.
ИМХается мне, что там быдлокод внутри :(
27 Mikeware
 
18.04.13
10:11
(24) дык нафига 1 или 0 переводить в "есть" или "нет"?
и потом сравнивать с "есть"...
28 sapphire
 
18.04.13
10:14
(25) Грубо, если проверять платформой параметры, то запрос вообще вырождается в :
|IF OBJECT_ID('tempdb..#tt1') IS NOT NULL
|DROP TABLE #tt1
|CREATE TABLE #tt1(f_0 char(9), f_1 char(9), f_2 char(9))
|INSERT INTO #tt1(f_0, f_1, f_2) VALUES(?,?,?)

Тогда ясно, что ,скорее всего, код на стороне 1С неоптимален, ибо есть инструкция типа (точно не воспроизведу)  ВыполнитьSQL_ИзТЗ
29 Альбатрос
 
18.04.13
10:19
(26) Могу выложить, если глаз не жалко =)
30 Альбатрос
 
18.04.13
10:19
(27) совершенно согласен
31 Альбатрос
 
18.04.13
10:20
+(29) там дальше вообще ахинея полная ))) Но работает )))
32 sapphire
 
18.04.13
10:26
(29) Ну выложи, мы и не такое видали :)
33 Альбатрос
 
18.04.13
10:30
(32) Сами напросились)))


// выборка всех клиентов торговой сети во временную таблицу #tt1
// Реквизиты:
// Клиент, ЮрЛицо, ТорговаяСеть
//
Состояние("выборка всех клиентов торговой сети...");

ТекстЗапроса = "SELECT Existence = CASE COUNT(Id) WHEN 0 THEN 'НЕТ' WHEN 1 THEN 'ЕСТЬ' END
               |FROM tempdb..sysobjects WHERE id = object_id('tempdb..#tt1')";
Результат = глЗапросSQL.ВыполнитьИнструкцию(ТекстЗапроса);

Если Результат.ПолучитьЗначение(1,1) = "ЕСТЬ" Тогда
   ТекстЗапроса = "DROP TABLE #tt1";
   глЗапросSQL.ВыполнитьИнструкцию(ТекстЗапроса);
КонецЕсли;

ТекстЗапроса = "CREATE TABLE #tt1(f_0 CHAR(9), f_1 CHAR(9), f_2 CHAR(9))";
глЗапросSQL.ВыполнитьИнструкцию(ТекстЗапроса);

ТекстЗапроса = "INSERT INTO #tt1(f_0, f_1, f_2)
               |SELECT
               |    Клиенты.ID,
               |    ЮрЛица.ID,
               |    $Справочник.ЮрЛица.ТорговаяСеть
               |FROM
               |    $Справочник.ЮрЛица as ЮрЛица WITH(NOLOCK)
               |    INNER JOIN $Справочник.Клиенты as Клиенты WITH(NOLOCK)
               |        ON $Справочник.Клиенты.ЮрЛицо = ЮрЛица.ID
               |WHERE
               |    $ЮрЛица.ТорговаяСеть = ?";
               
               Если ПустоеЗначение(Параметры.ТорговаяТочка) = 0 тогда
                    ТекстЗапроса = ТекстЗапроса+ "AND
                                                 |   Клиенты.ID = ?";

               КонецЕсли;    
                                             
               Если ПустоеЗначение(Параметры.ЮрЛицо) = 0 тогда
                    ТекстЗапроса = ТекстЗапроса+ "AND
                                                 |   ЮрЛица.ID = ?";

               КонецЕсли;    
               
               
               
   глЗапросSQL.Подготовить(ТекстЗапроса);
Если глЗапросSQL.ПостроитьПараметры() = 1 Тогда
   глЗапросSQL.УстПараметр(1, Параметры.ТорговаяСеть);
   Если ПустоеЗначение(Параметры.ТорговаяТочка) = 0 тогда
   глЗапросSQL.УстПараметр(2, Параметры.ТорговаяТочка);
   КонецЕсли;
   Если ПустоеЗначение(Параметры.ТорговаяТочка) = 0 тогда
   глЗапросSQL.УстПараметр(3, Параметры.ЮрЛицо);
   КонецЕсли;

глЗапросSQL.ВыполнитьИнструкцию(ТекстЗапроса);

// выборка всех документов отгрузки по клиентам торговой сети "К100" во временную таблицу #tt2
// Реквизиты:
// Ссылка, Дата, Номер, Клиент, Фирма, Склад
//
Состояние("выборка всех документов отгрузки по клиентам торговой сети...");

ТекстЗапроса = "SELECT Existence = CASE COUNT(Id) WHEN 0 THEN 'НЕТ' WHEN 1 THEN 'ЕСТЬ' END
               |FROM tempdb..sysobjects WHERE id = object_id('tempdb..#tt2')";
Результат = глЗапросSQL.ВыполнитьИнструкцию(ТекстЗапроса);

Если Результат.ПолучитьЗначение(1,1) = "ЕСТЬ" Тогда
   ТекстЗапроса = "DROP TABLE #tt2";
   глЗапросSQL.ВыполнитьИнструкцию(ТекстЗапроса);
КонецЕсли;

ТекстЗапроса = "CREATE TABLE #tt2(f_0 CHAR(9), f_1 DATETIME, f_2 CHAR(13), f_3 CHAR(9), f_4 CHAR(9), f_5 CHAR(9))";
глЗапросSQL.ВыполнитьИнструкцию(ТекстЗапроса);

ТекстЗапроса = "INSERT INTO #tt2(f_0, f_1, f_2, f_3, f_4, f_5)
               |SELECT
               |    Журнал.IDDOC,
               |    CAST(LEFT(Журнал.DATE_TIME_IDDOC, 8) AS DATETIME),
               |    Журнал.DOCNO,
               |    Журнал.SP1165,
               |    Журнал.SP1005,
               |    $Документ.РасходнаяКредит.Склад
               |FROM
               |    _1SJOURN as Журнал WITH(NOLOCK)
               |    INNER JOIN #tt1 as Клиенты
               |        ON Клиенты.f_0 = Журнал.SP1165
               |    INNER JOIN $Документ.РасходнаяКредит as РасходнаяКредит WITH(NOLOCK)
               |        ON РасходнаяКредит.IDDOC = Журнал.IDDOC
               |WHERE
               |    CAST(LEFT(Журнал.DATE_TIME_IDDOC, 8) AS DATETIME) BETWEEN ? AND ?
               |";
глЗапросSQL.Подготовить(ТекстЗапроса);
Если глЗапросSQL.ПостроитьПараметры() = 1 Тогда
   глЗапросSQL.УстПараметр(1, ДатаНачала);    
   глЗапросSQL.УстПараметр(2, ДатаОкончания);
КонецЕсли;    

глЗапросSQL.ВыполнитьИнструкцию(ТекстЗапроса);

// выборка всех ценников торговой сети в отдельную таблицу #tt3
// Реквизиты:
// Ссылка, Контрагент, Дата, ПозицияДокумента
//
Состояние("выборка всех ценников торговой сети");

ТекстЗапроса = "SELECT Existence = CASE COUNT(Id) WHEN 0 THEN 'НЕТ' WHEN 1 THEN 'ЕСТЬ' END
               |FROM tempdb..sysobjects WHERE id = object_id('tempdb..#tt3')";
Результат = глЗапросSQL.ВыполнитьИнструкцию(ТекстЗапроса);

Если Результат.ПолучитьЗначение(1,1) = "ЕСТЬ" Тогда
   ТекстЗапроса = "DROP TABLE #tt3";
   глЗапросSQL.ВыполнитьИнструкцию(ТекстЗапроса);
КонецЕсли;

ТекстЗапроса = "CREATE TABLE #tt3(f_0 CHAR(9), f_1 CHAR(9), f_2 DATETIME, f_3 CHAR(23))";
глЗапросSQL.ВыполнитьИнструкцию(ТекстЗапроса);

ТекстЗапроса = "INSERT INTO #tt3(f_0, f_1, f_2, f_3)
               |SELECT DISTINCT
               |    Ценники.IDDOC,
               |    RIGHT($Документ.Ценники.Контрагент, 9),
               |    CONVERT(DATETIME, LEFT(Журнал.DATE_TIME_IDDOC, 8), 12),
               |    Журнал.DATE_TIME_IDDOC
               |FROM
               |    $Документ.Ценники as Ценники WITH(NOLOCK)
               |    INNER JOIN #tt1 as Клиенты
               |        ON Клиенты.f_0 = RIGHT($Документ.Ценники.Контрагент, 9) OR Клиенты.f_1 = RIGHT($Документ.Ценники.Контрагент, 9)
               |            OR Клиенты.f_2 = RIGHT($Документ.Ценники.Контрагент, 9)
               |    INNER JOIN _1SJOURN as Журнал WITH(NOLOCK)
               |        ON Журнал.IDDOC = Ценники.IDDOC
               |";
глЗапросSQL.ВыполнитьИнструкцию(ТекстЗапроса);

// на дату каждого документа отгрузки нужно найти по одному ближайшему
// по дате "слева" ценнику по клиенту, юрлицу и торговой сети #tt4
// Реквизиты:
// Ссылка, ПозицияЦенникаПоКлиенту, ПозицияЦенникаПоЮрЛицу, ПозицияЦенникаПоТС
//
Состояние("поиск ценников на документы отгрузки");

ТекстЗапроса = "SELECT Existence = CASE COUNT(Id) WHEN 0 THEN 'НЕТ' WHEN 1 THEN 'ЕСТЬ' END
               |FROM tempdb..sysobjects WHERE id = object_id('tempdb..#tt4')";
Результат = глЗапросSQL.ВыполнитьИнструкцию(ТекстЗапроса);

Если Результат.ПолучитьЗначение(1,1) = "ЕСТЬ" Тогда
   ТекстЗапроса = "DROP TABLE #tt4";
   глЗапросSQL.ВыполнитьИнструкцию(ТекстЗапроса);
КонецЕсли;

ТекстЗапроса = "CREATE TABLE #tt4(f_0 CHAR(9), f_1 CHAR(23), f_2 CHAR(23), f_3 CHAR(23))";
глЗапросSQL.ВыполнитьИнструкцию(ТекстЗапроса);

ТекстЗапроса = "INSERT INTO #tt4(f_0, f_1, f_2, f_3)
               |SELECT
               |    ВложЗапрос.Ссылка,
               |    MAX(ЦенникиПоКлиенту),
               |    MAX(ЦенникиПоЮрЛицу),
               |    MAX(ЦенникиПоТС)
               |FROM
               |    (SELECT
               |        Документ.Ссылка,
               |        ЦенникиПоКлиенту.f_3 as ЦенникиПоКлиенту,
               |        ЦенникиПоЮрЛицу.f_3 as ЦенникиПоЮрЛицу,
               |        ЦенникиПоТС.f_3 as ЦенникиПоТС
               |    FROM
               |         (SELECT
               |            Клиенты.f_0 as Клиент,
               |            Клиенты.f_1 as ЮрЛицо,
               |            Клиенты.f_2 as ТС,
               |            РасходнаяКредит.f_0 as Ссылка,
               |            РасходнаяКредит.f_1 as Дата
               |        FROM
               |            #tt2 as РасходнаяКредит
               |            INNER JOIN #tt1 as Клиенты
               |            ON Клиенты.f_0 = РасходнаяКредит.f_3
               |        ) as Документ
               |    LEFT JOIN #tt3 as ЦенникиПоКлиенту
               |        ON ЦенникиПоКлиенту.f_1 = Документ.Клиент AND ЦенникиПоКлиенту.f_2 <= Документ.Дата
               |    LEFT JOIN #tt3 as ЦенникиПоЮрЛицу
               |        ON ЦенникиПоЮрЛицу.f_1 = Документ.ЮрЛицо AND ЦенникиПоЮрЛицу.f_2 <= Документ.Дата
               |    LEFT JOIN #tt3 as ЦенникиПоТС
               |        ON ЦенникиПоТС.f_1 = Документ.ТС AND ЦенникиПоТС.f_2 <= Документ.Дата
               |    ) as ВложЗапрос
               |GROUP BY
               |    ВложЗапрос.Ссылка";
глЗапросSQL.ВыполнитьИнструкцию(ТекстЗапроса);

// выборка всех ценников по документам отгрузки по клиентам торговой сети "К100" во
// временную таблицу #tt5
// Реквизиты:
// СсылкаДокументОтгрузки, СсылкаЦенник
//

Состояние("определение вида ценника по документу отгрузки");

ТекстЗапроса = "SELECT Existence = CASE COUNT(Id) WHEN 0 THEN 'НЕТ' WHEN 1 THEN 'ЕСТЬ' END
               |FROM tempdb..sysobjects WHERE id = object_id('tempdb..#tt5')";
Результат = глЗапросSQL.ВыполнитьИнструкцию(ТекстЗапроса);

Если Результат.ПолучитьЗначение(1,1) = "ЕСТЬ" Тогда
   ТекстЗапроса = "DROP TABLE #tt5";
   глЗапросSQL.ВыполнитьИнструкцию(ТекстЗапроса);
КонецЕсли;

ТекстЗапроса = "CREATE TABLE #tt5(f_0 CHAR(9), f_1 CHAR(9))";
глЗапросSQL.ВыполнитьИнструкцию(ТекстЗапроса);

ТекстЗапроса = "INSERT INTO #tt5(f_0, f_1)
               |SELECT
               |    ЦенникиПоДокументамОтгрузки.f_0,
               |    CASE
               |        WHEN ЦенникиПоКлиенту_Шапка.SP7164 = 0 THEN ЦенникиПоКлиенту_Шапка.IDDOC
               |        WHEN ЦенникиПоЮрЛицу_Шапка.SP7164 = 0 THEN ЦенникиПоЮрЛицу_Шапка.IDDOC
               |        WHEN ЦенникиПоТС_Шапка.SP7164 = 0 THEN ЦенникиПоТС_Шапка.IDDOC
               |        ELSE NULL
               |    END
               |FROM
               |    #tt4 as ЦенникиПоДокументамОтгрузки
               |    LEFT JOIN #tt3 as ЦенникиПоКлиенту
               |        ON ЦенникиПоКлиенту.f_3 = ЦенникиПоДокументамОтгрузки.f_1
               |    LEFT JOIN $Документ.Ценники as ЦенникиПоКлиенту_Шапка WITH(NOLOCK)
               |        ON ЦенникиПоКлиенту_Шапка.IDDOC = ЦенникиПоКлиенту.f_0
               |    LEFT JOIN #tt3 as ЦенникиПоЮрЛицу
               |        ON ЦенникиПоЮрЛицу.f_3 = ЦенникиПоДокументамОтгрузки.f_2
               |    LEFT JOIN $Документ.Ценники as ЦенникиПоЮрЛицу_Шапка WITH(NOLOCK)
               |        ON ЦенникиПоЮрЛицу_Шапка.IDDOC = ЦенникиПоЮрЛицу.f_0
               |    LEFT JOIN #tt3 as ЦенникиПоТС
               |        ON ЦенникиПоТС.f_3 = ЦенникиПоДокументамОтгрузки.f_3
               |    LEFT JOIN $Документ.Ценники as ЦенникиПоТС_Шапка WITH(NOLOCK)
               |        ON ЦенникиПоТС_Шапка.IDDOC = ЦенникиПоТС.f_0
               |";
глЗапросSQL.ВыполнитьИнструкцию(ТекстЗапроса);

// выборка всех табличных частей документов отгрузки по клиентам (на основе оборотов
// регистра "продажи") во временную таблицу #tt6
// Реквизиты:
// Ссылка, Товар, ГТД, Импортер, Количество, Сумма
//

Состояние("формирование табличной части документов");

ТекстЗапроса = "SELECT Existence = CASE COUNT(Id) WHEN 0 THEN 'НЕТ' WHEN 1 THEN 'ЕСТЬ' END
               |FROM tempdb..sysobjects WHERE id = object_id('tempdb..#tt61')";
Результат = глЗапросSQL.ВыполнитьИнструкцию(ТекстЗапроса);

Если Результат.ПолучитьЗначение(1,1) = "ЕСТЬ" Тогда
   ТекстЗапроса = "DROP TABLE #tt61";
   глЗапросSQL.ВыполнитьИнструкцию(ТекстЗапроса);
КонецЕсли;

ТекстЗапроса = "CREATE TABLE #tt61(f_0 CHAR(9), f_1 CHAR(9), f_2 CHAR(13), f_3 NUMERIC(19,2), f_4 NUMERIC(19,2))";
глЗапросSQL.ВыполнитьИнструкцию(ТекстЗапроса);

ТекстЗапроса = "INSERT INTO #tt61(f_0, f_1, f_2, f_3, f_4)
               |SELECT
               |    Продажи.IDDOC,
               |    Продажи.SP4877,
               |    Продажи.SP4876,
               |    Продажи.SP4878,
               |    Продажи.SP4879
               |FROM
               |    #tt2 as РасходнаяКредит_Шапка
               |    INNER JOIN DT410 as РасходнаяКредит_ТабЧасть WITH(NOLOCK)
               |        ON РасходнаяКредит_ТабЧасть.IDDOC = РасходнаяКредит_Шапка.f_0
               |    INNER JOIN RA4872 as Продажи WITH(NOLOCK)
               |    ON Продажи.IDDOC = РасходнаяКредит_ТабЧасть.IDDOC
               |        AND Продажи.SP4877 = РасходнаяКредит_ТабЧасть.SP423
               |";
глЗапросSQL.ВыполнитьИнструкцию(ТекстЗапроса);

ТекстЗапроса = "SELECT Existence = CASE COUNT(Id) WHEN 0 THEN 'НЕТ' WHEN 1 THEN 'ЕСТЬ' END
               |FROM tempdb..sysobjects WHERE id = object_id('tempdb..#tt6')";
Результат = глЗапросSQL.ВыполнитьИнструкцию(ТекстЗапроса);

Если Результат.ПолучитьЗначение(1,1) = "ЕСТЬ" Тогда
   ТекстЗапроса = "DROP TABLE #tt6";
   глЗапросSQL.ВыполнитьИнструкцию(ТекстЗапроса);
КонецЕсли;

ТекстЗапроса = "CREATE TABLE #tt6(f_0 CHAR(9), f_1 CHAR(9), f_2 CHAR(500), f_3 CHAR(9), f_4 NUMERIC(19,2), f_5 NUMERIC(19,2))";
глЗапросSQL.ВыполнитьИнструкцию(ТекстЗапроса);

ТекстЗапроса = "INSERT INTO #tt6(f_0, f_1, f_2, f_3, f_4, f_5)
               |SELECT
               |    tab1.f_0,
               |    tab1.f_1,
               |    ПриходДатыРозлива_ТабЧасть.SP3229,
               |    ПриходДатыРозлива_ТабЧасть.SP7031,
               |    SUM(tab1.f_3),
               |    SUM(tab1.f_4)
               |FROM
               |    #tt61 as tab1
               |    LEFT JOIN(SELECT
               |        Продажи.f_0,
               |        Продажи.f_1,
               |        Продажи.f_2,
               |        ПриходДатыРозлива_ТабЧасть.IDDOC as IDDOC,
               |        MIN(ПриходДатыРозлива_ТабЧасть.LINENO_) as LINENO_
               |    FROM
               |        #tt61 as Продажи
               |        INNER JOIN $Документ.ПриходДатыРозлива as ПриходДатыРозлива_Шапка WITH(NOLOCK)
               |            ON $Документ.ПриходДатыРозлива.ДокументОснование = Продажи.f_2
               |        INNER JOIN DT2166 as ПриходДатыРозлива_ТабЧасть WITH(NOLOCK)
               |            ON ПриходДатыРозлива_ТабЧасть.IDDOC = ПриходДатыРозлива_Шапка.IDDOC
               |                AND ПриходДатыРозлива_ТабЧасть.SP2162 = Продажи.f_1
               |    GROUP BY
               |        Продажи.f_0,
               |        Продажи.f_1,
               |        Продажи.f_2,
               |        ПриходДатыРозлива_ТабЧасть.IDDOC) as tab2
               |        ON tab2.f_0 = tab1.f_0 AND tab2.f_1 = tab1.f_1 AND tab2.f_2 = tab1.f_2
               |    LEFT JOIN DT2166 as ПриходДатыРозлива_ТабЧасть WITH(NOLOCK)
               |        ON ПриходДатыРозлива_ТабЧасть.IDDOC = tab2.IDDOC
               |            AND ПриходДатыРозлива_ТабЧасть.LINENO_ = tab2.LINENO_
               |GROUP BY
               |    tab1.f_0,
               |    tab1.f_1,
               |    ПриходДатыРозлива_ТабЧасть.SP3229,
               |    ПриходДатыРозлива_ТабЧасть.SP7031
               |";
глЗапросSQL.ВыполнитьИнструкцию(ТекстЗапроса);

// соединение "шапки" и табличной части документов отгрузки в запросе с итогами по
// документу отгрузки - результирующий запрос
// Реквизиты:
// Ссылка, Дата, Номер, Клиент, Фирма, Склад, СуммаДокумента / Товар, Количество, Цена,
// Сумма, СсылкаПрихода, НомерСтрокиПрихода
//

Состояние("выборка документов");

ТекстЗапроса = "SELECT
               |    f_0   [Документ $Документ.РасходнаяКредит],
               |    f_00  [Ценник $Документ.Ценники],
               |    f_1   [Товар $Справочник.Товары],
               |    f_2   as ГТД,
               |    f_3   [Импортер $Справочник.Импортеры],
               |    f_4   as Количество,
               |    f_5   as Сумма,
               |    level as УровеньГруппировки
               |FROM
               |    (SELECT
               |        f_0,
               |        '' as f_00,
               |        f_1,
               |        f_2,
               |        f_3,
               |        f_4,
               |        f_5,
               |        2 as level
               |    FROM
               |        #tt6
               |        UNION ALL
               |    SELECT
               |        tab1.f_0,
               |        tab2.f_1 as f_00,
               |        '' as f_1,
               |        '' as f_2,
               |        '' as f_3,
               |        0 as f_4,
               |        SUM(tab1.f_5) as f_5,
               |        1 as level
               |    FROM
               |        #tt6 as tab1
               |        LEFT JOIN #tt5 as tab2
               |            ON tab2.f_0 = tab1.f_0
               |    GROUP BY
               |        tab1.f_0, tab2.f_1) as Ins
               |ORDER BY
               |    f_0,
               |    f_1
               |    ";
Попытка                
   Результат = глЗапросSQL.ВыполнитьИнструкцию(ТекстЗапроса);
Исключение    
   Сообщить(глЗапросSQL.ПолучитьОписаниеОшибки());
   Отказ = 1;
   Возврат 0;
КонецПопытки;

ВыборкаДанных = СоздатьОбъект("ТаблицаЗначений");
ВыборкаДанных.НоваяКолонка("алкЛицензия");
ВыборкаДанных.НоваяКолонка("алкСкладКонтрагента");
ВыборкаДанных.НоваяКолонка("ВалютаДокумента");
ВыборкаДанных.НоваяКолонка("ДатаВходящегоДокумента");
ВыборкаДанных.НоваяКолонка("ДоговорКонтрагента");
ВыборкаДанных.НоваяКолонка("Контрагент");
ВыборкаДанных.НоваяКолонка("НомерВходящегоДокумента");
ВыборкаДанных.НоваяКолонка("Организация");
ВыборкаДанных.НоваяКолонка("Подразделение");
ВыборкаДанных.НоваяКолонка("Склад");
ВыборкаДанных.НоваяКолонка("СуммаДокумента");
ВыборкаДанных.НоваяКолонка("Дата");
ВыборкаДанных.НоваяКолонка("ПометкаУдаления");
ВыборкаДанных.НоваяКолонка("Товары");
ВыборкаДанных.НоваяКолонка("алкИдентификатор");
ВыборкаДанных.НоваяКолонка("Проведен");

Накладные = СоздатьОбъект("Документ.РасходнаяКредит");
Ценники = СоздатьОбъект("Документ.Ценники");

Результат.ВыбратьСтроки();
Пока Результат.ПолучитьСтроку() = 1 Цикл
   УровеньГруппировки = Результат.УровеньГруппировки;
   Если УровеньГруппировки = 1 Тогда
       Накладная = Результат.Документ;
       Состояние("обработка документа " + Накладная);
       Если Накладные.НайтиДокумент(Накладная) = 0 Тогда
           Сообщить("ошибка обмена данных - не найден документ");
           Отказ = 1;
           Возврат 0;
       КонецЕсли;
       
       // ценники
       ТзТовары = СоздатьОБъект("ТаблицаЗначений");    
       ТзТовары.НоваяКолонка("Товар");
       ТзТовары.НоваяКолонка("ЦенаРозн");
       ТзТовары.НоваяКолонка("МинЦена");
       
       СпсТовары = СоздатьОБъект("СписокЗначений");
       Накладные.ВыгрузитьТабличнуюЧасть(СпсТовары,"Товар");
       ТзТов = СоздатьОБъект("ТаблицаЗначений");
       Накладные.ВыгрузитьТабличнуюЧасть(ТзТов);
       
       //--------------------------------        
       ПараметрыЦенников = СоздатьОБъект("СписокЗначений");
       ПараметрыЦенников.Установить("Дата",Накладная.ДатаДок);
       ПараметрыЦенников.Установить("Документ",Накладная);
       ПараметрыЦенников.Установить("Спецификация",1); //что печатать
       ПараметрыЦенников.Установить("Ценник",1); //что печатать
       ПараметрыЦенников.Установить("ТаблицаДокумента",ТзТов); //передаем документ, как таблицу
       ПараметрыЦенников.Установить("#Действие","Таблица");    //чтоб вернула таблицу с ценниками
       ПараметрыЦенников.Установить("ВыходнаяТаблица","");     //сюда возвращает таблицу с ценниками
       глОткрытьВнешнююОбработкуОтчет("Ценник",,0,ПараметрыЦенников);
       
       ТЗВозвр = ПараметрыЦенников.ПолучитьЗначение(7,"ВыходнаяТаблица");
       Если ТипЗначенияСтр(ТЗВозвр)="ТаблицаЗначений" Тогда
           Если СпсТовары.РазмерСписка()>0 Тогда
               Для Сч = 1 по СпсТовары.РазмерСписка() Цикл
                           ТзТовары.НоваяСтрока();
                           ТзТовары.Товар = СпсТовары.ПолучитьЗначение(Сч);
                           м="";
                   Если ТЗВозвр.НайтиЗначение(СпсТовары.ПолучитьЗначение(Сч),м,"Товар")=1 Тогда
                       ТЗВозвр.ПолучитьСтрокуПоНомеру(м);
                       ТзТовары.ЦенаРозн=Число(ТЗВозвр.Ценник);
                       ТзТовары.МинЦена = Число(ТЗВозвр.МинЦена);
                   КонецЕсли;
               КонецЦикла;
           КонецЕсли;
       КонецЕсли;
       //--------------------------------
       
       ВыборкаДанных.НоваяСтрока();
       Фирма = Накладные.Фирма;
       Фирма.ИспользоватьДату(Накладные.ДатаДок);
       ВыборкаДанных.алкЛицензия = Фирма.Лицензия;
       ВыборкаДанных.алкСкладКонтрагента = Накладные.Склад;
       ВыборкаДанных.ВалютаДокумента = Накладные.Валюта;
       ВыборкаДанных.ДатаВходящегоДокумента = Дата(ДатаГод(Накладные.ДатаДок),
           ДатаМесяц(Накладные.ДатаДок), ДатаЧисло(Накладные.ДатаДок));
       ВыборкаДанных.алкИдентификатор = Накладные.Идентификатор;    
       ВыборкаДанных.Контрагент = Фирма;
       ВыборкаДанных.НомерВходящегоДокумента = Накладные.НомерДок;
       Клиент = Накладные.Клиент;
       ДоговорКонтрагента = СоздатьОбъект("СписокЗначений");    
       ДоговорКонтрагента.ДобавитьЗначение(Накладные.Валюта, "ВалютаВзаиморасчетов");
       ДоговорКонтрагента.ДобавитьЗначение("ПоДоговоруВЦелом", "ВедениеВзаиморасчетов");
       ДоговорКонтрагента.ДобавитьЗначение("СПоставщиком", "ВидДоговора");
       ДоговорКонтрагента.ДобавитьЗначение(Клиент.ЮрЛицо, "Организация");
       ДоговорКонтрагента.ДобавитьЗначение(Фирма, "Владелец");
       ДоговорКонтрагента.ДобавитьЗначение("Основной договор", "Наименование");
       ДоговорКонтрагента.ДобавитьЗначение(0, "ПометкаУдаления");
       ДоговорКонтрагента.ДобавитьЗначение(0, "ЭтоГруппа");    
       ВыборкаДанных.ДоговорКонтрагента = ДоговорКонтрагента;
       ВыборкаДанных.Организация = Клиент.ЮрЛицо;
       ВыборкаДанных.Подразделение = Клиент;
       ВыборкаДанных.Склад = Клиент;
       СуммаДокумента = Результат.Сумма;
       ВыборкаДанных.СуммаДокумента = СуммаДокумента;
       ВыборкаДанных.Дата = Накладные.ДатаДок;
       //ВыборкаДанных.Дата = ?(ПустоеЗначение(Накладные.ДатаДоставки)=0,
       //    Накладные.ДатаДоставки, Накладные.ДатаДок);
       ВыборкаДанных.ПометкаУдаления = Накладные.ПометкаУдаления();
       ВыборкаДанных.Проведен = Накладные.Проведен();
       ВыборкаДанных.Товары = СоздатьОбъект("ТаблицаЗначений");
       Товары = ВыборкаДанных.Товары;
       Товары.НоваяКолонка("ЕдиницаИзмерения");
       Товары.НоваяКолонка("Количество");
       Товары.НоваяКолонка("Номенклатура");
       Товары.НоваяКолонка("ПроцентРозничнойНаценки");
       Товары.НоваяКолонка("СерияНоменклатуры");
       Товары.НоваяКолонка("Сумма");
       Товары.НоваяКолонка("Цена");
       Товары.НоваяКолонка("ЦенаВРознице");
       Товары.НоваяКолонка("МинЦена");
   ИначеЕсли УровеньГруппировки = 2 Тогда
       Товары.НоваяСтрока();
       Товар = Результат.Товар;
       ЕдиницаИзмерения = СоздатьОбъект("СписокЗначений");
       ЕдиницаИзмерения.ДобавитьЗначение(Строка(Товар.БазоваяЕдиница), "Наименование");
       ЕдиницаИзмерения.ДобавитьЗначение(Товар.БазоваяЕдиница, "ЕдиницаПоКлассификатору");
       ЕдиницаИзмерения.ДобавитьЗначение(1, "Коэффициент");
       ЕдиницаИзмерения.ДобавитьЗначение(Товар, "Владелец");
       Товары.ЕдиницаИзмерения = ЕдиницаИзмерения;
       Количество = Результат.Количество;
       Товары.Количество = Количество;
       Товары.Номенклатура = Товар;
       НС = 0;
       тзТовары.НайтиЗначение(Товар, НС, "Товар");
       тзТовары.ПолучитьСтрокуПоНомеру(НС);    
       Товары.ПроцентРозничнойНаценки = "";
       Товары.ЦенаВРознице = тзТовары.ЦенаРозн;
       Товары.МинЦена = тзТовары.МинЦена;
       СерияНоменклатуры = СоздатьОбъект("СписокЗначений");
       Импортер = Результат.Импортер;
       ЮрЛицоИмпортера = Импортер.ЮрЛицо;
       ЮрЛицоИмпортера.ИспользоватьДату(Накладные.ДатаДок, 1);
       ПодрИмпортера = СоздатьОбъект("СписокЗначений");
       ПодрИмпортера.ДобавитьЗначение("", "Адрес");
       ПодрИмпортера.ДобавитьЗначение(ЮрЛицоИмпортера.КПП, "КПП");
       ПодрИмпортера.ДобавитьЗначение(ЮрЛицоИмпортера.КПП, "Наименование");
       ПодрИмпортера.ДобавитьЗначение(ЮрЛицоИмпортера, "Владелец");
       СерияНоменклатуры.ДобавитьЗначение(ПодрИмпортера, "алкПодразделениеИмпортера");
       Производитель = Товар.Производитель;
       ЮрЛицоПроизводителя = Производитель.ЮрЛицо;
       ЮрЛицоПроизводителя.ИспользоватьДату(Накладные.ДатаДок, 1);
       ПодрПроизводителя = СоздатьОбъект("СписокЗначений");
       ПодрПроизводителя.ДобавитьЗначение(ЮрЛицоПроизводителя.Адрес, "Адрес");
       ПодрПроизводителя.ДобавитьЗначение(ЮрЛицоПроизводителя.КПП, "КПП");
       ПодрПроизводителя.ДобавитьЗначение(ЮрЛицоПроизводителя.КПП, "Наименование");
       ПодрПроизводителя.ДобавитьЗначение(ЮрЛицоПроизводителя, "Владелец");
       СерияНоменклатуры.ДобавитьЗначение(ПодрПроизводителя, "алкПодразделениеПроизводителя");
       СерияНоменклатуры.ДобавитьЗначение(Результат.ГТД, "НомерГТД");
       СерияНоменклатуры.ДобавитьЗначение(Результат.ГТД, "СерийныйНомер");
       СерияНоменклатуры.ДобавитьЗначение(Производитель.Страна, "СтранаПроисхождения");
       СерияНоменклатуры.ДобавитьЗначение(Товар, "Владелец");
       СерияНоменклатуры.ДобавитьЗначение(Результат.ГТД, "Наименование");
       Товары.СерияНоменклатуры = СерияНоменклатуры;
       Сумма = Результат.Сумма;
       Товары.Сумма = Сумма;
       Цена = Сумма / Количество;
       Товары.Цена = Цена;
       Товары.ПроцентРозничнойНаценки=(тзТовары.ЦенаРозн/Цена)*100-100;
   КонецЕсли;
КонецЦикла;
34 sapphire
 
18.04.13
10:46
(33) Смущает сей момент:
Если ПустоеЗначение(Параметры.ТорговаяТочка) = 0 тогда
   глЗапросSQL.УстПараметр(2, Параметры.ТорговаяТочка);
   КонецЕсли;
   Если ПустоеЗначение(Параметры.ТорговаяТочка) = 0 тогда
   глЗапросSQL.УстПараметр(3, Параметры.ЮрЛицо);
   КонецЕсли;
35 sapphire
 
18.04.13
10:49
(33) Видимо, либо печать ГТД, либо заполнение какой-то муйни.
В приницпе, коли работает - и ладно, коли нет -
убери эти конструкции:

ТекстЗапроса = "SELECT Existence = CASE COUNT(Id) WHEN 0 THEN 'НЕТ' WHEN 1 THEN 'ЕСТЬ' END
               |FROM tempdb..sysobjects WHERE id = object_id('tempdb..#tt6')";

Результат = глЗапросSQL.ВыполнитьИнструкцию(ТекстЗапроса);

Если Результат.ПолучитьЗначение(1,1) = "ЕСТЬ" Тогда
   ТекстЗапроса = "DROP TABLE #tt6";

   глЗапросSQL.ВыполнитьИнструкцию(ТекстЗапроса);
КонецЕсли;

ТекстЗапроса = "CREATE TABLE #tt6(f_0 CHAR(9), f_1 CHAR(9), f_2 CHAR(500), f_3 CHAR(9), f_4 NUMERIC(19,2), f_5 NUMERIC(19,2))";

глЗапросSQL.ВыполнитьИнструкцию(ТекстЗапроса);
36 Альбатрос
 
18.04.13
11:00
(34) Это я уже быдлокодил =) Очепятка.
(35) Работает, я и не трогаю))

Это модуль ПВД в правилах обмена
37 sapphire
 
18.04.13
11:10
(36) В принципе, лучше вынести во встроенную процедуру, ИМХО
38 Альбатрос
 
18.04.13
11:24
(37) Ну да, как вариант. Воспользуюсь советом =)
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс