Не провоцируйте СКД, или пример "как не надо"

10.06.19

Разработка - СКД

Пример того, что не нужно использовать в запросах, чтобы не провоцировать СКД.

В данной заметке разберём конкретный пример конструкции, которую лучше не использовать в запросах, чтобы не удивляться результату СКД.

 

СКД — это волшебная система. Каждый раз удивляемся, сколько можно сэкономить времени, с умом используя её возможности. Однако, как известно, есть у неё и разные «особенности». И их тоже лучше знать.

 

Возьмём, к примеру, такую ситуацию.

ВЫБРАТЬ
    Валюты.Ссылка КАК Ссылка,
    Валюты.Наименование КАК Наименование,
    Валюты.Код КАК Код,
    Валюты.Наименование = "" ИЛИ Валюты.Код = "" КАК ОшибкаЗаполнения
ИЗ
    Справочник.Валюты КАК Валюты

 

Есть справочник с наименованием и кодом. Мы хотим вывести его элементы. И по каждому выводим колонку «ОшибкаЗаполнения» (булево). Колонка будет содержать значение Истина, когда Наименование или Код пустое.

Результат выполнения:

Вроде всё хорошо. Но предположим, что нам нужно теперь в полученном отчёте вывести только те записи, у которых «Ошибка заполнения» = Нет.

Накладываем отбор и выводим:

Неожиданный результат, верно?

 

Но для начала на таком простом запросе лучше самому попробовать добавить условие отбора. Не будем сейчас соревноваться в красоте запроса, а просто представим себя на месте СКД. Как бы она подставила наш отбор «Ошибка заполнения» = Нет?

 

  1. Выносим поле в секцию ГДЕ:
    ГДЕ Валюты.Наименование = "" ИЛИ Валюты.Код = ""

  2. Оборачиваем в скобки:
    ГДЕ (Валюты.Наименование = "" ИЛИ Валюты.Код = "")

  3. Сравниваем с значением отбора:
    ГДЕ (Валюты.Наименование = "" ИЛИ Валюты.Код = "") = ЛОЖЬ

 

Получаем такой текст запроса. Это то, чего мы ожидаем увидеть от СКД.

 

ВЫБРАТЬ
    Валюты.Наименование КАК Наименование,
    Валюты.Код КАК Код,
    Валюты.Наименование = "" ИЛИ Валюты.Код = "" КАК ОшибкаЗаполнения
ИЗ
    Справочник.Валюты КАК Валюты
ГДЕ
    (Валюты.Наименование = "" ИЛИ Валюты.Код = "") = ЛОЖЬ

Теперь же нам нужно отловить «реальный» текст запроса. Для этого добавляем в наш отчёт кусочек примитивного кода:

Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
    
    КомпоновщикМакета   = Новый КомпоновщикМакетаКомпоновкиДанных;     
    МакетКомпоновки     = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.ПолучитьНастройки());
    НаборДанных         = МакетКомпоновки.НаборыДанных.Получить(0);
    
КонецПроцедуры

 

Ставим точку останова в конце процедуры, запускаем отладчик, переоткрываем отчёт и снова формируем его с наложенным отбором «Ошибка заполнения» = Нет

 

В результате в переменной НаборДанных можно увидеть свойство «Запрос».

Мы для наглядности в самом тексте запроса заменили автоматически генерируемый параметр на его значение, которое можно увидеть в переменной МакетКомпоновки.ЗначенияПараметров.

ВЫБРАТЬ
    Валюты.Наименование КАК Наименование,
    Валюты.Код КАК Код,
    Валюты.Наименование = "" ИЛИ Валюты.Код = "" КАК ОшибкаЗаполнения
ИЗ
    Справочник.Валюты КАК Валюты
ГДЕ
    (Валюты.Наименование = "" ИЛИ Валюты.Код = "" = ЛОЖЬ)

В чём ошибка?

 

Если вернуться к нашим шагам наложения условия, можно понять, что СКД пропустила шаг 2.

 

  1. Выносим поле в секцию ГДЕ:
    ГДЕ Валюты.Наименование = "" ИЛИ Валюты.Код = ""

  2. Оборачиваем в скобки:
    ГДЕ (Валюты.Наименование = "" ИЛИ Валюты.Код = "")

  3. Сравниваем с значением отбора:
    ГДЕ (Валюты.Наименование = "" ИЛИ Валюты.Код = "") = ЛОЖЬ

 

Выходит, что логика СКД была такая:

 

  1. Выносим поле в секцию ГДЕ:
    ГДЕ Валюты.Наименование = "" ИЛИ Валюты.Код = ""

  2. Сравниваем с значением отбора:
    ГДЕ Валюты.Наименование = "" ИЛИ Валюты.Код = "" = ЛОЖЬ

 

Однако, без оборачивания в скобки, СКД полностью меняет смысл условия. В результате мы и видим такой результат. В поле формула отрабатывает нормально, но вот фильтрация работает неверно.

Интересно, что если данное поле убрать из запроса и вынести в вычисляемые поля СКД, то такой ошибки не будет.

 

 

 

Но что, если вынести поле в вычисляемые для нас не выход? Всё просто, применяем другую конструкцию и вместо:

Валюты.Наименование = ""
ИЛИ Валюты.Код = "" КАК ОшибкаЗаполнения

пишем

ВЫБОР
   КОГДА Валюты.Наименование = "" ИЛИ Валюты.Код = ""
        ТОГДА ИСТИНА
   ИНАЧЕ ЛОЖЬ
КОНЕЦ КАК ОшибкаЗаполнения

Не так красиво, но зато теперь СКД точно не накосячит, ведь просто подставит сравнение к концу поля.

Возможно, Вам больше понравится иначе изменить условие запроса, но в данный момент это не принципиально. Главное, при написании подобных запросов помнить про эту «особенность». Ведь лучше не провоцировать СКД.

 

Замечено давненько. Но сейчас протестировано на платформах: 8.3.12.1595, 8.3.14.1779.

См. также

SALE! 15%

Инструментарий разработчика Роли и права Запросы СКД Программист Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Конфигурации 1cv8 Платные (руб)

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

10000 руб.

02.09.2020    159669    875    399    

862

Запросы СКД Программист Стажер Система компоновки данных Россия Бесплатно (free)

Часто при разработке отчетов в СКД возникает ситуация, когда не совсем понятно, почему отчет выводит не те данные, которые нужны, либо не выводит вовсе. Возникает потребность увидеть конечный запрос, который формирует СКД. Как это сделать, рассмотрим в этой статье.

15.05.2024    8726    implecs_team    6    

47

Инструментарий разработчика СКД Программист Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

По выбранной схеме компоновки данных генерирует программный код, который генерирует СКД, аналогичную исходной схеме. Есть дополнительные инструменты для просмотра дерева схемы, сравнение исходной схемы и полученной по коду, а также сравнение изменений в сгенерированном коде для исходной схемы и для измененной.

3 стартмани

05.02.2024    7011    56    obmailok    21    

79

Запросы СКД Программист Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Абонемент ($m)

Есть список полей в виде текста, или запрос - закидываем в набор СКД.

1 стартмани

31.01.2024    3155    5    Yashazz    1    

34

СКД WEB-интеграция Программист Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Долгое время поддерживаю web-портал, в котором появилась необходимость создавать отчеты. Просмотрев различные фреймворки на js, я решил сделать свое решение, которое позволяло бы быстро разрабатывать и добавлять новые отчеты на web-портал.

2 стартмани

11.12.2023    10828    23    John_d    25    

124

СКД Программист Платформа 1С v8.3 Система компоновки данных Конфигурации 1cv8 Бесплатно (free)

Рассмотрим еще не получивший широкого распространения способ работы с внешними данным в СКД. В процессе обсуждения работы с СКД выяснилось, что многие не знакомы со способом помещения туда временной таблицы, полученной предварительно. Статья будет полезна разработчикам, знакомым с программным созданием СКД.

05.12.2023    8052    PROSTO-1C    15    

68
Отзывы
45. SeiOkami 3517 11.06.19 10:51 Сейчас в теме
Важно понимать, что целью статьи не является классифицировать те или иные конструкции как "документированными" или же нет.
И не решать, что использовать "хорошо", а что "плохо".
А лишь показать пример, как реагирует СКД на данный вид конструкций. И поэтому в заголовке написано: пример "как не надо". Не потому что это "плохо", а потому что приводит к конкретной проблеме.

Мы не пытаемся кого-то осуждать или хвалить. И не плюём с высока на разработчиков, которые ещё не успели перелопатить все жёлтые талмуды. Мы лишь наглядно на примере показываем, почему это может привести к ошибке.

Если кто-то из комментаторов хочет написать статью с полным и доскональным разбором документации 1С, то это будет замечательным вкладом в сообщество. Удачи!
purgin; Cерый; user809597; kris_barbina; Deslime; MikhailGirshberg; MegasXXX; WellMaster; arxus; and03122008@gmail.com; Student1C; mark_oilbass; elephant_x; alevnev; Bene_Valete; json; Fox-trot; eden_gmail; pm74; milanse; bulpi; Evil Beaver; +22 1 Ответить
91. Sashares 35 25.10.19 16:07 Сейчас в теме
(0)Для информации.
В 8.3.16 исправили.
96. echo77 1906 31.10.21 07:01 Сейчас в теме
(0) Судя по всему баг поправили (проверял на платформах 8.3.16.1224, 8.3.18.1289. Режим совместимости не влияет на поведение)
Вот так теперь выглядит запрос, генерируемый компоновщиком:
ВЫБРАТЬ
	Валюты.Ссылка КАК Ссылка,
	Валюты.Наименование КАК Наименование,
	Валюты.Код КАК Код,
	Валюты.Наименование = ""
		ИЛИ Валюты.Код = "" КАК ОшибкаЗаполнения,
	Валюты.Представление КАК СсылкаПредставление
ИЗ
	Справочник.Валюты КАК Валюты
ГДЕ
	(Валюты.Наименование = ""
			ИЛИ Валюты.Код = "") = &П
Показать


p.s. Статью плюсовал в свое время. Спасибо.
Остальные комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. VmvLer 10.06.19 18:24 Сейчас в теме
Я не понял где косячит СКД, как-то сумбурно написано.

Условия в тесте статьи сами по себе кривоваты, да и использование
ИЛИ в условиях я видел только в типовом коде современных конфигураций.
Если запрос пишет человек с опытом, то никаких ИЛИ в запросе не будет.
3. SeiOkami 3517 10.06.19 18:36 Сейчас в теме
(1) это простейший пример того, когда СКД неверно накладывает отбор на поле.
Приемлимость использования в запросах приставки ИЛИ - это другой вопрос. Но однозначно СКД должна корректно накладывать отбор, несмотря на религиозные предпочтения разработчика.
Deslime; MegasXXX; A_Max; edgt; Brawler; bulpi; Evil Beaver; mivari; kiruha; Raskad; YLioY; n2m3m; d4rkmesa; Bene_Valete; json; Ashandy; artbear; +17 1 Ответить
5. VmvLer 10.06.19 18:41 Сейчас в теме
(3) СКД накладывает отбор абсолютно корректно, но в рамках той логики которую ввел разработчик.

Если логика иррациональна, то и отбор ей соответствует.
unichkin; ltfriend; +2 4 Ответить
2. VmvLer 10.06.19 18:34 Сейчас в теме
Логически верным будет выражение поля
    ВЫБОР
       КОГДА Валюты.Наименование = ""
            ТОГДА ИСТИНА
       КОГДА Валюты.Код = ""
            ТОГДА ИСТИНА
       ИНАЧЕ ЛОЖЬ
    КОНЕЦ КАК ОшибкаЗаполнения

т.к. первое условие выбора наиболее вероятно

я не знаю кому приходит в голову такое выражение поля
Валюты.Наименование = "" ИЛИ Валюты.Код = "" КАК ОшибкаЗаполнения


ЗЫ: неполадка из ничего, никто так выражение поля не пишет - вы первый у кого я увидел такой нонсенс.
СКД права, что дала по рукам.
reneyr; user811769; Sekator; kirillkr; Dream_kz; +5 3 Ответить
4. SeiOkami 3517 10.06.19 18:37 Сейчас в теме
(2) СКД не дала по рукам, а сломала запрос. Вы пытаетесь похвастаться праведностью своих запросов, а не вникать в суть проблемы.
user809597; FomkRo; Deslime; Crazy_Max; MegasXXX; tulakin_s; elephant_x; edgt; thevist; dmpas; Brawler; bulpi; Raskad; yku; sergathome; YLioY; n2m3m; d4rkmesa; mivari; pbabincev; Wern03; Ashandy; +22 1 Ответить
6. VmvLer 10.06.19 18:45 Сейчас в теме
(4) Я не нуждаюсь в ваших оценках моего вероисповедания, мы же тут говорим о логике, нет?
10. Mortum 10.06.19 21:29 Сейчас в теме
(2) писать 7 строк вместо одной с точно таким же смыслом. Вам платят за объём кода?
7. Wern03 20 10.06.19 20:12 Сейчас в теме
Причем тут ИЛИ. С тем же успехом можно поставить И и будет та же ошибка. Ошибка интересная, спасибо. возьму на заметку.
8. echo77 1906 10.06.19 20:15 Сейчас в теме
(0)Похоже на баг компоновщика макета СКД. В 1С уже написали?
Brawler; zqzq; +2 Ответить
9. Mortum 10.06.19 21:26 Сейчас в теме
Если не ошибаюсь, то возможность писать такое условие в выбранных полях появилось в платформе не сразу. А в скд просто забыли этот случай обработать.
11. qwinter 683 11.06.19 07:55 Сейчас в теме
(9), (4) такой документированной возможности не было и нет. Логические операции нельзя использовать в выражениях. В документации черным по белому написано:
Во многих конструкциях языка запросов могут использоваться выражения. Выражения языка запросов описываются следующим набором правил:

<Выражение>

<Разыменование поля> |
<Агрегатная функция> |
<Встроенная функция> |
<Операция выбора> |
<Приведение типа>[.<Разыменование поля>] |
<Значение> |
<Выражение> <Бинарная операция> <Выражение> |
<Унарная операция> <Выражение> |
( <Выражение> )

<Бинарная операция>

+ | - | * | /

<Унарная операция>

- | +
Показать

https://its.1c.ru/db/v8310doc#bookmark:dev:TI000000494

Когда же 1Сники начнут ну хоть немного документацию читать.
GreenDragon; +1 1 Ответить
12. SeiOkami 3517 11.06.19 08:07 Сейчас в теме
(11)
В выражениях к значениям соответствующих типов могут применяться бинарные и унарные операции.


Не вижу ни противоречий, ни запретов использования конструкции, ни предупреждений, что СКД их сломает. При этом в вычисляемых полях они обрабатываются без проблем.

P.S.: Эта статья как раз и нужна для того, чтобы показать конструкцию, которую "не надо". Именно потому, что среднестатистический разработчик нигде не видел такого предупреждения, посему может наткнуться на особенность СКД уже в проде.
user809597; MegasXXX; tulakin_s; bulpi; +4 Ответить
13. qwinter 683 11.06.19 08:14 Сейчас в теме
(12)
ни запретов использования конструкции
лицензионное соглашение где запрещено использовать недокументированные возможности, как я понимаю вы тоже не читали?
ни предупреждений
предупреждение, что недокументированное использование функций будет отрабатывать неверно??? Вы сейчас серьезно?????? С таким подходом только к врачу... Очень жаль ваших клиентов.
GreenDragon; +1 3 Ответить
15. SeiOkami 3517 11.06.19 08:18 Сейчас в теме
(13) вы пытаетесь привязаться к бумажкам, я же говорю, что обычному разработчику эта конструкция не покажется чем-то неизведанным и недокументированным. Простые логические операции. И программист может их использовать, не подозревая, что это приведёт к ошибке СКД. Мне, как автору статьи, важно донести эту особенность, а не решать, кто виноват.
TeMochkiN; user1012723; Deslime; MegasXXX; bulpi; molodoi1sneg; +6 Ответить
22. qwinter 683 11.06.19 08:57 Сейчас в теме
(15)
обычному разработчику говнокодеру
Называйте вещи своими именами.
user848614; GreenDragon; +2 10 Ответить
24. Evil Beaver 8244 11.06.19 08:57 Сейчас в теме
(11)
Когда же 1Сники начнут ну хоть немного документацию читать

И где в вашей цитате запрет на использование логических операций в выражениях? Логические И/ИЛИ, на минуточку, тоже бинарные операции. Я-то знаю, что в грамматике запросов логические выражения описаны другим нетерминалом, но в вашей цитате ничего про него нет.
25. dhurricane 11.06.19 09:10 Сейчас в теме
(24) Запрета нет. Но приведен список операций, называемых бинарными.
43. qwinter 683 11.06.19 10:23 Сейчас в теме
(24)
И где в вашей цитате запрет на использование логических операций в выражениях?
Нет слов...
Логические И/ИЛИ, на минуточку, тоже бинарные операции.
На минуточку И/ИЛИ с точки зрения языка запросов 1С названы, цитирую, "ключевыми словами". Прочитать про это можно по той же ссылке, что я привел выше.
48. Evil Beaver 8244 11.06.19 16:08 Сейчас в теме
(43) вот что вас так тянет язвить-то, а? Ведь специально для Вас написал, что знаю про то, что в грамматике И и ИЛИ названы отдельно. Нет, все равно вы мне тыркаете, что я ссылку не читал.. Я вообще-то промышленный парсер под язык запросов писал, и почти каждую продукцию грамматики помню безо всяких ссылок на ИТС. Будьте вежливее, пожалуйста.
Diversus; Deslime; ValentinGushchin; bulpi; +4 Ответить
54. GreenDragon 12.06.19 17:59 Сейчас в теме
(48) Тут просто автор заявляет, что
...Важно понимать, что целью статьи не является классифицировать те или иные конструкции как "документированными" или же нет.
И не решать, что использовать "хорошо", а что "плохо".
А лишь показать пример, как реагирует СКД на данный вид конструкций.


И при этом использует "ИЛИ" в секции условий. На не рекомендуемый вид конструкций СКД реагирует плохо. Вот прям в первом комментарии об этом написано, а потом ещё с десяток подобных комментариев, но автор упоролся упёрся и настаивает, вот все и нервничают, повышая градус неадекватности.
62. Evil Beaver 8244 13.06.19 17:32 Сейчас в теме
(54) Как у вас всех так получается читать объяснения автора и в упор их не понимать...? Почему вы противопоставлете друг-другу тезисы "показать пример, как СКД реагирует" и "нельзя использовать ИЛИ"?? Это же несвязанные между собой вещи. Использование ИЛИ - иногда(!) ведет к плохому плану выполнения запроса. НО - операция ИЛИ это синтаксически корректная конструкция, ее в принципе можно применять.

Далее, автор пишет, что можно написать вместо ИЛИ просто "И" и будет все равно ошибка. Никто это в упор не видит и начинает втирать, что ИЛИ неоптимально. Да, неоптимально. Но речь-то не об этом! Речь о том, что СКД, накладывая условие на поле, накладывает его не совсем ожидаемым образом.

И да, это даже не ошибка СКД, в ее действиях есть логика, а для таких вещей надо применять вычисляемые поля или иные способы обхода (там же в статье).

Но почему-то все считают, что корень всех бед статьи и ее автора - применение ИЛИ...
TeMochkiN; chernyjkot; Deslime; BomjBandit; Kinestetik; A_Max; Redokov; +7 Ответить
64. Sashares 35 13.06.19 18:19 Сейчас в теме
(62)
И да, это даже не ошибка СКД, в ее действиях есть логика

Нет в ней логики.
Отбор накладывается по полю, а не по части поля.
Почему СКД не знает о возможности использования логических выражениях в качестве полей, вопросы к Лейбовичу =)
MegasXXX; A_Max; +2 Ответить
65. GreenDragon 13.06.19 18:29 Сейчас в теме
(62) Андрей, при всём моём уважении. Комментарий (14)
79. Evil Beaver 8244 13.06.19 21:31 Сейчас в теме
(65) При всем моем уважении, комментарий 14 нелогичен. Плохой запрос или хороший в данном случае роли не играет. Речь о необычном поведении СКД при использовании необычных полей, и только. Система должна иметь понятный набор поведений независимо от качества запроса. В данном случае СКД ведет себя не так, как вела бы с полем "ВЫБОР".

Навскидку, попробуйте провести эксперимент не с ИЛИ, а просто с арифметическим выражением, например
ВЫБРАТЬ ПолеРегистра + 2 КАК НаДваБольше
и условие на это поле наложить.

СКД отработает нормально или нет?
TeMochkiN; +1 Ответить
85. dhurricane 14.06.19 06:06 Сейчас в теме
(79) Эксперимент показал, что СКД отработает ровно также, как и в примере автора поста, т.е. добавит выражение поля в отбор как есть, без скобок. Но здесь нам на руку играет больший приоритет операции сложения.
86. Evil Beaver 8244 14.06.19 06:38 Сейчас в теме
(85) Спасибо! Что и требовалось доказать - оптимальность или неоптимальность запроса - это не то, что рассказывается в статье.
TeMochkiN; A_Max; +2 Ответить
68. GreenDragon 13.06.19 18:42 Сейчас в теме
(62) И ещё. Автор в конце как правильный рецепт предлагает вставлять инструкцию ВЫБОР. В секции ГДЕ. Угу. Дальше он предложит 2 раза в цикле запросы выполнять? Ненуачо, работает жи?

Вопрос - если скормить условие вида: "НЕ (условие1 ИЛИ условие2)"?
81. Evil Beaver 8244 13.06.19 21:33 Сейчас в теме
(68) ВЫБОР в секции ГДЕ - ни разу не криминал. В типовых - полно такого. Зависит не от оператора ВЫБОР, а от того, что у него внутри. Если поле составного типа - то да, будет трэш.
87. GreenDragon 14.06.19 08:13 Сейчас в теме
(81) А индексы используются при такой конструкции?
Я про вот это:
https://its.1c.ru/db/v8std#content:658:hdoc
"Основное условие должно содержать только такие операции, которые позволяют выполнять поиск по индексу"
88. Evil Beaver 8244 14.06.19 14:26 Сейчас в теме
(87) Могут и использоваться. Зависит от того, что конкретно написано в ВЫБОР и от состава индекса.
89. GreenDragon 14.06.19 15:04 Сейчас в теме
(88) У автора в секции ГДЕ используется вполне конкретное выражение. Автор использует оператор ВЫБОР в основном , а не в дополнительном условии Ниже скриншот, так я подозреваю, что вы не смотрели ссылку на стандарт.
Прикрепленные файлы:
90. dhurricane 14.06.19 15:34 Сейчас в теме
(89) Я позволю себе встрять в Ваш диалог, извините. Уж очень интересно, какое альтернативное решение предложили бы Вы?
63. Sashares 35 13.06.19 17:54 Сейчас в теме
(11)
такой документированной возможности не было и нет. Логические операции нельзя использовать в выражениях

Можно с 8.3.6.

(11)
Когда же 1Сники начнут ну хоть немного документацию читать.

Действительно. Когда же начнут?

(1) А вот то что СКД не корректно воспринимает условие, в дополнение к статье стоило бы написать на v8@1c.ru
Прикрепленные файлы:
66. dhurricane 13.06.19 18:33 Сейчас в теме
(63)
Можно с 8.3.6.
Чуть ниже я писал про это. Мне дали ответ, что в документации в отношении логических операций также отсутствует разрешение на использование бинарных операций "И/ИЛИ". Почитал документацию, оспорить не смог, стало быть ответ справедливый.
67. Sashares 35 13.06.19 18:42 Сейчас в теме
(66)
Мне дали ответ, что в документации в отношении логических операций также отсутствует разрешение на использование бинарных операций "И/ИЛИ".

Ох уж эти знатоки. Все то они знают.
https://its.1c.ru/db/v836doc#bookmark:dev:TI000000464
Прикрепленные файлы:
69. dhurricane 13.06.19 18:49 Сейчас в теме
(67) Не-не, там в пункте 8.2.17.1 дается определение "логической операции".
70. spacecraft 13.06.19 19:27 Сейчас в теме
(69) а если так?
Прикрепленные файлы:
71. dhurricane 13.06.19 19:36 Сейчас в теме
(70) Я описался комментарием выше. Речь была о "логических выражениях". На Вашем снимке, во-первых, речь про условия отбора, а не поля выборки. А во-вторых, в выделенном Вами тексте явно разделены понятия логического выражения и операторов "И/ИЛИ".
72. spacecraft 13.06.19 20:25 Сейчас в теме
(71) читаем: "В простейшем случае условие является выражением, результат которого имеет значение логического типа. Логические выражения описаны в следующем разделе.

Условия могут определяться и как более сложные логические выражения, где фигурируют простые логические выражения, соединенные между собой с помощью логических операторов И, Или, Не."

Про поля выборки, то там тоже упоминаются логические выражения. Так что актуально и для них.
73. dhurricane 13.06.19 21:00 Сейчас в теме
(72) Извините, но не согласен. Условия - могут определяться и как более сложные логические выражения. Про поля выборки такое не сказано, следовательно определяться как более сложные, чем описано "в следующем разделе", они быть не могут.

Я бы не хотел настаивать на точке зрения, что описанная в статье конструкция некорректна. Сам ею не раз пользовался и был уверен, что такой подход вполне допустим. Но после прочтения комментариев к настоящей статье сколько бы я ни вчитывался в документацию к платформе, я не смог разглядеть тому подтверждение. Опять же, я и не претендую на то, что всегда правильно могу прочитать и понять официальную документацию.
74. spacecraft 13.06.19 21:15 Сейчас в теме
(73) хорошо. Далее:

"Логическим выражением может быть:
● обычное выражение языка запросов, если его результат имеет логический тип"

"Выражения языка запросов описываются следующим набором правил:
<Разыменование поля> |
<Агрегатная функция> |
<Встроенная функция> |
<Операция выбора> |
<Приведение типа>[.<Разыменование поля>] |
<Значение> |
<Выражение> <Бинарная операция> <Выражение> |
<Унарная операция> <Выражение> |
( <Выражение> )
"
75. dhurricane 13.06.19 21:20 Сейчас в теме
(74) А чуть ниже список бинарных операций, среди которых нет "И/ИЛИ":
+ | – | * | /
76. spacecraft 13.06.19 21:24 Сейчас в теме
(75) да, что-то не указано.
Но все равно конструкция вида (<Логическое выражение> И <Логическое выражение>) это тоже логическое выражение.
77. dhurricane 13.06.19 21:29 Сейчас в теме
(76) Конечно согласен. Но к сожалению, лишь на интуитивном уровне. Попробую, наверное, на днях "пошерстить" партнерский форум в поисках ответа, либо задать вопрос самому. Вдруг я не "утону в минусах", да еще и получу разъяснения сотрудников 1С. :)
78. spacecraft 13.06.19 21:29 Сейчас в теме
(75) вот пример бинарной операции ИЛИ
ВЫБРАТЬ
	ПриобретениеТоваровУслуг.Ссылка КАК Ссылка,
	ПриобретениеТоваровУслуг.Проведен
		И НЕ ПриобретениеТоваровУслуг.ПометкаУдаления КАК Актуально
ИЗ
	Документ.ПриобретениеТоваровУслуг КАК ПриобретениеТоваровУслуг


Вполне себе рабочая конструкция.
80. dhurricane 13.06.19 21:32 Сейчас в теме
(78) Да, как я уже выше писал, сам использовал подобные конструкции, и осечек до сих пор не наблюдал.

И простите за занудство, но Ваше выражение избыточно: документ не может быть одновременно проведен и помечен на удаление. Если, конечно, кто-то накануне не работал с БД напрямую.
82. spacecraft 13.06.19 21:33 Сейчас в теме
(80) это всего лишь синтетический код для проверки работы бинарной операции ИЛИ. Ничего более.
83. dhurricane 13.06.19 21:35 Сейчас в теме
(82) Еще раз простите, что не сдержался. :)
84. spacecraft 13.06.19 21:36 Сейчас в теме
(80)
документ не может быть одновременно проведен и помечен на удаление

может :)
"Если документ помечен на удаление, то не допускается выполнение проведения этого документа. Однако допускается наличие движений у документа, помеченного на удаление, так как в 1С:Предприятии 8 понятие проведенности документа не связано жестко с наличием движений."
Хотя это наверно не про флаг "Проведен".
14. Lucifer93 95 11.06.19 08:18 Сейчас в теме
Автор, тут дело в том, что Вы показываете пример плохого кода и говорите, что СКД его неправильно обработала. Для того, чтобы демонстрировать ошибку СКД покажите пример хорошего кода, который СКД обработает неправильно и не будет никаких вопросов к Вам. Ждем от Вас пример хорошего кода, который СКД отработает неправильно.
GreenDragon; jONES1979; +2 1 Ответить
16. SeiOkami 3517 11.06.19 08:20 Сейчас в теме
(14) независимо от оптимизированности запроса, СКД совершает ошибку. Читатель о ней теперь ознакомлен, и лишний раз подумает, прежде чем использовать конструкцию. У меня нет цели "заваливать" СКД.
TeMochkiN; Evil Beaver; +2 Ответить
17. Lucifer93 95 11.06.19 08:22 Сейчас в теме
(16) "независимо от оптимизированности запроса" Вот эта фраза очень интересная у Вас получается. То есть давайте писать кривые запросы, а потом жаловаться, что программа не так их понимает?!
GreenDragon; +1 2 Ответить
18. SeiOkami 3517 11.06.19 08:24 Сейчас в теме
(17) если писать неоптимальные запросы, и ожидать, что будет работать неоптимально
Но здесь СКД совершает грубейшую ошибку. И это уж точно никто не ожидает.
TeMochkiN; edgt; bulpi; +3 Ответить
19. Lucifer93 95 11.06.19 08:26 Сейчас в теме
(17) Сейчас будет идеализировано, но по сути Вы говорите: давайте я в запросе вместо "ВЫБРАТЬ" буду писать "ХОЧУ ПОЛУЧИТЬ ДАННЫЕ" и пусть программа меня поймет, а если не поймет - она виновата.




(18)
В данном случае, если учитывать стандарты разработки на 1с, то ошибку совершаете только Вы. И то, что Вы наткнулись на такую ошибку является следствием написанием Вами кривого запроса. Не вижу смысла с Вами продолжать беседу. Если Вы пишите криво не нужно ожидать, что программа отработает корректно
20. SeiOkami 3517 11.06.19 08:30 Сейчас в теме
(19)вы приводите странный пример. Запрос вполне ясный. Возможно, он не так оптимизирован (хотя это максимально спорное утверждение). Но он верен и очевиден. И в статье расписано, как должен накладываться отбор. Более того, СКД сама его так и накладывает, когда используются вычисляемые поля. Но с тем же самым полем косячит, когда он в запросе. Очевидно, что это ошибка. И очевидно, что это нужно знать при разработке. Иначе можно напороться. И уже не важно будет, кто здесь виноват
23. dhurricane 11.06.19 08:57 Сейчас в теме
(20)
Но он верен
Коллега, именно к этой фразе у Ваших оппонентов претензия. Он не неоптимизирован, он именно не верен с точки зрения документации к платформе. По приведенной ссылке явно указано, какие операции и над какими операндами можно выполнять в полях выборки. Сложение, вычитание и прочие арифметические операции, например, в этом списке есть, а вот логических - нет. Поэтому и следует делать вывод, что использование операции "ИЛИ" в поле выборки запроса без оператор "ВЫБОР" недопустимо.

(11) Честно говоря, для меня также стало открытием, что использовать логические операторы в таком виде в секции "ВЫБРАТЬ" недопустимо. Я перечитал соответствующие разделы документации и для платформы 8.3.10, и для 8.3.14, и нигде не смог найти "разрешение" на использование оператора "ИЛИ". Почему открытие? Потому, что я хорошо помню, что где-то видел это самое "разрешение". И копнув глубже нашел его в списке изменений платформы 8.3.6:
Реализована возможность использования логических выражений в описании поля выборки и в выражениях фильтрации результатов запроса (предложение ГДЕ).

Данная возможность не предоставлялась.
При необходимости использования логического выражения в описании поля выборки было необходимо использовать операцию выбора.

Источник: https://dl03.1c.ru/content/Platform/8_3_14_1779/1cv8upd_8_3_14_1779.htm#b1d73456-26c0-11e4-98ab-e61f135f174b
Далее идут ссылки на ИТС, где должно быть более подробно описано изменение, но ничего подобного в тексте узнать не удалось.

Так что для меня теперь это открытый вопрос. Что это: ошибка в документации или неверная интерпретация нововведений в платформе?
eden_gmail; +1 Ответить
42. SlavaKron 11.06.19 10:23 Сейчас в теме
(23) Судя по всему, 1С автоматически переделывает логические выражения в секции ВЫБРАТЬ в CASE структуру, потому что, например, в T-SQL нельзя использовать булево в выборке – оно не является типом данных.
44. qwinter 683 11.06.19 10:34 Сейчас в теме
(23)
Так что для меня теперь это открытый вопрос. Что это: ошибка в документации или неверная интерпретация нововведений в платформе?
Нет никакого противоречия, логическое выражение это
В языке запросов в операциях выбора и в условиях отборов используются логические выражения.

<Логическое выражение>

<Выражение> |
(<Выражение> | <Логическое выражение>) <Операция сравнения> (<Выражение> | <Логическое выражение>) |
<Выражение> [НЕ] В [ИЕРАРХИИ] (<Список значений>) |
<Выражение> [НЕ] В [ИЕРАРХИИ](<Описание запроса>) |
<Выражение> [НЕ] МЕЖДУ <Выражение> И <Выражение> |
<Выражение> ЕСТЬ [НЕ] NULL |
<Выражение> ССЫЛКА <Имя таблицы> |
<Выражение> [НЕ] ПОДОБНО <Литерал типа СТРОКА>
[СПЕЦСИМВОЛ <Литерал типа СТРОКА>]

<Операция сравнения>

> | < | = | >= | <= | <>

<Список значений>

<Выражение>[, <Выражение> [, …]]

Логическим выражением может быть:

● обычное выражение языка запросов, если его результат имеет логический тип;

● операция сравнения двух выражений языка запросов; выполняется в соответствии с правилами сравнения значений, описанными в разделе «Правила сравнения значений»;

● оператор проверки совпадения/несовпадения значения выражения с одним из перечисленных или со значениями, содержащимися в результате другого запроса;

● оператор проверки вхождения значения выражения в диапазон;

● оператор проверки значения выражения на NULL;

● оператор проверки ссылочного значения выражения на ссылку на определенную таблицу;

● оператор проверки строкового значения наподобие шаблону.

При сравнении значений используются правила сравнения значений, описанные ниже.
Показать
https://its.1c.ru/db/v8310doc#bookmark:dev:TI000000500

Разрешения на использования логических операторов языка запросов в выражениях там нет.
21. milanse 38 11.06.19 08:39 Сейчас в теме
Спасибо, хорошее замечание к работе СКД.
Те кто говорят про или в условиях, вообще ничего не понимают?
TeMochkiN; tulakin_s; bulpi; sergathome; +4 Ответить
26. Lucifer93 95 11.06.19 09:18 Сейчас в теме
(21) Боюсь, что Вам нужно перечитать правила формирования запросов. Они отлично описаны в Настольная книга 1С:Эксперта по технологическим вопросам. 2 издание и там понятным языком объясняется почему использование ИЛИ в запросах является плохим.
GreenDragon; +1 Ответить
29. d4rkmesa 11.06.19 09:39 Сейчас в теме
(26) Хватит бредить уже.
TeMochkiN; tulakin_s; sergathome; +3 Ответить
37. Lucifer93 95 11.06.19 10:07 Сейчас в теме
(29)Отличный комментарий и ,главное, по делу и аргументированный.
GreenDragon; +1 Ответить
31. milanse 38 11.06.19 09:47 Сейчас в теме
(26) Не надо бояться, надо делать. Второе издание не читал, первое лежало на краю стола, не успел прочитать, кто-то упер. Буду благодарен за скриншот выделенного жирным шрифтом обведенного в рамочку предупреждения "НИКОГДА, СЛЫШИТЕ НИКОГДА НЕ ИСПОЛЬЗУЙТЕ СЛОВО ИЛИ В ЗАПРОСАХ".
TeMochkiN; GreenDragon; sergathome; +3 Ответить
36. Lucifer93 95 11.06.19 10:07 Сейчас в теме
(31) "В секции ГДЕ логическое ИЛИ использовать тоже не рекомендуется. Следует разбить один запрос на несколько и объединить результаты (при возникновении проблем на данном участке кода). Пояснения — в этой же главе ниже." Вот цитата, которая сохранена у нас для разработчиков, чтобы они не делали глупых ошибок.
GreenDragon; +1 Ответить
38. SeiOkami 3517 11.06.19 10:10 Сейчас в теме
(36) откройте любую типовую и тыкайте пальцем в каждое использование ИЛИ в секции ГДЕ.
Можно быть "сферическим идеальным программистом в вакууме", а можно с умом использовать все возможности языка.
Deslime; bulpi; +2 Ответить
40. Lucifer93 95 11.06.19 10:15 Сейчас в теме
(38) Так в данном случае Вы не используете их с умом. Вы просто пишите ерунду, которую Вам уже правили в постах выше. Я изначально попросил Вас написать качественно и найти ошибку. Никто не говорит, что СКД святая, я говорю Вам напишите запрос ПРАВИЛЬНО и тогда ошибка исчезнет. Вся статья, по сути, не будет иметь никакого смысла, если разработчик будь следовать элементарным правилам написания запроса(на данном этапе). Сделайте нормальный запрос, повторите ошибку и не будет к Вам вопросов.
Возможности языка нужно использовать правильно, а не как Вам захотелось. Вы пытаетесь отверткой забить гвоздь
41. VmvLer 11.06.19 10:16 Сейчас в теме
(38) Дело не в ИЛИ или И.

То что я написал в начале темы детализировано в (34)

хватит бредить(с)
53. GreenDragon 12.06.19 17:45 Сейчас в теме
(38) А, так у вас эталоном являются типовые? Офигеть! Мы тут им баги репортим, а оно вон как! Вам написал уже не один человек про крайнюю нежелательность использования логического оператора "ИЛИ" в секции условий.
27. d4rkmesa 11.06.19 09:36 Сейчас в теме
Вот хохма, набежали свидетели "святого СКД". Сам не использую подобные конструкции, но тут очевидно, что СКД работает не совсем ожидаемым образом, скажем так - не самым очевидным. Впрочем, в консоли СКД результирующий запрос смотрится и исправить можно довольно быстро.
mivari; sergathome; +2 Ответить
32. sergathome 4 11.06.19 09:49 Сейчас в теме
(27) тоже поржал. логика у ребят потрясающая - есть куча дерьма на лестнице в подъезде, на чердаке которого написано, что она там лежит и по лестнице не нужно ходить, хотя она есть... шиза, да и только. угага
TeMochkiN; arxus; bulpi; +3 Ответить
28. toypaul 63 11.06.19 09:36 Сейчас в теме
Все каменты про - "пиши запросы правильно", "читай документацию" вроде как и верные, но к сути вопроса не имеют никакого отношения. суть вопроса в том, что в платформе косяк. нельзя писать ИЛИ - не давай писать. если даешь писать, обрабатывай правильно.

книга про эксперта в ДАННОМ КОНКРЕТНОМ СЛУЧАЕ вообще не к месту упомянута. давайте будем везде запрещать писать ИЛИ - даже в справочниках где пара десятков записей. бред какой-то.
TeMochkiN; echo77; Deslime; arxus; zqzq; bulpi; mivari; CyberCerber; wowik; cdrw3; sergathome; +11 Ответить
33. sergathome 4 11.06.19 09:51 Сейчас в теме
(28) это типичный ФМГ от долгого чтения 1Сной "документации". Простите, но без кавычек оно не работает. Тут целая секта таких фимозников обитает...
30. srub 85 11.06.19 09:43 Сейчас в теме
У меня тоже есть пример, когда СКД отрабатывает не корректно есть запрос

Запрос = Новый Запрос;
Запрос.Текст = 
		"ВЫБРАТЬ
		|	РасчетыСЗаказчикамиОбороты.Организация,
		|	РасчетыСЗаказчикамиОбороты.Заказчик,
		|	РасчетыСЗаказчикамиОбороты.Менеджер,
		|	РасчетыСЗаказчикамиОбороты.Гаражка КАК Гаражка,
		|	СУММА(ЕСТЬNULL(РасчетыСЗаказчикамиОбороты.СуммаПриход, 0)) КАК ПоступлениеОтЗаказчика,
		|	СУММА(ЕСТЬNULL(РасчетыСЗаказчикамиОбороты.СуммаРасход, 0)) КАК РасходПоЗаказчику
		|ПОМЕСТИТЬ ВТ1
		|ИЗ
		|	РегистрНакопления.РасчетыСЗаказчиками.Обороты(&ДатаНачала, &ДатаОкончания, , ) КАК РасчетыСЗаказчикамиОбороты
		|
		|СГРУППИРОВАТЬ ПО
		|	РасчетыСЗаказчикамиОбороты.Организация,
		|	РасчетыСЗаказчикамиОбороты.Заказчик,
		|	РасчетыСЗаказчикамиОбороты.Менеджер,
		|	РасчетыСЗаказчикамиОбороты.Гаражка
		|
		|ИНДЕКСИРОВАТЬ ПО
		|	Гаражка
		|;
		|
		|////////////////////////////////////////////////////////////­////////////////////
		|ВЫБРАТЬ
		|	РасчетыСПеревозчикамиОбороты.Организация,
		|	РасчетыСПеревозчикамиОбороты.Перевозчик,
		|	РасчетыСПеревозчикамиОбороты.Гаражка КАК Гаражка,
		|	РасчетыСПеревозчикамиОбороты.Менеджер,
		|	СУММА(ЕСТЬNULL(РасчетыСПеревозчикамиОбороты.СуммаРасход, 0)) КАК ОплатаПеревозчику,
		|	СУММА(ЕСТЬNULL(РасчетыСПеревозчикамиОбороты.СуммаПриход, 0)) КАК ПриходПоПеревозчику
		|ПОМЕСТИТЬ ВТ2
		|ИЗ
		|	РегистрНакопления.РасчетыСПеревозчиками.Обороты КАК РасчетыСПеревозчикамиОбороты
		|
		|СГРУППИРОВАТЬ ПО
		|	РасчетыСПеревозчикамиОбороты.Организация,
		|	РасчетыСПеревозчикамиОбороты.Перевозчик,
		|	РасчетыСПеревозчикамиОбороты.Гаражка,
		|	РасчетыСПеревозчикамиОбороты.Менеджер
		|
		|ИНДЕКСИРОВАТЬ ПО
		|	Гаражка
		|;
		|
		|////////////////////////////////////////////////////////////­////////////////////
		|ВЫБРАТЬ
		|	ВТ1.Организация КАК Организация,
		|	ВТ1.Заказчик,
		|	ВТ1.Гаражка.СтавкаСЗаказчиком КАК СтавкаСЗаказчиком,
		|	ВТ1.Гаражка.СрокОплатыОтЗаказчиком КАК СрокОплатыЗаказчиком,
		|	ВТ2.Перевозчик,
		|	ВТ1.Гаражка.СтавкаСПеревозчиком КАК СтавкаСПеревозчиком,
		|	ВТ1.Гаражка.СрокОплатыПеревозчику КАК СрокОплатыПеревозчику,
		|	ВТ1.Менеджер,
		|	ВТ1.Гаражка КАК Гаражка,
		|	ВТ1.ПоступлениеОтЗаказчика,
		|	ВТ2.ОплатаПеревозчику,
		|	ВТ1.ПоступлениеОтЗаказчика - ВТ2.ОплатаПеревозчику КАК ОплаченоИзСвоих,
		|	ВТ1.Гаражка.СтавкаСЗаказчиком - ВТ1.ПоступлениеОтЗаказчика КАК ДолгЗаказчика
		|ИЗ
		|	ВТ1 КАК ВТ1
		|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ2 КАК ВТ2
		|		ПО ВТ1.Гаражка = ВТ2.Гаражка
		|ГДЕ
		|	ВТ1.ПоступлениеОтЗаказчика < ВТ2.ОплатаПеревозчику
		|
		|УПОРЯДОЧИТЬ ПО
		|	Организация,
		|	Гаражка";
Показать


В консоли запросов за выбранный период 36 записей. А СКД выдает 6 записей.
sergathome; +1 Ответить
35. unichkin 1579 11.06.19 10:05 Сейчас в теме
(30) не понял, а зачем группировка и выражение isNULL в первых двух запросах? Это ж оборотные таблицы. В выходном запросе почему условие в секции где, а не в соединении?
Почему-то никто не вспоминает про расширение языка запросов для системы компоновки данных, а ведь именно им управляются отборы.
Запрос из статьи можно (нужно) описать так:
ВЫБРАТЬ
Валюты.Ссылка КАК Ссылка,
Валюты.Наименование КАК Наименование,
Валюты.Код КАК Код,
Валюты.Наименование = ""
ИЛИ Валюты.Код = "" КАК ОшибкаЗаполнения
ИЗ
Справочник.Валюты КАК Валюты
{ГДЕ
(Валюты.Наименование = ""
ИЛИ Валюты.Код = "") КАК ОшибкаЗаполнения}

Тогда в результате наложения отбора СКД вернет

ВЫБРАТЬ
Валюты.Наименование КАК Наименование,
Валюты.Код КАК Код,
Валюты.Наименование = ""
ИЛИ Валюты.Код = "" КАК ОшибкаЗаполнения
ИЗ
Справочник.Валюты КАК Валюты
ГДЕ
(Валюты.Наименование = ""
ИЛИ Валюты.Код = "") = &П

___
Хочется здесь добавить - СКД классная штука, но как пользователю нужно понимать что программист лишь автоматизирует его труд, а не создает волшебные кнопки, так и программистам надо понимать что есть инструмент со своей спецификой, который как и многие другие инструменты не умеет вообще ВСЕ.
kirillkr; sergathome; +2 Ответить
39. sergathome 4 11.06.19 10:13 Сейчас в теме
(35) Первое реальное возражение. Да, ***, да, язык СКД ОТЛИЧАЕТСЯ от языка запросов ! В "документации " это звучит абсолютно невнятно и неудивительно, что возникают секты на этой почве. бгы
50. surikateg 11.06.19 20:16 Сейчас в теме
(35)
В СП написано:

При автоматическом заполнении доступных полей запроса выполняются следующие действия:
все поля списка выборки и их дочерние поля становятся доступными для выбора, упорядочивания, группировки, отбора и др.;

Как программист должен догадаться о создании дополнительной конструкции ГДЕ в расширении языка запросов СКД?
52. unichkin 1579 12.06.19 02:33 Сейчас в теме
(50) Нажать "F1" и прочитать про язык расширений компоновки? Навскидку - еще можно поизучать типовые, посмотреть курсы, почитать книги... Суть-то не в СКД. Развиваться надо. Писать много кода, стараться делать это правильно (ИТС имею в виду, хоть обкидайтесь помидорами). Гугл + ИТС + здравый смысл в помощь.
55. surikateg 12.06.19 22:00 Сейчас в теме
(52)
Я как раз и процитировал что по F1 написано. В каких курсах или книгах есть полное описание расширения языка запросов СКД? Гугл не 1с. Оптимальность кода это другой вопрос, синтаксис запроса корректен для платформы, он должен выполнятся правильно.
56. unichkin 1579 12.06.19 23:45 Сейчас в теме
(55)
Я как раз и процитировал что по F1 написано. В каких курсах или книгах есть полное описание расширения языка запросов СКД? Гугл не 1с. Оптимальность кода это другой вопрос, синтаксис запроса корректен для платформы, он должен выполнятся правильно.

В (50) вы утверждаете что это из СП. ctrl + shift + F1, если что. Полного - подозреваю, что ни в каких. Просто с опытом приходит понимание того, что такое СКД, и как с ним жить. И можно хоть 1000 статей написать на тему "вот так не работает!!", я как-то более практично привык смотреть на эту проблему. Хотя тоже много глючков переловил. Мир не идеален) Максимум что можно сделать - попробовать зарегистрировать багу через поддержку.
По поводу синтаксиса - я бы вот не разделял понятия "синтаксис" и "оптимальность". Я бы объединил: все надо делать максимально просто, быстро и понятно. Попробуйте переписать ваш запрос, и посмотрите поймет ли его СКД после этого. Я понятия не имею чего там у платформы в мозгах, но подозреваю что писатели парсеров ориентировались на корректный входящий запрос, а не на то что их будут ловить подводными камнями.
58. surikateg 13.06.19 09:11 Сейчас в теме
(56) В 1с и так язык запросов типа "sql" обрезан по самое не балуйся и давно уже не расширяется, в чем сложность написать нормальный парсер для СКД?
60. unichkin 1579 13.06.19 10:29 Сейчас в теме
(58) Это я думаю к техподдержке вопрос) Однако мне как программисту остается жить с тем, что есть.
34. VmvLer 11.06.19 10:05 Сейчас в теме
Дело не в ИЛИ или И.

Дело в том, что когда в поле присутствует логическое выражение - это выражение целесообразно написать в синтаксисе который будет наиболее верным с точки зрения СУБД.

Как я писал в начале темы, автор высосал неполадку из пальца.
Лично мне, никогда не приходило в голову в поле-выражении логического типа
не использовать Выбор ...Когда.
45. SeiOkami 3517 11.06.19 10:51 Сейчас в теме
Важно понимать, что целью статьи не является классифицировать те или иные конструкции как "документированными" или же нет.
И не решать, что использовать "хорошо", а что "плохо".
А лишь показать пример, как реагирует СКД на данный вид конструкций. И поэтому в заголовке написано: пример "как не надо". Не потому что это "плохо", а потому что приводит к конкретной проблеме.

Мы не пытаемся кого-то осуждать или хвалить. И не плюём с высока на разработчиков, которые ещё не успели перелопатить все жёлтые талмуды. Мы лишь наглядно на примере показываем, почему это может привести к ошибке.

Если кто-то из комментаторов хочет написать статью с полным и доскональным разбором документации 1С, то это будет замечательным вкладом в сообщество. Удачи!
purgin; Cерый; user809597; kris_barbina; Deslime; MikhailGirshberg; MegasXXX; WellMaster; arxus; and03122008@gmail.com; Student1C; mark_oilbass; elephant_x; alevnev; Bene_Valete; json; Fox-trot; eden_gmail; pm74; milanse; bulpi; Evil Beaver; +22 1 Ответить
95. rwn_driver 9 12.02.20 10:22 Сейчас в теме
(45) Хороший пример, но все-таки с точки зрения математической логики проще было бы обратное условие:
ВЫБОР КОГДА Валюты.Наименование <> "" И Валюты.Код <> "" ТОГДА ЛОЖЬ ИНАЧЕ ИСТИНА
46. milanse 38 11.06.19 14:31 Сейчас в теме
Уже предлагали зарегистрировать баг ?
echo77; zqzq; +2 Ответить
47. pm74 203 11.06.19 14:31 Сейчас в теме
Валюты.Наименование = "" ИЛИ Валюты.Код = ""
= НЕ (НЕ Список.Наименование = "" И НЕ Список.Код = "")
49. bulpi 217 11.06.19 19:25 Сейчас в теме
Критики этой статьи до боли напоминают мне работников техподдержки 1с (не только 1с, но мы сейчас здесь). Ты , значит, поработал для них бесплатным бета-тестером, нашел очевиднейший баг, не пожалел времени, задокументировал, пример написал, разжевал как для идиотов, написал туда ... ИИИИ.... тебе отвечают, что ты сам дурак и читай документацию. Я вот так и бросил писАть в техподдержку.
Люди, вы, блин, издеваетесь ? Если НЕЛЬЗЯ такое писАть в СКД, то нужно об этом выдавать диагностику на этапе перехода от текста запроса к полям. "Недопустимое логическое выражение в условии ..." , как то так.
unknown181538; arxus; zqzq; +3 Ответить
59. VmvLer 13.06.19 09:43 Сейчас в теме
(49) (51)... вброшу еще на вентилятор

Да забудьте вы про красную тряпку "ИЛИ" - оно тут не виновно и речь о нем шла в контексте. Еще раз суть:
"Недопустимое логическое выражение в условии ..."

не надо нас, маленьких дурить, меняя контекст неполадки!
в условии как раз допустимо выражение без КАК
Валюты.Наименование = "" ИЛИ Валюты.Код = "" КАК ОшибкаЗаполнения

а вот в выражении поля вместо логического выражения необходимо использовать
Выбор ...Когда.

Это как таблица умножения и если вы забыли ИЛИ НЕ знали, что 2*2 = 4, то
можно, конечно, строчить гневные петиции, мол, если я пишу 2*2 = 5, то пожалуйста сообщите мне почему так нельзя.
51. milanse 38 11.06.19 21:12 Сейчас в теме
Какой ужас, что же мы видим в центре внимания на главной странице инофостарта https://infostart.ru/public/1074066/ в перовом примере кода используется условие "или", а во втором выражение, которое может поломаться в СКД. Куда же смотрят тру программисты 1с, которые изучили настольные книги экспертов по технологическим вопросам ? Не время спать, 1с в опасности
edgt; eden_gmail; SeiOkami; +3 Ответить
57. alex5550 12.06.19 23:58 Сейчас в теме
Если НЕЛЬЗЯ такое писАть в СКД, то нужно об этом выдавать диагностику

Золотые слова...
61. triviumfan 97 13.06.19 15:47 Сейчас в теме
Давно натыкался на сие поведение, ошибке уже 100500 лет.
91. Sashares 35 25.10.19 16:07 Сейчас в теме
(0)Для информации.
В 8.3.16 исправили.
92. Deslime 11.12.19 11:07 Сейчас в теме
Поржала с комментов - прям Священная Война Свидетелей Нуралиева ))
Спасибо автору за статью - интересное замечание к работе СКД и пример хороший так как максимально очевидно показывает данный нюанс
93. SlavaKron 16.12.19 12:24 Сейчас в теме
К черту скд. Товарщи, пишите кастомные отчеты.
unknown181538; +1 Ответить
94. win.s.1 21.01.20 22:22 Сейчас в теме
Столкнулся с "оптимизатором СКД"

Есть две временные таблицы.
Все таблицы имеют структуру Товар, Хакрактеристика, Количество, КоличествоРезерв
Обе заполняются из одного регистра с разными отборами.

В итоговом запросе - идет объединение двух запросов.
Первый запрос - описание
Второй запрос - это первая временная таблица
Третий запрос - это вторая временная таблица

По факт - из второй таблицы убирают Количество и КоличествоРезерв
96. echo77 1906 31.10.21 07:01 Сейчас в теме
(0) Судя по всему баг поправили (проверял на платформах 8.3.16.1224, 8.3.18.1289. Режим совместимости не влияет на поведение)
Вот так теперь выглядит запрос, генерируемый компоновщиком:
ВЫБРАТЬ
	Валюты.Ссылка КАК Ссылка,
	Валюты.Наименование КАК Наименование,
	Валюты.Код КАК Код,
	Валюты.Наименование = ""
		ИЛИ Валюты.Код = "" КАК ОшибкаЗаполнения,
	Валюты.Представление КАК СсылкаПредставление
ИЗ
	Справочник.Валюты КАК Валюты
ГДЕ
	(Валюты.Наименование = ""
			ИЛИ Валюты.Код = "") = &П
Показать


p.s. Статью плюсовал в свое время. Спасибо.
Оставьте свое сообщение