Имя: Пароль:
1C
1C 7.7
v7: Использование элемента массива в условии запроса.
0 Lexxxxx
 
06.01.12
11:39
Имеется код

Процедура ОсновнойЗапрос()
   Перем МассивСписковФильтра[10];
       
   Запрос = СоздатьОбъект("Запрос");
   ТекстЗапроса = "";
   СформироватьПеременныеЗапроса(ТекстЗапроса);
   ДобавитьФункции(ТекстЗапроса);
   СтрокаВыбрГруппировок = "";
   СписВыбрГруппировок = "";
   ДобавитьГруппировки(ТекстЗапроса, СписВыбрГруппировок, СтрокаВыбрГруппировок);
   ДобавитьУсловия(ТекстЗапроса, МассивСписковФильтра);
   
   Сообщить(ТекстЗапроса);
   Состояние("Выполняется запрос");
   Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
       Сообщить("Не удалось выполнить запрос по ТТН!");
       Возврат ;
   КонецЕсли;
   
   Печать(Запрос, СписВыбрГруппировок, СтрокаВыбрГруппировок);
   
КонецПроцедуры

Текст запроса

Период с Дата1 по Дата2;
Обрабатывать НеПомеченныеНаУдаление;
ОбрабатыватьДокументы Все;
ТМЦ = Документ.ТТН.ТМЦ;
Отправитель = Документ.ТТН.ГрузоОтправитель;
Клиент = Документ.ТТН.Клиент;
Получатель = Документ.ТТН.ГрузоПолучатель;
Автомобиль = Документ.ТТН.Автомобиль;
ПунктРазгр = Документ.ТТН.ПунктРазгрузки;
Водитель = Документ.ТТН.Водитель;
АТП = Документ.ТТН.Автопредприятие;
Док = Документ.ТТН.ТекущийДокумент;
СуммаД = Документ.ТТН.Сумма;
СуммаК = Документ.ТТН.Кво;
Функция СуммаДенег = Сумма(СуммаД);
Функция СуммаКво = Сумма(СуммаК);
Группировка Отправитель без групп;
Группировка Получатель без групп;
Условие (НЕ(Отправитель в МассивСписковФильтра[1]));
Условие (НЕ(Получатель в МассивСписковФильтра[2]));

При выполнении запроса два раза получаем

2 return МассивСписковФильтра<<?>>[1];
Переменная не объявлена как массив(МассивСписковФильтра)

5 return МассивСписковФильтра<<?>>[2];
Переменная не объявлена как массив(МассивСписковФильтра)

и запрос не выполняется.
Что я делаю не так? Как для каждой строки условия в запросе использовать свой список элементов, учитывая что заранее неизвестно
сколько строк условия будет в запросе?
1 Cthulhu
 
06.01.12
11:46
вряд ли эти сообщения получены при выполнении именно запроса.
ты от нас что-то скрываешь.
2 Lexxxxx
 
06.01.12
11:47
(1) Сообщения получены при
Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
   Сообщить("Не удалось выполнить запрос по ТТН!");
   Возврат ;
КонецЕсли;

Так как в окне сообщений имеем
Не удалось выполнить запрос по ТТН!
3 marvak
 
06.01.12
11:52
(0)
а если попробовать явно инициализировать МассивСписковФильтра перед Запрос.Выполнить(), а сами условия и массив сократить до одного элемента. так будет понятно, принципиально возможно вообще такое в запросах задавать.

Перем МассивСписковФильтра[1];
//ДобавитьУсловия(ТекстЗапроса, МассивСписковФильтра);
МассивСписковФильтра[1] = ТвойОтправитель;
4 Lexxxxx
 
06.01.12
11:57
(3) Сделал

   МассивСписковФильтра[1] = СоздатьОбъект("СписокЗначений");
   МассивСписковФильтра[2] = СоздатьОбъект("СписокЗначений");
   
   Сообщить(ТекстЗапроса);
   Состояние("Выполняется запрос");
   Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
       Сообщить("Не удалось выполнить запрос по ТТН!", "!");
       Возврат ;
   КонецЕсли;

Ничего не изменилось.
В элементе массива должен быть не конкретный элемент справочника. а список элементов.
5 DCKiller
 
06.01.12
11:58
Зачем тебе массивы тут? Хочешь выглядеть умнее?
6 Lexxxxx
 
06.01.12
11:59
(5) Затем что текст запроса и набор элементов в условии зависит от того, что пользователь наковырял в интерфейсе перед формированием отчета.
7 marvak
 
06.01.12
12:01
(4)
а списки инициализировать не надо что ли? они же у тебя пустые.
условий много хоть? может послушать (5) и обойтись просто несколькими списками, которые отдельно?
8 Lexxxxx
 
06.01.12
12:05
(7) а пустые они в (4) только по совету (3) чисто попробовать чтобы! :) А что страшного в том, что они пустые?! Просто условие (текущее) стало бессмысленным, но запрос выполниться ведь должен?!
Условий от 0 до количества группировок, в зависимости от того каких галочек понаставил и каких элементов навыбирал пользователь в интерфейсе.
Да вот я и хочу обойтись этими списками, только мне их динамически надо подставлять в запрос.
9 1Сергей
 
06.01.12
12:07
(8) из (0) видно, что массив пустой
10 temsa
 
06.01.12
12:08
(0) работай со списком и не парь себе мозг.
11 marvak
 
06.01.12
12:09
(8)
при таком присвоении МассивСписковФильтра[1] = СоздатьОбъект("СписокЗначений");
тип переменной МассивСписковФильтра возможно меняется.

попробуй просто так сделать

Список1 = СоздатьОбъект("СписокЗначений");
Список1.ДобавитьЗначение(чтонибудь);
МассивСписковФильтра[1] = Список1;
12 Lexxxxx
 
06.01.12
12:16
(9) Почему?! (да и в 4 он явно совсем не пустой)

(10) нельзя, потому что один и тот же элемент одного справочника может встречаться в разных условиях, одно из которых НЕ(В списке),а а другое наоборот (в списке). В (0) как раз такой пример приведен. Отправитель и получатель это элементы справочника контрагентов и возможны ситуации когда в разных документах один и тот же контрагент то получатель, то отправитель, и если список один то фильтруя например по отправителю контрагент выпадает и из получетелей.

(11) Какая разница?! Все равно МассивСписковФильтра должен остаться массивом списков?
13 Lexxxxx
 
06.01.12
12:21
(11) Как и ожидалось
   МассивСписковФильтра[1] = СоздатьОбъект("СписокЗначений");
   МассивСписковФильтра[2] = СоздатьОбъект("СписокЗначений");
   МассивСписковФильтра[1].ДобавитьЗначение("лораплоап");
   
   Сообщить(ТекстЗапроса);
   Состояние("Выполняется запрос");
   Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
       Сообщить("Не удалось выполнить запрос по ТТН!", "!");
       Возврат ;
   КонецЕсли;

ни к чему не привело.

"тип переменной МассивСписковФильтра возможно меняется. "
А как посмотреть ее тип? ТипЗначенияСтр на него ругается в отладчике.
14 marvak
 
06.01.12
12:21
(12)
тебе предлагается не один список, а несколько сделать, как и у тебя сейчас, но храниться они будут не в элементах массива, а в отдельных переменных.
объяви заранее десяток переменных-списков, да и все.
15 Lexxxxx
 
06.01.12
12:26
(14)"объяви заранее десяток переменных-списков, да и все." Это не есть гуд! Пропадает вся динамика. При переделке отчета придется ковырять эту часть.
16 Lexxxxx
 
06.01.12
12:32
Проблему решил используя список списков
Кусок запроса
Условие (НЕ(Отправитель в СписокСписковФильтра.ПолучитьЗначение(1)));
Условие (НЕ(Получатель в СписокСписковФильтра.ПолучитьЗначение(2)));

Почему массив не подошел не понимаю, да и фиг с ним, все равно размерность его нельзя было определить заранее, поэтому задавалась заведомо большая, что както неаккуратненько.
17 ДенисЧ
 
06.01.12
12:35
мда... Прощай, скорость :-)
18 Lexxxxx
 
06.01.12
12:40
(17) А что делать?! :) Потому с массивами и завязывался что казалось что получение элемента массива по индексу по времени менее затратно чем выполнение метода ПолучитьЗначение() списка значений. Да вот проверить догадку на практике не удалось. Хотя можно сгородить чисто синтетический тест, без запроса, но лениво как-то. Может кто знает точно что быстрее и на сколько?!
19 Lexxxxx
 
10.01.12
00:25
Сегодня не поленился и набросал тестик.
Выяснилось что просто извлечение значения из списка, без каких либо запросов, происходит почти в два раза медленнее чем получение элемента по индексу из массива. Печально конечно, но не катастрофически.
Может все таки как-то можно включить в условие запроса элемент массива?
20 Torquader
 
10.01.12
00:43
Так, я не понял - мы хотим найти элемент в списке значений, но нас не устраивает скорость и мы хотим, чтобы 1С искала в массиве, а не в списке (1С, правда, этого не умеет). Но, мы очень хотим и подсовываем ей элемент массива, а 1С предполагает, что в этом массиве у нас должен быть список значений (так как мы написали "В").
Если же мы хотим совпадение, то надо писать "=", то есть Отправитель=МассивСписковФильтра[1] (если отправитель у нас один), а если же их набор - то только список.
И, если написать "Список1" и "Список2" вместо одного массива, то ничего не изменится - не кажется ли вам, что так проще ?
21 Ёпрст
 
10.01.12
00:55
(0) Перем МассивСписковФильтра[10];

вынеси за объявление имени процедуры, т.е сделай глобальной переменной модуля.
Наслаждайся
22 Lexxxxx
 
10.01.12
10:27
(21) Спасибо! Помогло! Не могли бы Вы объяснить неграмотному, почему оно не работает если объявить массив на уровне процедуры запроса?!
23 Lexxxxx
 
10.01.12
10:43
(20)Ничего мы искать не хотим. Мы хотим прицепить в условие нужный список из некоторого их набора (массива или списка).
24 Lexxxxx
 
10.01.12
17:48
(up)