Как правильно написать условие, что реквизит документа не равен значению перечисления?
Мне нужно выбрать только те документы у которых один реквизит не равен значению одного перечисления. Посмотрел в интернете и есть разные варианты проверки условия. Значит ли это что можно писать условие хоть как или есть предпочтения? Просто стало интересно.
1.
2.
3.
4.
1.
Если ТекущийЗаказ.ВидОперации = НЕ Перечисления.ВидыОпераций.Первичный Тогда
2.
Если НЕ ТекущийЗаказ.ВидОперации = Перечисления.ВидыОпераций.Первичный Тогда
3.
Если НЕ (ТекущийЗаказ.ВидОперации = Перечисления.ВидыОпераций.Первичный) Тогда
4.
Если ТекущийЗаказ.ВидОперации <> Перечисления.ВидыОпераций.Первичный Тогда
По теме из базы знаний
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1) Цитирую синтакс-помощник:
т.е. у "НЕ" приоритет выше, чем у "=" и он будет выполняться раньше
Вывод: 1 и 2 попытаются привести тип перечисления или реквизита к булево и скорее всего упадут с ошибкой.
3 и 4 - эквивалентны. Мне больше нравится 4.
ЗЫЖ поддержу (2) правильный вариант там.
Приоритеты вычисления выражений встроенного языка
В таблице представлен список операторов встроенного языка в порядке увеличения приоритета. Операторы с одинаковым приоритетом вычисляются слева направо.
Операция Описание
OR/ИЛИ Логическое сложение
AND/И Логическое умножение
NOT/НЕ Логическое отрицание
<, <=, =, >=, >, <> Сравнение
+, - Сложение, вычитание
*, /, % Умножение, деление
-, + Унарные минус и плюс
., () Разыменование, вызов метода и т.п.
Чтобы избежать неоднозначности и управлять последовательностью операндов, следует применять круглые скобки.
.
ПоказатьВ таблице представлен список операторов встроенного языка в порядке увеличения приоритета. Операторы с одинаковым приоритетом вычисляются слева направо.
Операция Описание
OR/ИЛИ Логическое сложение
AND/И Логическое умножение
NOT/НЕ Логическое отрицание
<, <=, =, >=, >, <> Сравнение
+, - Сложение, вычитание
*, /, % Умножение, деление
-, + Унарные минус и плюс
., () Разыменование, вызов метода и т.п.
Чтобы избежать неоднозначности и управлять последовательностью операндов, следует применять круглые скобки.
.
т.е. у "НЕ" приоритет выше, чем у "=" и он будет выполняться раньше
Вывод: 1 и 2 попытаются привести тип перечисления или реквизита к булево и скорее всего упадут с ошибкой.
3 и 4 - эквивалентны. Мне больше нравится 4.
ЗЫЖ поддержу (2) правильный вариант там.
(3)
Внимательно читаем описание из СП:
"В таблице представлен список операторов встроенного языка в порядке увеличения приоритета"
т.е. чем ниже описание, тем выше приоритет.
Следовательно "НЕ" имеет низший приоритет по сравнению с "=". И сначала выполнится "=", и только после "НЕ".
т.е. у "НЕ" приоритет выше, чем у "=" и он будет выполняться раньше
Внимательно читаем описание из СП:
"В таблице представлен список операторов встроенного языка в порядке увеличения приоритета"
т.е. чем ниже описание, тем выше приоритет.
Следовательно "НЕ" имеет низший приоритет по сравнению с "=". И сначала выполнится "=", и только после "НЕ".
(3)
Вывод: 1 и 2 попытаются привести тип перечисления или реквизита к булево и скорее всего упадут с ошибкой.
но так пишут код сами разработчики 1С, вот пример из типовой конфигурации УПП, как сочетается тогда жесткие правила сдачи на специалиста и не рабочий код в типовой конфигурации? Не (ВидРасчетовПоДоговору = Перечисления.ВидыРасчетовПоДоговорам.РасчетыВУсловныхЕдиницах)
(7) в свете (6) уточню, что упадет только вариант 1.
Сомневаюсь, что в типовых вы встретите
Варианты 2,3,4 отработают одинаково корректно.
Но на мой взгляд, самый читаемый
Сомневаюсь, что в типовых вы встретите
Если ТекущийЗаказ.ВидОперации = НЕ Перечисления.ВидыОпераций.Первичный Тогда
Варианты 2,3,4 отработают одинаково корректно.
Но на мой взгляд, самый читаемый
Если ТекущийЗаказ.ВидОперации <> Перечисления.ВидыОпераций.Первичный Тогда
(1)
Пишите, как вам нравится, 1С спецом так делает - иллюзия выбора из одинакового, зато все горды собой и с умным видом рассуждают - вот как тут, что лучше, перечисление брать из кэша, или из БД.
Значит ли это что можно писать условие хоть как или есть предпочтения?
Да, так и есть. Предпочтения - ка нравится. В данном случае выбор варианта ничего не значит.
Пишите, как вам нравится, 1С спецом так делает - иллюзия выбора из одинакового, зато все горды собой и с умным видом рассуждают - вот как тут, что лучше, перечисление брать из кэша, или из БД.
Если ТекущийЗаказ.ВидОперации <> ПредопределенноеЗначение("Перечисление.ВидыОпераций.Первичный") Тогда
Логику
Если НЕ ... = ...Тогда
вроде они уже сбежали и в конфах опять <>
в анналах пишут, что ПредопределенноеЗначение() кешируется, что позволяет не читать БД всякий раз в кейсах условий.
(2)
что ПредопределенноеЗначение() кешируется,
какое отношение ПредопределенноеЗначение имеет к Перечислению, там же вроде нет в явном виде предопределенного значения, хотя по факту все Перечисления в любом случае предопределенные? они же записываются в конфигураторе.
(9) ну я уже осмыслил, поэтому и спросил, вы говорите, что используя дополнительный код к условию
ПредопределенноеЗначение()
и что этот код кешируется, то есть работает не в оперативной памяти сервера, а в его кеше, таким образом увеличивая скорость обработки одной функции и что это даст? Какой выигрыш во времени и скорости? Сам код вычислится в кэше за микросекунды, но протокол вывода данных от кеша сервера до экрана на компе останется прежний и кратный не менее 10 мс ( в винде, в линуксе может чуть меньше), так что ваш кеш не даст на практике никакого выигрыша. Или нужно еще глубже капнуть? Мое предложение, если подаете идею, так описывайте ее полностью, а не ребусами, у меня нет доступа к вашим мыслям, что вы имели в виду когда писали такой ответ.
(10) Прочитайте описание этого метода в СП - это база для размышлений.
я не вижу смысла городить тут теории на основании квантовой физики.
если хотите "капнуть глубже", то проведите тесты с
десятками вызовов получения значения перечислений через точку или указанным методом в одном условном кейсе.
Тесты всесторонние: с хард или ссд-дисками, на файловой или скульной,
на кляче или шаттле.
потом пишите в 1С
далее получите медаль, приедет девочка и вручит вам грамоту,
а я буду сидеть и плакать от зависти.
я не вижу смысла городить тут теории на основании квантовой физики.
если хотите "капнуть глубже", то проведите тесты с
десятками вызовов получения значения перечислений через точку или указанным методом в одном условном кейсе.
Тесты всесторонние: с хард или ссд-дисками, на файловой или скульной,
на кляче или шаттле.
потом пишите в 1С
так что ваш кеш не даст на практике никакого выигрыша
далее получите медаль, приедет девочка и вручит вам грамоту,
а я буду сидеть и плакать от зависти.
(2)
"Примечание:
Результат выполнения кэшируется при первом обращении до изменения конфигурации или версии платформы."
И пусть себе кэшируется, кто видит разницу получения Перечисления из БД или из "кэша" (который сам находится непонятно где и на каком диске), это из разряда любимого в 1С: "зачем править реальные проблемы, когда можно исправить маленькую ерундовину, и выдать её за значимое исправление?"
в анналах пишут, что ПредопределенноеЗначение() кешируется
В каких еще "анналах"? Справка:
"Примечание:
Результат выполнения кэшируется при первом обращении до изменения конфигурации или версии платформы."
И пусть себе кэшируется, кто видит разницу получения Перечисления из БД или из "кэша" (который сам находится непонятно где и на каком диске), это из разряда любимого в 1С: "зачем править реальные проблемы, когда можно исправить маленькую ерундовину, и выдать её за значимое исправление?"
раз в кейсах условий.
в кейсах.. да.. что уж не в сумках? Погромисты такие программисты....
Почитал и не понял смыла использования, вот выдержка из материалов ИТС на сайте 1С (в СП ничего нет про преимущество данного метода)
При этом не следует в прикладном коде реализовывать собственные механизмы кеширования на клиенте предопределенных значений. Функция ПредопределенноеЗначение не ухудшает клиент-серверное взаимодействие: серверный вызов выполняется только при первом обращении к значению, а результат автоматически кешируется в кеше конфигурации на клиенте до следующего обновления версии конфигурации или версии платформы.
обратите внимание на часть строки не ухудшает клиент-серверное взаимодействие нет ничего про улучшение. Может быть вы сейчас объясните, что именно вы имели в виду? (тем более, что у меня УПП, не управляемые формы, а обычные)
(14)
Для ОФ это не имеет значения как использовать. Для УФ эту конструкцию
Вы можете написать в клиентской процедуре. а те четыре, которые вы используете вы можете использовать только в серверной.
(14)
После первого обращения результат кешируется и больше не обновляется до изменения конфигурации или платформы - это значит что результат обработки такой конструкции будет браться из кэша. вот и предлагают не использовать свои методы кэширования.
ЗЫ Опять же когда начнете писать на УФ вы поймете разницу между клиентской и серверной процедурами и функциями. На ОФ можно не заморачиваться.
Может быть вы сейчас объясните, что именно вы имели в виду?
Попробую я?
Для ОФ это не имеет значения как использовать. Для УФ эту конструкцию
Если ТекущийЗаказ.ВидОперации <> ПредопределенноеЗначение("Перечисление.ВидыОпераций.Первичный") Тогда
Вы можете написать в клиентской процедуре. а те четыре, которые вы используете вы можете использовать только в серверной.
(14)
результат автоматически кешируется в кеше конфигурации на клиенте до следующего обновления версии конфигурации или версии платформы.
После первого обращения результат кешируется и больше не обновляется до изменения конфигурации или платформы - это значит что результат обработки такой конструкции будет браться из кэша. вот и предлагают не использовать свои методы кэширования.
ЗЫ Опять же когда начнете писать на УФ вы поймете разницу между клиентской и серверной процедурами и функциями. На ОФ можно не заморачиваться.
(18)
Опять же когда начнете писать на УФ вы поймете разницу между клиентской и серверной процедурами и функциями.
разницы нет никакой. Разве что программистам делать нечего, и искусственно разделять функции туда и сюда. Сим преинтересным занятием 1С их всецело и обеспечила.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот