Как правильно написать условие, что реквизит документа не равен значению перечисления?

1. user1194102 04.03.20 16:34 Сейчас в теме
Мне нужно выбрать только те документы у которых один реквизит не равен значению одного перечисления. Посмотрел в интернете и есть разные варианты проверки условия. Значит ли это что можно писать условие хоть как или есть предпочтения? Просто стало интересно.

1.
Если ТекущийЗаказ.ВидОперации = НЕ Перечисления.ВидыОпераций.Первичный Тогда

2.
Если НЕ ТекущийЗаказ.ВидОперации = Перечисления.ВидыОпераций.Первичный Тогда

3.
Если НЕ (ТекущийЗаказ.ВидОперации = Перечисления.ВидыОпераций.Первичный) Тогда

4.
Если ТекущийЗаказ.ВидОперации <> Перечисления.ВидыОпераций.Первичный Тогда
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
3. Zab 04.03.20 17:01 Сейчас в теме
(1) Цитирую синтакс-помощник:
Приоритеты вычисления выражений встроенного языка
В таблице представлен список операторов встроенного языка в порядке увеличения приоритета. Операторы с одинаковым приоритетом вычисляются слева направо.

Операция Описание
OR/ИЛИ Логическое сложение
AND/И Логическое умножение
NOT/НЕ Логическое отрицание
<, <=, =, >=, >, <> Сравнение
+, - Сложение, вычитание
*, /, % Умножение, деление
-, + Унарные минус и плюс
., () Разыменование, вызов метода и т.п.


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

т.е. у "НЕ" приоритет выше, чем у "=" и он будет выполняться раньше
Вывод: 1 и 2 попытаются привести тип перечисления или реквизита к булево и скорее всего упадут с ошибкой.
3 и 4 - эквивалентны. Мне больше нравится 4.
ЗЫЖ поддержу (2) правильный вариант там.
user1194102; +1 Ответить
6. spacecraft 04.03.20 19:00 Сейчас в теме
(3)
т.е. у "НЕ" приоритет выше, чем у "=" и он будет выполняться раньше

Внимательно читаем описание из СП:
"В таблице представлен список операторов встроенного языка в порядке увеличения приоритета"
т.е. чем ниже описание, тем выше приоритет.
Следовательно "НЕ" имеет низший приоритет по сравнению с "=". И сначала выполнится "=", и только после "НЕ".
EVKash; user1194102; +2 Ответить
15. Zab 05.03.20 14:12 Сейчас в теме
(6) Посыпаю голову пеплом. Вы правы.
7. user1194102 05.03.20 09:32 Сейчас в теме
(3)
Вывод: 1 и 2 попытаются привести тип перечисления или реквизита к булево и скорее всего упадут с ошибкой.
но так пишут код сами разработчики 1С, вот пример из типовой конфигурации УПП, как сочетается тогда жесткие правила сдачи на специалиста и не рабочий код в типовой конфигурации?
Не (ВидРасчетовПоДоговору = Перечисления.ВидыРасчетовПоДоговорам.РасчетыВУсловныхЕдиницах)
16. Zab 05.03.20 14:33 Сейчас в теме
(7) в свете (6) уточню, что упадет только вариант 1.
Сомневаюсь, что в типовых вы встретите
Если ТекущийЗаказ.ВидОперации = НЕ Перечисления.ВидыОпераций.Первичный Тогда


Варианты 2,3,4 отработают одинаково корректно.
Но на мой взгляд, самый читаемый
Если ТекущийЗаказ.ВидОперации <> Перечисления.ВидыОпераций.Первичный Тогда
17. PLAstic 296 06.03.20 09:16 Сейчас в теме
(3) п.2 нормально отработает. Странно, что вы до сих пор не использовали этот кейс в своей работе. В таком виде он идентичен п.3.
20. Zab 06.03.20 14:13 Сейчас в теме
(17) Согласен. Просто в конце дня голова не варила уже.
12. Sashares 33 05.03.20 10:30 Сейчас в теме
(1)
Выполнить одну логическую операцию сравнения или две - действительно, что же лучше?
23. AlexO 136 07.03.20 11:50 Сейчас в теме
(1)
Значит ли это что можно писать условие хоть как или есть предпочтения?
Да, так и есть. Предпочтения - ка нравится. В данном случае выбор варианта ничего не значит.
Пишите, как вам нравится, 1С спецом так делает - иллюзия выбора из одинакового, зато все горды собой и с умным видом рассуждают - вот как тут, что лучше, перечисление брать из кэша, или из БД.
2. VmvLer 04.03.20 16:46 Сейчас в теме
Если ТекущийЗаказ.ВидОперации <> ПредопределенноеЗначение("Перечисление.ВидыОпераций.Первичный") Тогда


Логику
Если НЕ ... = ...Тогда
десять лет назад юзала одна группа разработчиков типовых,
вроде они уже сбежали и в конфах опять <>

в анналах пишут, что ПредопределенноеЗначение() кешируется, что позволяет не читать БД всякий раз в кейсах условий.
PLAstic; user1194102; +2 Ответить
4. lefthander 04.03.20 17:05 Сейчас в теме
(2)
ПредопределенноеЗначение()
это вроде на клиенте используют. А ТС указал УПП для ОФ тоже есть такое? точно, в СП посмотрел.
ЗЫ давно не окунался в мир ОФ ;)
По мне так самый нормальный вариант 4
PLAstic; user1194102; +2 Ответить
5. VmvLer 04.03.20 17:13 Сейчас в теме
(4) СП в помощь, вроде 10 лет назад в УПП я такое писал, может 8 - не суть.
давно оно в платформе, причем внеконтекстное, удобно и при обменах.
lefthander; +1 Ответить
8. user1194102 05.03.20 09:36 Сейчас в теме
(2)
что ПредопределенноеЗначение() кешируется,
какое отношение ПредопределенноеЗначение имеет к Перечислению, там же вроде нет в явном виде предопределенного значения, хотя по факту все Перечисления в любом случае предопределенные? они же записываются в конфигураторе.
9. VmvLer 05.03.20 09:47 Сейчас в теме
(8) я предлагаю вам самому осмыслить ваши вопросы
lefthander; user1194102; +2 Ответить
10. user1194102 05.03.20 10:18 Сейчас в теме
(9) ну я уже осмыслил, поэтому и спросил, вы говорите, что используя дополнительный код к условию
ПредопределенноеЗначение()
и что этот код кешируется, то есть работает не в оперативной памяти сервера, а в его кеше, таким образом увеличивая скорость обработки одной функции и что это даст? Какой выигрыш во времени и скорости? Сам код вычислится в кэше за микросекунды, но протокол вывода данных от кеша сервера до экрана на компе останется прежний и кратный не менее 10 мс ( в винде, в линуксе может чуть меньше), так что ваш кеш не даст на практике никакого выигрыша. Или нужно еще глубже капнуть? Мое предложение, если подаете идею, так описывайте ее полностью, а не ребусами, у меня нет доступа к вашим мыслям, что вы имели в виду когда писали такой ответ.
11. VmvLer 05.03.20 10:27 Сейчас в теме
(10) Прочитайте описание этого метода в СП - это база для размышлений.
я не вижу смысла городить тут теории на основании квантовой физики.

если хотите "капнуть глубже", то проведите тесты с
десятками вызовов получения значения перечислений через точку или указанным методом в одном условном кейсе.
Тесты всесторонние: с хард или ссд-дисками, на файловой или скульной,
на кляче или шаттле.

потом пишите в 1С
так что ваш кеш не даст на практике никакого выигрыша


далее получите медаль, приедет девочка и вручит вам грамоту,
а я буду сидеть и плакать от зависти.
e-9; user1194102; +2 1 Ответить
13. user1194102 05.03.20 12:38 Сейчас в теме
(11) спасибо, что объяснили, посмотрю
21. AlexO 136 07.03.20 11:43 Сейчас в теме
(2)
в анналах пишут, что ПредопределенноеЗначение() кешируется
В каких еще "анналах"? Справка:
"Примечание:
Результат выполнения кэшируется при первом обращении до изменения конфигурации или версии платформы."
И пусть себе кэшируется, кто видит разницу получения Перечисления из БД или из "кэша" (который сам находится непонятно где и на каком диске), это из разряда любимого в 1С: "зачем править реальные проблемы, когда можно исправить маленькую ерундовину, и выдать её за значимое исправление?"
раз в кейсах условий.
в кейсах.. да.. что уж не в сумках? Погромисты такие программисты....
14. user1194102 05.03.20 13:12 Сейчас в теме
Почитал и не понял смыла использования, вот выдержка из материалов ИТС на сайте 1С (в СП ничего нет про преимущество данного метода)
При этом не следует в прикладном коде реализовывать собственные механизмы кеширования на клиенте предопределенных значений. Функция ПредопределенноеЗначение не ухудшает клиент-серверное взаимодействие: серверный вызов выполняется только при первом обращении к значению, а результат автоматически кешируется в кеше конфигурации на клиенте до следующего обновления версии конфигурации или версии платформы.
обратите внимание на часть строки не ухудшает клиент-серверное взаимодействие нет ничего про улучшение. Может быть вы сейчас объясните, что именно вы имели в виду? (тем более, что у меня УПП, не управляемые формы, а обычные)
18. lefthander 06.03.20 09:30 Сейчас в теме
(14)
Может быть вы сейчас объясните, что именно вы имели в виду?
Попробую я?
Для ОФ это не имеет значения как использовать. Для УФ эту конструкцию
Если ТекущийЗаказ.ВидОперации <> ПредопределенноеЗначение("Перечисление.ВидыОпераций.Первичный") Тогда

Вы можете написать в клиентской процедуре. а те четыре, которые вы используете вы можете использовать только в серверной.

(14)
результат автоматически кешируется в кеше конфигурации на клиенте до следующего обновления версии конфигурации или версии платформы.

После первого обращения результат кешируется и больше не обновляется до изменения конфигурации или платформы - это значит что результат обработки такой конструкции будет браться из кэша. вот и предлагают не использовать свои методы кэширования.
ЗЫ Опять же когда начнете писать на УФ вы поймете разницу между клиентской и серверной процедурами и функциями. На ОФ можно не заморачиваться.
22. AlexO 136 07.03.20 11:46 Сейчас в теме
(18)
Опять же когда начнете писать на УФ вы поймете разницу между клиентской и серверной процедурами и функциями.
разницы нет никакой. Разве что программистам делать нечего, и искусственно разделять функции туда и сюда. Сим преинтересным занятием 1С их всецело и обеспечила.
19. duhin 06.03.20 09:48 Сейчас в теме
Мой выбор- 4 вариант, как самый понятный.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот