Имя: Пароль:
1C
1C 7.7
v7: Помогите с запросом, условие на счёт 60.01
0 ALCAPONA
 
10.07.24
15:11
Всем доброго дня.
Имеется элементарный запрос по документам:

Сч60 = СчетПоКоду("60.01");

Спр = СоздатьОбъект("Справочник.НазначениеТМЦ");
Спр.НайтиПоКоду(1);
ТекНазначение = Спр.ТекущийЭлемент();
    
Запрос       = СоздатьОбъект("Запрос");
ТекстЗапроса = "
|Период с ДатаНачала по ДатаКонца;
|ОбрабатыватьДокументы Проведенные;
|Поставщик  = Документ.ПоступлениеТМЦ.Поставщик;
|Договор    = Документ.ПоступлениеТМЦ.Договор;
|СчетДок    = Документ.ПоступлениеТМЦ.СчетКредит;
|Валюта     = Документ.ПоступлениеТМЦ.Валюта;
|Назначение = Документ.ПоступлениеТМЦ.Назначение;
|ТМЦ        = Документ.ПоступлениеТМЦ.Материалы;
|Кол        = Документ.ПоступлениеТМЦ.Количество;
|ЕдИзм      = Документ.ПоступлениеТМЦ.ЕдИзмерения;
|Цена       = Документ.ПоступлениеТМЦ.Цена;
|СумБезНДС  = Документ.ПоступлениеТМЦ.Сумма;
|СумСНДС    = Документ.ПоступлениеТМЦ.СуммаСНДС;
|Функция Количество = Сумма(Кол);
|Функция СуммаБезНДС = Сумма(СумБезНДС);
|Функция СуммаСНДС = Сумма(СумСНДС);
|Группировка Поставщик без Групп;
|Группировка Договор;
|Группировка Месяц;
|Группировка ТМЦ;
|Условие (Валюта = Константа.ОсновнаяВалюта);
|Условие (Назначение = ТекНазначение);
|Условие (СчетДок = Сч60);

Беда в чём:
всё отлично работает, кроме условия |Условие (СчетДок = Сч60);
как только добавляешь это условие, выборка тут же становится пустой;
если изменить условие на |Условие (СчетДок <> Сч60), то в запрос попадают вообще все счета (и равные 60.01, и не равные).

СчетДок - реквизит шапки документа "ПоступлениеТМЦ", имеет тип "Счет", переменная Сч60 естественно того же типа.
Аналогично "Валюта" и "Назначение" - тоже реквизиты шапки, но с их отбором никаких проблем нет.

Пробовал также такой вариант:
Сч60 = "60.01";
|СчетДок = Документ.ПоступлениеТМЦ.СчетКредит.Код;
|Условие (СчетДок = Сч60);
результат тот же, выборка пустая, а отладчик и вовсе показал Запрос.СчетДок не "60.01", а "2U.  3 ", т.е. внутренний код из базы.
1 Злопчинский
 
29.07.24
10:02
Я бы так не в жизнь бы не написал тёк назначения. Ну, если поискал его, я бы написал проверить, если найден, то дальше, не найден всё алярм

Проверь типзначениястр(счетдок).
Убери мешащее условия. Результат запроса выгрузи в таблицу значений проверь, какой тип значения у счёт док.
2 Толич
 
10.07.24
15:22
(0) Задам возможно глупый вопрос. Просто очень похоже, что это Ваш код:
Сч60 = "60.01";
Вы текстовую строку в параметр передаете?
3 Злопчинский
 
10.07.24
15:24
Ну и проверить, у тебя 3 условия, они все соединяются по "И" и если добавляешь условие и выборка пустая, если всё нормально, значит, 3 раза И получается ложь. Проверяй, есть ли у тебя Массивы данных, удовлетворяющие трём и.
4 Толич
 
10.07.24
15:24
Блин. Начисто забыл 7.7
5 Толич
 
10.07.24
15:27
|Условие (Валюта = Константа.ОсновнаяВалюта);
|Условие (Назначение = ТекНазначение);

Да. Попробуйте это закомментировать.
6 ALCAPONA
 
10.07.24
15:28
(1)
типзначениястр(счетдок) во всём запросе = "счет", как для нужных счетов, так и для ненужных.

>>>Я бы так не в жизнь бы не написал тёк назначения. Ну, если поискал его, я бы написал проверить, если найден, то дальше, не найден всё алярм

Я так и не пишу обычно, это написал просто для примера, чтобы понять, с одним реквизитом отбора такая ерунда или и с другими тоже. Но нет, проблема только со счётом, с константой и элементом справочника проблем нет.
7 ALCAPONA
 
10.07.24
15:30
(2)
Сначала передавал значение типа "Счет". Когда понял, что не отрабатывает, пробовал передавать строкой.
8 ALCAPONA
 
10.07.24
15:30
(3)
массивы есть конечно же, проверил 100 раз.
9 Злопчинский
 
10.07.24
15:31
Убери все условия, оставь только по счету. И танцуй отсюда.
10 ALCAPONA
 
10.07.24
15:31
(5)
Даже если оставить в запросе одно условие
|Условие (СчетДок = Сч60);
то выборка сразу пустая, остальные условия добавлялись позже, просто чтобы попытаться локализовать проблему.
11 Злопчинский
 
10.07.24
15:32
В конфигураторе счетдок какой тип у реквизита задан?
12 Chai Nic
 
10.07.24
15:33
Черный запрос - зло
13 Chai Nic
 
10.07.24
15:34
Делайте лучше или перебором, или (если элементов много и время обработки критично) - через прямые запросы
14 ALCAPONA
 
10.07.24
15:36
(11)
<<Счет>>
15 AAA
 
10.07.24
15:37
А что за 60.01 в семерке ? Такие счета в восьмерке?
16 ALCAPONA
 
10.07.24
16:57
(13)
Можно конечно все перебрать построчно, записать в ТЗ и фильтровать уже там, но будет сильно дольше и больше кода, плюс сразу теряем все красивые группировки с подбитыми суммами.
17 ALCAPONA
 
10.07.24
15:40
(15)
Расчеты с поставщиками и подрядчиками (Контрагенты / Договора)
18 AAA
 
10.07.24
15:44
(17)у Вас самописная ? в типовых счет 60.1, а не 60.01
Так то я в курсе что это за счет
19 ALCAPONA
 
10.07.24
15:47
(18)
Полная самописка.
20 AAA
 
10.07.24
15:49
(19)но все таки гляньте, вдруг 60.1
21 ALCAPONA
 
10.07.24
15:50
(20)
Да не, всё не настолько просто :)
22 Ёпрст
 
10.07.24
15:55
Поди есть реквизит на форме с идентификатором Сч60?..да?
23 ALCAPONA
 
10.07.24
15:56
(11)
Знаете, что самое любопытное: если в конфигураторе поменять тип реквизита со "<<Счет>>" на "Счет.Основной", то условие запроса начинает отрабатывать абсолютно корректно.
Однако при сохранении конфигуратор ругается на некую частичную потерю данных.
Кто-то может объяснить этот бред ?
24 ALCAPONA
 
10.07.24
15:57
(22)
Нет такого реквизита + сам запрос расположен во внешнем отчёте, с документом он никак не пересекается.
25 AAA
 
10.07.24
15:58
Посмотрите в документе какой тип у СчетКредит и посмотрите в отладчике что такое Сч60
26 AAA
 
10.07.24
15:59
(23)он и должен быть счет основной. Бред похоже в другом месте ) Вы разработчик этой самописки ?)
27 ALCAPONA
 
10.07.24
16:01
(25)
Везде тип = "Счет".
28 Ёпрст
 
10.07.24
16:02
(23) почему бред?..в конфе может быть куча планов счетов
29 ALCAPONA
 
10.07.24
16:03
(26)
Разработка задолго до меня, но я не понимаю этой ситуации, впервые с таким сталкиваюсь за все годы работы с клюшками.
30 Ёпрст
 
10.07.24
16:04
И тебе надо не счет по коду, а для конкретного плана счетов счет по коду
31 ALCAPONA
 
10.07.24
16:05
(28)
В конкретно этой конфе план счетов один.
Но даже если написать
Сч60 = СчетПоКоду("60.01",ПланыСчетов.Основной)
то проблема остаётся.
32 Ёпрст
 
10.07.24
16:06
Поставь в СчетПоКоду второй параметр
33 Ёпрст
 
10.07.24
16:08
(31) тогда тест на вшивость:
Вася = СчетПоКоду("60.01",ПланыСчетов.Основной);
Сообщить(ТипЗначенияСтр(Вася));
|Условие (ТвойСчет = Вася);
34 ALCAPONA
 
10.07.24
16:16
(33)
Вася = СчетПоКоду("60.01",ПланыСчетов.Основной);
Сообщить(ТипЗначенияСтр(Вася));
Вася = СчетПоКоду("60.01");
Сообщить(ТипЗначенияСтр(Вася));

Результат:
Счет
Счет
35 Builder
 
10.07.24
16:19
а попробуй такое условие
|Условие (СчетДок В Сч60);
И еще вытащи на форму реквизит типа Счет и заполни там.
36 ALCAPONA
 
10.07.24
16:19
(34)
Выборка пустая при обоих Василиях.
37 Ёпрст
 
10.07.24
16:20
(36) Значит, в выбранном периоде нет документов с таким счетом.
38 AAA
 
10.07.24
16:24
ТипЗначенияСтр недостаточно. Это всегда счет
39 ALCAPONA
 
10.07.24
16:24
(35)
Безрезультатно в обоих случаях.
40 ALCAPONA
 
10.07.24
16:25
(37)
Увы, есть, и их тысячи. Если бы их не было, то и при Счет.Основной выборка бы не работала.
41 AAA
 
10.07.24
16:26
Надо еще и Вид()
То что он Счет ясно и ежу
42 Ёпрст
 
10.07.24
16:27
Ну, хотя бы покажи, что возвращает
|СчетДок = Документ.ПоступлениеТМЦ.СчетКредит.Код;
Это..при отсутствии условия на счет
43 ALCAPONA
 
10.07.24
16:29
(42)
См. (0), я там писал
возвращает "2U.  3 ", т.е. внутренний код из базы.
44 ALCAPONA
 
10.07.24
16:31
(41)
Вася = СчетПоКоду("60.01",ПланыСчетов.Основной);
Сообщить(Вася.Вид());
Вася = СчетПоКоду("60.01");
Сообщить(Вася.Вид());

Результат:
Основной
Основной
45 Ёпрст
 
10.07.24
16:32
(43) формат базы какой хоть? Sql/dbf
46 Aleks73
 
10.07.24
16:32
(43) а СчетКредит.Наименование что возвращает?
47 ALCAPONA
 
10.07.24
16:34
(45)
SQL 2008, БД в режиме SQL 2000.
48 ALCAPONA
 
10.07.24
16:37
(46)
|СчетДокНаим = Документ.ПоступлениеТМЦ.СчетКредит.Наименование;

отладчик вернул
"2U    3N                                                    "
49 Ёпрст
 
10.07.24
16:41
(47)
Запрос.ВключитьSql(0);
50 Ёпрст
 
10.07.24
16:43
>>>БД в режиме SQL 2000  

это вообще за гранью добра, при условии, что клюшки и на 2022 скуле работают, без режима совместимости
51 ALCAPONA
 
10.07.24
16:49
(49)
Работает :)
Бред №2 :)))
52 ALCAPONA
 
10.07.24
16:50
(50)
Уже не вспомню, почему так сделано, но что-то видимо не работало из сторонних DLL в режиме SQL выше 2000.
53 ALCAPONA
 
10.07.24
16:55
Тогда что посоветуете: оставить Запрос.ВключитьSql(0) или лучше в самом документе поменять тип реквизита со "<<Счет>>" на "Счет.Основной" ?

Во втором случае немного смущает сообщение о частичной потере данных, хотя и неясно, чему там теряться при одном плане счетов.
54 Aleks73
 
10.07.24
16:57
(48) таким образом, и счёт и наименование являются уникальными, но зашифрованными?  Так кто ж тебе мешает отобрать не по "60.01" а по "2U    3N                                                    " ?
55 ALCAPONA
 
10.07.24
17:01
(54)
Во-первых, я не уверен, что эти UID-ы не сменятся при каком-нибудь пересчёте итогов или выгрузке/загрузке БД.

Во-вторых, мне нужна фильтрация по целому списку счетов, а такие UID-ы в коде будут выглядеть как минимум странно.
56 АгентБезопасной Нацио
 
10.07.24
16:59
(53) посоветую: Переписать на прямой запрос, и забыть черные запросы как страшный сон.
57 ALCAPONA
 
10.07.24
17:02
(56)
Увы, не владею такой техникой боя.
58 Ёпрст
 
10.07.24
17:04
(53) прямой запрос вестимо. Ибо отключив sql , ваш запрос сильно того, замедлится.
В дбф такой проблемы нет, а в sql многие чОрные запросы не работают как нннадо, то же вхождение в список и т.д.
59 Aleks73
 
10.07.24
17:17
(55) Во-первых, ты можешь изучить или протестировать, в каких случаях меняется уид. Во-вторых, тебе шашечки - или ехать?
Тем более что (57)
60 Ёпрст
 
10.07.24
17:24
Ну, как временная мера, попробовать в копии счет на счет.основной поправить в доке
61 Злопчинский
 
10.07.24
18:51
(57) даже понятно почему не прижился у нас карате - русский никогда не бил от бедра, а рубил сплеча... ;-)
62 Злопчинский
 
11.07.24
15:08
Ну так в итоге что?
Галактика волнуется...
63 Ёпрст
 
11.07.24
16:03
(62) см (51)