Имя: Пароль:
1C
1C 7.7
v7: Стандартные, не прямые запросы, чтоб их. Всегда работала с прямыми, туплю.
0 Humandra
 
20.01.12
06:38
Привет всем.
Народ, хелп ми плиз с обычными 1С запросами, не SQL.
Всегда работала только с SQL, там все просто. А тут просто не доходит, и все.
Начнем с простого: хочу получить просто список всех организаций, БЕЗ группировок и условий отбора, и выгрузить его в ТЗ.

Запрос = СоздатьОбъект("Запрос");
ТекстЗапроса =
"//{{ЗАПРОС(Сформировать)
|Ид  = Справочник.Организации.ТекущийЭлемент;
|Наименование  = Справочник.Организации.Наименование;
|"//}}ЗАПРОС
;
Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
Сообщить("!");
Возврат;
КонецЕсли;
       
ТЗ = СоздатьОбъект("ТаблицаЗначений");
Запрос.Выгрузить(ТЗ, 1, 0);
ТЗ.ВыбратьСтроку();

Получаю только одну строку, хотя в базе их с десяток.
Дело в опциях Выгрузить? Или в самом запросе? Замучалась уже просто... Чертова DBF база с глюками с драйверами FoxPro для 1C++...
1 ДенисЧ
 
20.01.12
06:42
А кто мешает поставить группировку?
2 OFF
 
20.01.12
06:42
"//{{ЗАПРОС(Сформировать)

|Ид  = Справочник.Организации.ТекущийЭлемент;
|Наименование  = Справочник.Организации.Наименование;
|Группировка Ид;
|"//}}ЗАПРОС

;
3 mszsuz
 
20.01.12
06:43
Сформируй запрос Конструктором.
4 ДенисЧ
 
20.01.12
06:43
И сделать Выгрузить(тз, 3, 0) ?
5 mszsuz
 
20.01.12
06:43
а, ну да, не проснулся ещё.
6 Humandra
 
20.01.12
06:43
(1) А что, без этого никак?
Любая группировка же по идее - замедление... а мне просто надо получить все данные...
7 ДенисЧ
 
20.01.12
06:47
Идея дурная какая-то...
8 Humandra
 
20.01.12
06:48
(7) Да дело в том, что это надо для автоматической выгрузки с разных баз в стороннюю систему. Конечно, запросы там немного посложнее будут. Сейчас все на прямых запросах для SQL баз работает, но понадобилось подключить к DBF. Скорость работы критична.
А почему дурная идея?
9 ДенисЧ
 
20.01.12
06:49
(8) Идея "группировка - замедление" - дурная.
10 Humandra
 
20.01.12
06:50
(8) почему? При группировке на SQL план запроса совершенно точно меняется, и не в лучшую сторону. Насчет 1С-запросов конечно не знаю.
11 chelentano
 
20.01.12
06:51
(8) на дбф тоже есть прямые запросы
12 Humandra
 
20.01.12
06:51
(10)Согласитесь, одно дело full scan по таблице без сортировки (а группировка это же почти сортировка, только с агрегированием)
И другое дело - это самое агрегирование.

(11) Ага, видела. Что-то у меня с драйвером не вышло, глючит по страшному :(
13 big
 
20.01.12
06:52
а что мешает сделать прямой запрос к ДБФ? Неужели религия истинного SQL-джедая?
14 Humandra
 
20.01.12
06:52
(11) Может еще с другим попробую...
15 big
 
20.01.12
06:53
(8) Сколько там будет то замедление? Замеры были? Да ещё и по организациям ))) Ладно бы по 100 000 номенклатуры, а тут...
16 Humandra
 
20.01.12
06:53
(13) Джедай уже на все готов, ибо у меня от Запрос Сформировать мозги в трубочку. Но почему-то драйвер у меня не работает от FoxPro...
17 Humandra
 
20.01.12
06:54
(15) Это тестовый запрос, ребята :) Запрос будет по нескольким сотням тысяч записей, даже несколько запросов.
18 Азат
 
20.01.12
06:55
SQLite или даже напрямую селекть из таблицы... кто мешает-то?
19 big
 
20.01.12
06:56
(17) поделиться?
20 Humandra
 
20.01.12
07:01
(18) Да там что-то с ОС сконфликтовало. Я было решила, что будет проще на штатном механизме сделать, чем разбираться, что именно мешает - терминал, версия ОС или версия библиотек. Но вы правы, вернусь наверное на прямые запросы, ибо душа джедая такого не выносит :(

(17) В смысле - разбить на части? Несколько запросов к одной таблице не лучше одного, а как правило - хуже. Это же не миллионы записей, а всего около пары сотен тысяч, немного.
21 Humandra
 
20.01.12
07:01
(20) в (17) - к (19)
22 Humandra
 
20.01.12
07:04
(18) Подождите-ка! Прочитала описание 1sqlite повнимательнее - вы хотите сказать, что в этом случае не нужен драйвер FoxPro, что-ли?
23 big
 
20.01.12
07:07
(21) я имел ввиду драйвером поделиться, а не запрос на части рубить )))
(22) неа, не надо
24 Humandra
 
20.01.12
07:13
(23) А! Спасибо... давайте, не помешает, большое спасибо! :)
И попробую на 1sqlite тоже... Не обращала на него внимание раньше, все SQL да SQL :)
25 big
 
20.01.12
07:14
(24) у него преимущество, что может в монопольном реджиме работать, а так особой разницы вроде как нет
26 orefkov
 
20.01.12
07:26
(22)
Именно, что не нужен.
Работает через "родной" движок (dbeng32.dll) 1Ски. Поэтому, как и в sql, позволяет юзать в монопольном режиме. Да и с драйвером FoxPro - работать должно нормально. Просто надо работать не через ODBCRecordSet и ODBC драйвер, а через OLEDBRecordSet и OLEDB драйвер. Правда, для работы в монополе потребуется что-то там патчить.
27 toypaul
 
гуру
20.01.12
08:07
не понял зачем тут запрос. чем ВыбратьЭлементы не устраивает
28 1Сергей
 
20.01.12
08:12
(27) она просто пытается понять принцип черных запросов.

ЗЫ Вот и выросло поколение, которое с лёгкостью пишет прямые запросы, но в чёрных тупит
29 doctorzlo
 
20.01.12
08:19
Справочники и DBF база - простой перебор элементов будет работать быстрее чем запрос...
30 orefkov
 
20.01.12
09:37
(29)
select id [Элемент :Справочник.Номенклатура] from [Справочник.Номенклатура] where descr like '%шамп%'

Сделай перебором быстрее :)
31 Humandra
 
20.01.12
12:40
(30) Ну вот, перешла на 1SQLite, жизнь сразу стала легче, по крайней мере все логично :)
Единственное, пока не разобралась с типизацией.
Есть регистр, в нем несколько измерений. Например, Поставщик и Услуга.
Мне нужно получить их ИД-шники, в виде "9 знаков". А возвращается с регистра какой-то странный идентификатор - такое ощущение что еще плюс период... Как бы преобразовать?
32 big
 
20.01.12
12:43
(31) ИД вида справочника + ИД элемента = 13 символов
33 ЧеловекДуши
 
20.01.12
12:44
(28)Самое смешное, что понимать их как раз и не надо, там мало логики :)
Так сказать, это надо просто помнить :)
34 Humandra
 
20.01.12
12:53
(32) Да не похоже... Там возвращается что-то типа такого: 7.12.01-2 для поля Услуга. Предполагаю, что первая 7 - это '    7    '.
Не пойму, как с таким результатом работать...
35 Mikeware
 
20.01.12
13:03
(31) и как же ты "всегда прямые писала"?
36 Humandra
 
20.01.12
13:07
(35) Больше всего - на чистом SQL не в 1С :)
И поменьше - в 1С++. С преобразованием типов а ля
select Рег.Услуга as [Услуга $Справочник.Услуги]
 from Регистр.МойРегистр Рег

А в моем теперешнем случае что-то не то.
Преобразовываю аналогично, только :Справочник.Услуги - но не работает, ибо исходные данные не в формате "9 знаков" и даже не "13 знаков" :(
37 ДенисЧ
 
20.01.12
13:10
дык покажи, что оно возвращает
38 Humandra
 
20.01.12
13:16
в (34) писала

например, если вообще никакого преобразования не задавать, то
услуга отображается так: 7.12.01-2
а поставщик так - 008.02.29

исходный запрос, например, такой (упростила, чтобы лишнего не тащить):

       сЗапрос = "
           |select r.Поставщик [Поставщик_Ид]
           |    , r.ЛицевойСчет [ЛицевойСчет_Ид]
           |    , r.Услуга [Услуга_Ид]
             |  from Регистр_ВзаиморасчетыN1 as r
             |  group by r.ЛицевойСчет, r.Поставщик, r.Услуга
           |";
39 Humandra
 
20.01.12
13:16
ЛицевойСчет при этом отображается и преобразовывается в нужный тип корректно...
40 Humandra
 
20.01.12
13:43
up? есть идеи?
41 orefkov
 
20.01.12
13:49
Ну если Поставщик - именно идшник конкретного справочника (9 символов), то
|select r.Поставщик [Поставщик_Ид :Справочник.Контрагенты]

т.е. в 1С++ для типизации используется
$Справочник.Контрагенты
то в 1sqlite
:Справочник.Контрагенты

(двоеточие вместо доллара)
42 Humandra
 
20.01.12
13:51
(41) Ага, я доку прочитала, но так как исходный результат в виде как в (38), то при преобразовании типов ругается, что нет такого объекта
43 Ёпрст
 
20.01.12
13:51
(40) есть.
Огласи тип этого измерения из пофигуратора.
44 Humandra
 
20.01.12
13:52
(42) Но как там может быть исходным значением - не 9-тизначный ид элемента справочника, вот чего я не понимаю!
45 Humandra
 
20.01.12
13:53
(43) Справочник.Услуги, увы... Для услуг. Или Справочник.Организации - для Поставщика.
Если бы он был ненормальным, все понятно было бы
46 Humandra
 
20.01.12
13:54
Кстати, если
"create virtual table Регистр_ВзаиморасчетыN1 using dbeng(Регистр.ВзаиморасчетыN1)"
заменить на
"create virtual table Регистр_ВзаиморасчетыN1 using dbeng(РегистрИтоги.ВзаиморасчетыN1)"
то возвращаются уже значения типа Справочник...
47 Ёпрст
 
20.01.12
13:54
(45) п..ц
Тип какой у Измерения ?
<Справочник> без вида ?
<Справочник.КонкретныйВид> ?
<Неопределенный> ?
Другое ?
48 Humandra
 
20.01.12
13:55
А я что написала? Справочник.КонкретныйВид. Для Услуг - Справочник.Услуги.
49 Ёпрст
 
20.01.12
13:56
(48) Да ну ?!

А это как понимать ?!
>>>Справочник.Услуги, увы... Для услуг. Или Справочник.Организации - для Поставщика.
50 Ёпрст
 
20.01.12
13:57
Еще раз - какой тип у Измерения в регистре в ПОФИГУРАТОРЕ установлен ?
51 Humandra
 
20.01.12
13:57
(49)
А! Все, поняла, что ты не понял.
Просто у меня же две колонки из трех неправильно значения возвращают в запросе. Услуга и Поставщик. Вот я для обоих тип и написала.
Тип у обоих проблемных измерений - конкретный.
52 orefkov
 
20.01.12
13:59
(46)
Убери "create viryal table ..." вообще, уже давно нужные таблицы подключаются сами, так только путаница получается.
53 Ёпрст
 
20.01.12
13:59
54 Humandra
 
20.01.12
14:01
(52) А у меня не подключились... странно. Может у меня версия библиотеки старая?
1.0.1.3, скачана с шапки форума 1cpp

(53) Извини меня, ты стараешься помочь, спасибо тебе за это. Но сколько раз я должна повторить, что в этом самом месте на скриншоте у меня конкретный тип?!!! Для измерения Услуги - Справочник.Услуги!
55 Ёпрст
 
20.01.12
14:02
(46) если что, ЭТО разные таблички, одна - табличка итогов регистра, другая - табличка движений регистра, это раз
Использовать это давно не надо - есть автоподстановка таблиц, это два
56 Ёпрст
 
20.01.12
14:04
ТекстЗапроса = "
    |select r.Поставщик [Поставщик :Справочник.Организации]
    |    , r.ЛицевойСчет Счет
    |    , r.Услуга [Услуга :Справочник.Услуги]
    |  from [Регистр.ВзаиморасчетыN1] as r
    |  group by r.ЛицевойСчет, r.Поставщик, r.Услуга
    |";
57 Humandra
 
20.01.12
14:06
(55) Про то, что это разные таблички я давным давно в курсе. И в MS SQL Server запросы писала ручками к ним, в том числе для получения остатков, не через виртуальные таблицы, а сама.
(56) Ну делала я так! См. (42) - в результате пишет "объект не найден", так как исходные данные не в формате "9-тизначный идентификатор", а просто в формате 9-тизначной непонятной строки.
Ну почему местные 1с-ники сильно недооценивают женский пол в части программинга? :)
58 Humandra
 
20.01.12
14:11
(52) Вот может в этом собака и порылась. У меня запросы заработали только после явного подключения таблиц.
Вот, например, если отключить подключение виртуальных таблиц, то получаю на запросе:
       сЗапрос = "
           |select Организации.id as [Ид]
           |    , Организации.descr as [Наименование]
           |    , 0 as [Используется]
             |  from Справочник_Организации as Организации
             |";
no such table: Справочник_Организации

Через точку тоже пробовала - Справочник.Организации.
59 Humandra
 
20.01.12
14:15
(58) Ага, внимательнее прочитала шапку на форуме - действительно у меня старая версия библиотеки :( Качаю новую :)
60 Ёпрст
 
20.01.12
14:20
(58) Выкини create viryal table , напиши как в  (56) и наслаждайся
61 Humandra
 
20.01.12
14:24
(52),(60) О, счастье настало! Дело было в версии библиотеки. Заменила - и все заработало.
Всем спасибо! :)
62 orefkov
 
20.01.12
14:40
(61)
Я себя сейчас чувствую, как человек, которого искренне благодарят за показанную короткую тропку через болото, вместо надежной широкой дороги вокруг него.
Вроде как бы да, гораздо быстрее можно дойти, но сколько там подводных камней еще будет...
63 Humandra
 
20.01.12
14:47
(62) Да ну, пока все отлично! :)
По крайней мере совершенно точно, что я предпочту маяться с тем, что можно понять, либо счесть багом (1sqlite), чем с тем, что вроде хоть и работает, но иногда, и не так как ожидаешь, и понять как должно - невозможно (запросы 1с)
64 Humandra
 
20.01.12
14:48
(62) А аналог виртуальных таблиц остатков в 1sqlite есть, или писать развернутые запросы?
65 Ёпрст
 
20.01.12
15:03
(64) ручками, всё ручками
Ошибка? Это не ошибка, это системная функция.