Имя: Пароль:
1C
1С v8
Переменная 1С в sql запросе.
0 Menjoy
 
01.09.11
23:09
Здравствуйте.
Сегодня столкнулся с проблемой в запросе, сам запрос рабочий. Видимо, проблема в переменной которая в него передается.

Такой вот кусок кода есть в цикле:


        Если ДокТип = "11" Тогда
               Запрос3    = "
                       |SELECT
                       |    DOC.SUMMA AS GOODS_SUM,    
                       |    HDR.DATE_CREATE AS CR_DATE,
                       |    HDR.FULLNUMBER AS FULLNUMBER,
                       |    DSD.SUMMA_WORK AS WORKS_SUM,
                       |   ORG.FULLNAME AS ORG_NAME,
                       |    CL.FULLNAME AS CL_NAME,
                       |    CL.SHORTNAME AS CL_SHORTNAME,
                       |    CL.INN AS CL_INN,
                       |    CL.CLIENT_ID AS CL_ID,
                       |    TX.K_NDS AS K_NDS,
                       |    SUM(GI.COST1*GO.GOODS_COUNT) as COST
                       |FROM DOCUMENT_OUT DOC
                       |   LEFT JOIN DOCUMENT_OUT_HEADER HDR ON (DOC.DOCUMENT_OUT_ID = HDR.DOCUMENT_OUT_ID) AND (HDR.DOCUMENT_TYPE_ID = 11)
                       |    LEFT JOIN DOCUMENT_SERVICE_DETAIL DSD ON (HDR.DOCUMENT_OUT_HEADER_ID = DSD.DOCUMENT_OUT_HEADER_ID)
                       |    LEFT JOIN ORGANIZATION ORG ON (DOC.ORGANIZATION_ID = ORG.ORGANIZATION_ID)    
                       |    LEFT JOIN CLIENT CL ON (DOC.CLIENT_ID = CL.CLIENT_ID)
                       |    LEFT JOIN TAX TX ON (ORG.TAX_SCHEMES_ID = TX.TAX_SCHEMES_ID)
                       |    LEFT JOIN GOODS_OUT GO ON (DOC.DOCUMENT_OUT_ID = GO.DOCUMENT_OUT_ID)
                       |    LEFT JOIN GOODS_IN GI ON (GO.GOODS_IN_ID = GI.GOODS_IN_ID)
                       |WHERE (DOC.document_out_id = '" + ДокИд + "')
                       |GROUP BY CR_DATE, GOODS_SUM, FULLNUMBER, WORKS_SUM, ORG_NAME, CL_NAME, CL_SHORTNAME, CL_INN, CL_ID, K_NDS;";

       Попытка
           Заказы = Connection.Execute(Запрос3);
       Исключение
           Сообщить(ОписаниеОшибки());
   КонецПопытки;
       
       Пока Заказы.EOF()=0 Цикл
           НоваяСтрока = ТЧ.Добавить();
           НоваяСтрока.Документ =  Заказы.Fields("FULLNUMBER").Value;
           НоваяСтрока.Клиент =  Заказы.Fields("CL_NAME").Value;
           НоваяСтрока.КлиентНаименование = Заказы.Fields("CL_SHORTNAME").Value;
           НоваяСтрока.СуммаРабот =  Заказы.Fields("WORKS_SUM").Value;
           НоваяСтрока.СуммаТоваров =  Заказы.Fields("GOODS_SUM").Value;
           НоваяСтрока.Предприятие =  Заказы.Fields("ORG_NAME").Value;
           НоваяСтрока.Дата =  Заказы.Fields("CR_DATE").Value;
           НоваяСтрока.КоэфНДС = Заказы.Fields("K_NDS").Value;
           НоваяСтрока.Себестоимость = Заказы.Fields("COST").Value;
           НоваяСтрока.ТипДокумента = "ВКЗН";
           НовыйКонтрагент = СписокКонтрагентов.Добавить();
           НовыйКонтрагент.ФИО = Заказы.Fields("CL_NAME").Value;
           НовыйКонтрагент.ИД = Заказы.Fields("CL_ID").Value;
           НовыйКонтрагент.Наименование = Заказы.Fields("CL_SHORTNAME").Value;
           Заказы.MoveNext();
       КонецЦикла;
       Заказы.Close();
       КонецЕсли;




Сам цикл представляет собой перечисление таблицы значений, где один столбец ДокТип, а второй ДокИд.
При отладке данного куска кода цикл "Пока Заказы.EOF()=0 Цикл" не выполняется, т.е. Заказы.EOF() почему-то является истиной, хотя должно быть ложью, пока не перечислит все записи извлеченные из запроса.

В чем может быть проблема?
1 Asmody
 
01.09.11
23:16
а поймать отладчиком готовый текст запроса и проверить напрямую на сервере не судьба?
2 bazvan
 
01.09.11
23:18
(1) епт так это же ИТС, СП и книжки по снеговику читать надо. ты много го хочешь
3 Menjoy
 
01.09.11
23:19
(1) (2)
честно, я просто не знаю, как это можно выловить.
И сам не понимаю, почему именно так не работает, ведь должно.
4 Asmody
 
01.09.11
23:21
(3) точку остановки после Попытка поставить. ну или тупо перед выполнением запроса сделать Сообщить(Запрос3)
5 Menjoy
 
01.09.11
23:22
(4) да, уже с этим разобрался.

Вот что получается


SELECT
   DOC.SUMMA AS GOODS_SUM,    
   HDR.DATE_CREATE AS CR_DATE,
   HDR.FULLNUMBER AS FULLNUMBER,
   DSD.SUMMA_WORK AS WORKS_SUM,
  ORG.FULLNAME AS ORG_NAME,
   CL.FULLNAME AS CL_NAME,
   CL.SHORTNAME AS CL_SHORTNAME,
   CL.INN AS CL_INN,
   CL.CLIENT_ID AS CL_ID,
   TX.K_NDS AS K_NDS,
   SUM(GI.COST1*GO.GOODS_COUNT) as COST
FROM DOCUMENT_OUT DOC
  LEFT JOIN DOCUMENT_OUT_HEADER HDR ON (DOC.DOCUMENT_OUT_ID = HDR.DOCUMENT_OUT_ID) AND (HDR.DOCUMENT_TYPE_ID = 11)
   LEFT JOIN DOCUMENT_SERVICE_DETAIL DSD ON (HDR.DOCUMENT_OUT_HEADER_ID = DSD.DOCUMENT_OUT_HEADER_ID)
   LEFT JOIN ORGANIZATION ORG ON (DOC.ORGANIZATION_ID = ORG.ORGANIZATION_ID)    
   LEFT JOIN CLIENT CL ON (DOC.CLIENT_ID = CL.CLIENT_ID)
   LEFT JOIN TAX TX ON (ORG.TAX_SCHEMES_ID = TX.TAX_SCHEMES_ID)
   LEFT JOIN GOODS_OUT GO ON (DOC.DOCUMENT_OUT_ID = GO.DOCUMENT_OUT_ID)
   LEFT JOIN GOODS_IN GI ON (GO.GOODS_IN_ID = GI.GOODS_IN_ID)
WHERE (DOC.document_out_id = '3 595')
GROUP BY CR_DATE, GOODS_SUM, FULLNUMBER, WORKS_SUM, ORG_NAME, CL_NAME, CL_SHORTNAME, CL_INN, CL_ID, K_NDS;



Но без этих ' ' запрос не хочет корректно выполняться.
6 Menjoy
 
01.09.11
23:23
Кажется дело даже не в ' ', а в пробеле после первой цифры.
7 Asmody
 
01.09.11
23:28
(6) ДокИд - число? тогда см. Формат() в части разделитель разрядов
8 Menjoy
 
01.09.11
23:40
(7) И ДокИд и ДокТип являются числами, в табличной части уже поставил формат числа и разделитель убрал, чтобы число было "сплошное", но все равно в отладчике виден пробел.

Переменные ДокИд и ДокТип убрал и вместо них напрямую СписокДокументов.ДокИд и СписокДокументов.ДокТип поставил.
Также в проверке типа документа кавычки у числа убрал.

Все равно не то, проверку даже не проходит.
9 Menjoy
 
01.09.11
23:44
(7) у обоих полей уже поставил значения "Формат" и "Формат редактирования", как ЧЦ=20; ЧГ=0
Т.е. длина 20 символов максимум и без разделителя между разрядами. Все равно пробел вставляет.
10 Asmody
 
01.09.11
23:46
(9) функция Формат() тебе нужна
11 Menjoy
 
02.09.11
00:01
Воспользовался Формат().
Спасибо, теперь по этому все четко, но вод видимо сам запрос не рабочий, из-за:

where (DOC.document_out_id = '20037')

думаю, почему не работает.
12 Asmody
 
02.09.11
00:04
(11) а в базе document_out_id какой тип имеет?
13 Menjoy
 
02.09.11
00:10
(12) выловил уже ошибку, поставил ЧРГ=0 и сами понимаете, мне начало ID выдавать 5тизначный, вместо 4ехзначного, просто 0 не заметил.

Теперь так:


   ДокТип = Формат(СписокДокументов.ДокТип, "ЧЦ=20; ЧРД=; ЧРГ=; ЧГ=0" );
   ДокИд = Формат(СписокДокументов.ДокИд, "ЧЦ=20; ЧРД=; ЧРГ=; ЧГ=0" );



Вопрос, а почему установки, сделанные для значений колонок табличного поля не применяются к значениям?( Т.е. нужно вручную Формат() прописывать.
14 Asmody
 
02.09.11
00:12
(13) потому что формат в колонках - это только для вывода. внутре оно как было числом, так числом и осталось
15 Asmody
 
02.09.11
00:13
вообще, достаточно было "ЧРГ=;"
16 Menjoy
 
02.09.11
00:14
(15) спасибо большое, что помогли.
В результате теперь знаю про Формат() и поправил кучу ошибок, над которых мучился час :)
17 Asmody
 
02.09.11
00:17
(16) пожалуйста. метод "раздачи удочек" работает. вот сказал бы я сразу про Формат(,"ЧРГ=") - лишил бы удовольствия самостоятельно разобраться в проблеме
18 Menjoy
 
02.09.11
00:18
(17) согласен с вами, урок хороший преподали.
Вынужден учиться самостоятельно, потому и на форум обращаюсь.