Имя: Пароль:
1C
1С v8
v8: составной параметр запроса
0 МаксимБел
 
27.05.13
12:52
Есть у меня параметр запроса, который может быть не заполнен. Тип параметра - составной. В запросе надо отбирать записи регистра бухгалтерии, в которых субконто1 либо равно параметру, либо отбирать всё, если параметр не заполнен.
Долго ломали голову над тем, как проверить в запросе заполнение параметра. В итоге решили передавать в запрос еще один булевский параметр, который и является индикатором заполненности первого параметра. Решение не красивое, на мой взгляд, но другие варианты не прокатили. Может у вас есть лучшее решение?
1 rotting
 
27.05.13
12:53
работает?
2 Ненавижу 1С
 
гуру
27.05.13
12:53
есть, можно динамически красиво менять текст запроса, чтобы он и в конструкторе открывался
3 Godofsin
 
27.05.13
12:53
не добавлять условие по параметру, если он не заполнен?
Запрос в студию!
4 patapum
 
27.05.13
12:55
ТаблицаЗапроса.ПолеЗапроса = &Параметр ИЛИ &Параметр = &Неопределено
Правда, надо параметр Неопределено передавать
5 RomaH
 
naïve
27.05.13
12:55
а в чем некрасивость?
6 МаксимБел
 
27.05.13
12:55
(1) Ну как бы да :)
(2) Плохой вариант. Хочется в запросе всё делать. :) На самом деле часто такие задачки возникают. Вот решил раз и навсегда разобраться. :)
7 Drac0
 
27.05.13
12:56
(0) Менять текст запроса через СтрЗаменить(). Сам так делаю.
8 МаксимБел
 
27.05.13
12:56
ВЫБРАТЬ
   ХозрасчетныйОстатки.Субконто1 КАК Контрагент,
   ХозрасчетныйОстатки.Субконто2 КАК ДоговорКонтрагента,
   ХозрасчетныйОстатки.Субконто3 КАК СчетФактура,
   ВЫБОР
       КОГДА ХозрасчетныйОстатки.Субконто3 ССЫЛКА Документ.ДокументРасчетовСКонтрагентом
           ТОГДА ХозрасчетныйОстатки.Субконто3.НомерВходящегоДокумента
       ИНАЧЕ ХозрасчетныйОстатки.Субконто3.Номер
   КОНЕЦ КАК НомерДокумента,
   ВЫБОР
       КОГДА ХозрасчетныйОстатки.Субконто3 ССЫЛКА Документ.ДокументРасчетовСКонтрагентом
           ТОГДА ХозрасчетныйОстатки.Субконто3.ДатаВходящегоДокумента
       ИНАЧЕ ХозрасчетныйОстатки.Субконто3.Дата
   КОНЕЦ КАК ДатаДокумента,
   ВЫБОР
       КОГДА ХозрасчетныйОстатки.Субконто3 ССЫЛКА Документ.ДокументРасчетовСКонтрагентом
           ТОГДА ""
       ИНАЧЕ ХозрасчетныйОстатки.Субконто3.Транспорт
   КОНЕЦ КАК Перевозчик,
   ВЫБОР
       КОГДА ХозрасчетныйОстатки.Субконто3 ССЫЛКА Документ.ДокументРасчетовСКонтрагентом
           ТОГДА ""
       ИНАЧЕ ХозрасчетныйОстатки.Субконто3.Водитель
   КОНЕЦ КАК Водитель,
   ВЫБОР
       КОГДА ХозрасчетныйОстатки.Субконто3 ССЫЛКА Документ.ДокументРасчетовСКонтрагентом
           ТОГДА ""
       ИНАЧЕ ХозрасчетныйОстатки.Субконто3.ПутевойЛист
   КОНЕЦ КАК ПутевойЛист,
   ВЫБОР
       КОГДА ХозрасчетныйОстатки.Субконто3 ССЫЛКА Документ.ДокументРасчетовСКонтрагентом
           ТОГДА ""
       ИНАЧЕ ХозрасчетныйОстатки.Субконто3.ПунктРазгрузки
   КОНЕЦ КАК ПунктРазгрузки,
   ВЫБОР
       КОГДА ХозрасчетныйОстатки.Субконто3 ССЫЛКА Документ.ДокументРасчетовСКонтрагентом
           ТОГДА ""
       ИНАЧЕ ХозрасчетныйОстатки.Субконто3.брт_Менеджер
   КОНЕЦ КАК Менеджер,
   ХозрасчетныйОстатки.Счет КАК СчетУчетаРасчетов,
   ВЫБОР
       КОГДА ХозрасчетныйОстатки.Валюта ЕСТЬ NULL
           ТОГДА &ВалютаРегл
       ИНАЧЕ ХозрасчетныйОстатки.Валюта
   КОНЕЦ КАК Валюта,
   ХозрасчетныйОстатки.Субконто3.СуммаДокумента КАК СуммаДокумента,
   ХозрасчетныйОстатки.Субконто3.брт_ДатаОтсрочки КАК брт_ДатаОтсрочки,
   ВЫБОР
       КОГДА ХозрасчетныйОстатки.Субконто3.брт_ДатаОтсрочки = ДАТАВРЕМЯ(1, 1, 1)
           ТОГДА 0
       ИНАЧЕ РАЗНОСТЬДАТ(ХозрасчетныйОстатки.Субконто3.брт_ДатаОтсрочки, &Дата, ДЕНЬ)
   КОНЕЦ КАК ДнейПросрочено,
   ХозрасчетныйОстатки.Субконто3.брт_ДатаДоставки КАК брт_ДатаДоставки
ИЗ
   РегистрБухгалтерии.Хозрасчетный.Остатки(
           &Дата,
           Счет В ИЕРАРХИИ (&Счет),
           &ВидыСубконто,
           Организация = &Организация
               И Субконто1 В ИЕРАРХИИ (&Контрагент)) КАК ХозрасчетныйОстатки
ГДЕ
   НЕ ХозрасчетныйОстатки.Субконто3.ПометкаУдаления
   И (ТИПЗНАЧЕНИЯ(ХозрасчетныйОстатки.Субконто3) = ТИП(Документ.ДокументРасчетовСКонтрагентом)
           ИЛИ ТИПЗНАЧЕНИЯ(ХозрасчетныйОстатки.Субконто3) = ТИП(Документ.РеализацияТоваровУслуг))
   И ВЫБОР
           КОГДА НЕ &ОтборПоВодителю
                   ИЛИ ХозрасчетныйОстатки.Субконто3.Водитель = &Водитель
               ТОГДА ИСТИНА
       КОНЕЦ
   И ВЫБОР
           КОГДА НЕ &ОтборПоМенеджеру
                   ИЛИ ХозрасчетныйОстатки.Субконто3.брт_Менеджер = &Менеджер
               ТОГДА ИСТИНА
       КОНЕЦ
9 МаксимБел
 
27.05.13
12:57
Отбирать надо по Водителю. Если водитель не заполнен, то отбираем всё.
10 МаксимБел
 
27.05.13
12:58
(5) Лишние параметры.
11 Drac0
 
27.05.13
12:59
Вместо

ВЫБОР
           КОГДА НЕ &ОтборПоВодителю
                   ИЛИ ХозрасчетныйОстатки.Субконто3.Водитель = &Водитель
               ТОГДА ИСТИНА
       КОНЕЦ

пишешь &УсловиеНаВодителя. Потом в коде:

Запрос.Текст = СтрЗаменить(Запрос.Текст, "&УсловиеВодителя", ?(РеквизитВодитель.Пустая,"ИСТИНА","ХозрасчетныйОстатки.Субконто3.Водитель = &Водитель"));
12 Drac0
 
27.05.13
12:59
ИМХО, оптимальный вариант.
13 RomaH
 
naïve
27.05.13
12:59
(ХозрасчетныйОстатки.Субконто3.Водитель = &Водитель ИЛИ &ВодительНеВыбран)

Запрос.УстановитьПараметр("ВодительНеВыбран",ЗначениеЗаполнено(Водитель))
14 МаксимБел
 
27.05.13
13:04
(12) Пробую сейчас проверять ТИПЗНАЧЕНИЯ. Если параметр не задан, то у него тип "Не определено". Но не могу понять как этот неопределенный тип в запросе указать
Вот так:
ТИПЗНАЧЕНИЯ(&Водитель) = ТИП("Не определено")
не катит
Может знает кто, как эту проверку реализовать?
15 Drac0
 
27.05.13
13:05
(14) Зачем?

Ну напишите, как я сказал, только сделайте:

Запрос.Текст = СтрЗаменить(Запрос.Текст, "&УсловиеВодителя", ?(РеквизитВодитель = Неопределено,"ИСТИНА","ХозрасчетныйОстатки.Субконто3.Водитель = &Водитель"));

К чему запрос нагружать?
16 Ненавижу 1С
 
гуру
27.05.13
13:07
(6) чем он плохой то?
17 МаксимБел
 
27.05.13
13:08
(15) Да просто не люблю тексты запросов из кусочков собирать.  Считайте это моей прихотью. :)
18 kiruha
 
27.05.13
13:08
(11)
Офигеть ....
Запрос компилируется, кэшируется , план ...

И все это пох-ть и еще и рекомендовать
19 EvgenOrvin
 
27.05.13
13:09
(14)<code> &Водитель <> НЕОПРЕДЕЛЕННО </code> не работает?
20 МаксимБел
 
27.05.13
13:10
(19) Хм.. щас попробую.
21 kiruha
 
27.05.13
13:11
Оставьте
ВЫБОР
           КОГДА НЕ &ОтборПоВодителю
                   ИЛИ ХозрасчетныйОстатки.Субконто3.Водитель = &Водитель
               ТОГДА ИСТИНА
       КОНЕЦ

и не мучайте компилятор. Он все равно CASE добавит сам
22 EvgenOrvin
 
27.05.13
13:11
(20) Только там надо с одной "Н" -> НЕОПРЕДЕЛЕНО
23 МаксимБел
 
27.05.13
13:14
(19) Да. Работает. Спасибо. До сих пор считал, что роль НЕОПРЕДЕЛЕНО в запросах играет NULL. :)
Ну в принципе, вопрос закрыт. Всем спасибо. :)
24 Drac0
 
27.05.13
13:14
(18) Каким это образом все пропадает в моем варианте? 0_о Сколько пользуюсь, а статистика работает на ура.
25 kosts
 
27.05.13
13:16
(21) Как раз с таким запросом может быть плохой план запросов. Вроде где-то видел, что не рекомендуют условия "или" использовать, т.к. это негативно сказывается на плане.
И рекомендовали делать вместо


Выбор * из таблица
Где Условие1 или Условие2


так


Выбор * из таблица
Где Условие1
Объединить все
Выбор * из таблица
Где Условие2
26 kosts
 
27.05.13
13:20
27 kiruha
 
27.05.13
13:27
(25)
Вероятно это был специфический случай попадания сразу в 2 конкурирующих индекса. В данном случае другой запрос

Но записать лучше действительно без ИЛИ

ВЫБОР
КОГДА &ОтборПоВодителю Тогда
                   ХозрасчетныйОстатки.Субконто3.Водитель = &Водитель
Иначе ИСТИНА
КОНЕЦ
28 Drac0
 
27.05.13
13:32
(27) Здесь вот v8: Оператор "ИЛИ", конструкция "ВЫБОР" и вероятность фуллскана при них про case говорят, что хуже будет, чем ИЛИ.
29 MKZM
 
27.05.13
13:41
Если в скд, то можно испоьзовать фиигурные скобки, если не скд, то вообще проблем нет. Делай как надо
30 kiruha
 
28.05.13
12:40
(28)
А как название статьи
http://kb.1c.ru/articleView.jsp?id=44#or
а то доступа нет , поищу по названию
31 Drac0
 
28.05.13
22:11
(30) Я в теме скопипастил часть про ИЛИ в 43 сообщении. Или вас целиком интересует?
32 kiruha
 
29.05.13
00:32
(31)
Неизвестен контекст
одно дело

Спр.Код=&Код1 ИЛИ Спр.Код=&Код2

и другое

Спр.Код=&Код1 ИЛИ Спр.Наименование=&Наименование

Думаю в статье про 2 случай. Но и то скорее всего пофиг

Вообщем там в теме отписались уже
33 Drac0
 
29.05.13
00:37
(32) я ссылку вообще привел по поводу ВЫБОР.
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший