Варианты получения значения элементарного (серверного) выражения на клиентской стороне (в том числе с использованием функций ПредопределенноеЗначение и ВычислитьФормулу). Плюсы, минусы.

19.04.13

Разработка - Универсальные функции

При работе в режиме управляемого приложения, иногда на клиентской стороне приходится получать результат "элементарного выражения", вычислить которое можно только на сервере. В "классической" реализации это может приводить к обилию сдвоенных процедур/функций (одна на клиенте - вызывает другую на сервере). В статье рассмотрены 4 варианта решения этой задачи.

Допустим на форме нужно в зависимости от интерактивного изменения флажка устанавливать значение какого-либо реквизита, это можно сделаеть так:

Вариант 1:
&НаКлиенте
Процедура ФлажокПриИзменении(Элемент)
      ФлажокПриИзмененииНаСервере();
КонецПроцедуры

 &НаСервере
Процедура ФлажокПриИзмененииНаСервере()
      Объект.Статус = Перечисления.СтатусыЗаказовКлиентов.КОбеспечению;
      // или так: Объект.Статус = Перечисления.СтатусыЗаказовКлиентов.ПустаяСсылка; 
КонецПроцедуры 

Или так: 

Вариант 2:
&НаКлиенте
Процедура ФлажокПриИзменении(Элемент)
       Объект.Статус = ВернутьСтатусНаСервере();
КонецПроцедуры

 &НаСервереБезКонтекста
Функция ВернутьСтатусНаСервере ()
      Возврат Перечисления.СтатусыЗаказовКлиентов.КОбеспечению;
      // или так: Возврат = Перечисления.СтатусыЗаказовКлиентов.ПустаяСсылка; 
КонецФункции

Строго говоря, оба эти варианта "неправильные", т.е. работать они конечно же будут, но неэффентивно, так же неэффективен следующий вариант (есть в УТ11):

Вариант 3:
&НаКлиенте
Процедура ФлажокПриИзменении(Элемент)
       Объект.Статус = РаботаСФомулами.ВычислитьФормулу("Перечисления.СтатусыЗаказовКлиентов.КОбеспечению");
КонецПроцедуры

Здесь производится вывов стандартной серверной функции, реализованной в общем модуле УТ11 РаботаСФомулами.ВычислитьФормулу. Её реализация:

Функция ВычислитьФормулу(ТекстРасчета) Экспорт
       Возврат Вычислить(ТекстРасчета);
КонецФункции

Эта "фича", которая позволяет не описывать процедуры/функции исполняемой на сервере, а использует уже готовую "универсальную", но существует и "пара но", а именно:
   - уже есть функция платформы, которая может выполнять, почти тоже самое(об этом позднее);
   - если у вас есть РаботаСФомулами.ВычислитьФормулу, а база опубликована в веб, то любой человек может выполнять на вашем сервере произвольный 1С-код, просто передавая туда HTTP-запросы (Evil Beaver)

Функция платформы, которая позволяет сделать тоже самое, но с одной стороны без привязки к конфигурации, с другой кэшируя полученное значение:

Вариант 4:
&НаКлиенте
Процедура ФлажокПриИзменении(Элемент)
       Объект.Статус = ПредопределенноеЗначение("Перечисление.СтатусыЗаказовКлиентов.КОбеспечению");
КонецПроцедуры

Последний вариант с одной стороны позволяет не прибегать к увеличению кода, за счет вызова на клиенте, с другой кэширует полученное значение на уровне платформы. Есть у него и незначительный недостаток, который, впрочем, возникает при "некрасивом стиле" программирования, например таком:

&НаКлиенте
Процедура ФлажокПриИзменении(Элемент)
       Объект.Группа = РаботаСФомулами.ВычислитьФормулу("Справочники.Партнеры.НайтиПоКоду(""00002"")");
КонецПроцедуры

Такое значение нельзя вычислить используя Вариант 4, но правильнее в этом случае использовать предопределенный элемент справочника, тогда Вариант 4 вполне применим, например так:

&НаКлиенте
Процедура ФлажокПриИзменении(Элемент)
       Объект.Группа = ПредопределенноеЗначение("Справочник.Партнеры.НашеПредприятие");
КонецПроцедуры

 

Кратко преимущества(+)/недостатки(-) каждого варианта
+/- Возможность \ Вариант Вариант 1 Вариант 2 Вариант 3 Вариант 4
  Количество вызовов сервера при первоначальном использовании одного значения формы 1 1 1 1
  Количество вызовов сервера при первоначальном использовании N значений формы  1 N N N
  Количество вызовов сервера при повторном использовании уже полученного одного значения  1 1 1 0
  Количество вызовов сервера при повторном использовании уже полученных N значений 1 N N 0
+ Контекстная подсказка при написании кода Есть Есть Нет Есть
+ Возможность использования предопределенных и пустых значений объектов Есть Есть Есть Есть
+ Использование функций типа НайтиПоКоду, НайтиПоНаименованию... Есть Есть Есть Нет
+ Нагладность кода Есть Есть Есть Есть
+ Возможность проверки, используя синтаксис контроль Есть Есть Нет Нет
+ Возможность проверки, используя контроль при сохранении (со словами "Возможно ошибочный параметр") Нет Нет Нет Есть
- Необходимость написания процедуры/функции исполняемой на сервере  Есть Есть Нет Нет

Исходя из данной таблицы, наиболее выигрышными являются варианты 1 и 4, причем Вариант 1 лучше использовать когда нужно установить несколько значений формы, возможно со сложными вычислениями (например, Запросами), Вариант 4 - в простейших случаях, к которым можно сводить конструкции типа НайтиПоКоду, НайтиПоНаименованию, через предопределенные значения.

Вариант 2 - вообще желательно не употеблять ввиду его недостатков и возможность замещения другими, более эффективными вариантами.

Вариант 3 - можно рекомендовать только как временное решение (если база не опубликована в веб), до добавления предопределенного значения.

ЗЫ: Особое спасибо Magisterу, Поручику и Evil Beaver, за то что наставили на "путь истины", критикой в комментариях (изначально статья имела совсем другое содержание и выводы).

См. также

Вставляем картинку из буфера обмена (платформа 1С 8.3.24)

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

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    2867    2    John_d    11    

56

GUID в 1С 8.3 - как с ними быть

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

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    4997    atdonya    22    

51

Переоткрытие внешних обработок

Универсальные функции Платформа 1С v8.3 Бесплатно (free)

На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.

30.11.2023    4091    ke.92@mail.ru    16    

62

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    9332    YA_418728146    6    

143

Печать непроведенных документов для УТ, КА, ERP. Настройка печати по пользователям, документам и печатным формам

Пакетная печать Печатные формы Адаптация типовых решений Универсальные функции Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Абонемент ($m)

Расширение для программ 1С:Управление торговлей, 1С:Комплексная автоматизация, 1С:ERP, которое позволяет распечатывать печатные формы для непроведенных документов. Можно настроить, каким пользователям, какие конкретные формы документов разрешено печатать без проведения документа.

2 стартмани

22.08.2023    2197    24    progmaster    7    

3

Расширение: Быстрые отборы через буфер [Alt+C] Копировать список, [Alt+V] Вставить список, [Ctrl+C] Копировать из файлов

Инструментарий разработчика Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 1С:Розница 2 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Абонемент ($m)

Копирует в буфер значения из списков, из ячеек отчетов, таблиц, настроек списков, других отборов и вставляет в выбранную настройку отбора. Работает с Объект не найден. Работает как в одной так и между разными базами 1С. Использует комбинации [Alt+C] Копировать список, [Alt+V] Вставить список. Также для копирования данных используется стандартная [Ctrl+C] (например из открытого xls, mxl, doc и т.п. файла скопировать список наименований)

1 стартмани

13.10.2022    16329    142    sapervodichka    112    

130

Система контроля ведения учета [БСП]

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

В данном материале рассмотрим типовой алгоритм подсистемы контроля учета БСП в конфигурациях на примерах.

18.07.2022    7345    quazare    8    

110
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. mxm2 1265 06.02.13 12:30 Сейчас в теме
Применять удобно при взаимодействии с пользователем, например, при изменении реквизита на форме, - заполнять нужным значением, какой-либо другой реквизит. Если же нужно заполнить несколько реквизитов применение указанного метода будет приводить к нескольким вызовам сервера, что нежелательно.
+
2. Magister 134 06.02.13 22:55 Сейчас в теме
Вот за это:
РаботаСФомулами.ВычислитьФормулу("Перечисления.СтатусыЗаказовКлиентов.КОбеспечению");

минус!
нужно писать так:
ПредопределенноеЗначение("Перечисление.СтатусыЗаказовКлиентов.КОбеспечению");

Это, как минимум, кэшируется на уровне платформы - так что при втором и следующих вызовах обращения к серверу не будет.
Evil Beaver; mxm2; +2
4. mxm2 1265 07.02.13 11:57 Сейчас в теме
(2) Magister, (3) Поручик, спасибо за критику, принял к сведению, изменил статью.
+
3. Поручик 4674 07.02.13 01:00 Сейчас в теме
Тоже самое касается и получения пустой ссылки для перечисления и справочника или предопределённых элементов справочника.
mxm2; +1
5. Модератор раздела 08.02.13 11:32 Сейчас в теме
Вариант 4 сильно ограниченный и не такой универсальный, как другие варианты :(
Для задачи установки фиксированных значений подходит, а вот для других задач уже нет.
Да и предопределенные значения не всегда можно юзать :(
6. mxm2 1265 08.02.13 12:04 Сейчас в теме
(5) artbear, Для простейших 4 для более сложных (без взаимодействия с пользователем) - 1. К предопределенным можно сводить НайтиПоКоду, НайтиПоНаименованию.
+
7. Magister 134 08.02.13 15:40 Сейчас в теме
(5) Зато он по скорости оптимальнее, т.к. значения кешируются платформой.
+
8. DoctorRoza 09.02.13 17:32 Сейчас в теме
Хм, а ведь интересная тема поднята на самом деле. Использование функции глобального контекста маленько, но сократит код! Автору респект! :)
+
9. TODD22 18 18.02.13 13:24 Сейчас в теме
Автор купи себе учебник по стилистике русского языка. Твой заголовок ужасен.
+
10. mxm2 1265 18.02.13 13:58 Сейчас в теме
(9) TODD22, заголовок неказист, но суть отражает верно ).
+
11. Evil Beaver 8114 19.04.13 17:28 Сейчас в теме
Обожымой! Зачем эта статья? Сообщить миру, чтобы прежде, чем городить костыли с ОбщийМодуль.ВычислитьНаСервере почитали документацию про ПредопределенноеЗначение?
Дмитрий74Чел; +1
14. mxm2 1265 19.04.13 23:04 Сейчас в теме
(11) Evil Beaver,
Зачем эта статья? Сообщить миру, чтобы прежде, чем городить костыли с ОбщийМодуль.ВычислитьНаСервере почитали документацию про ПредопределенноеЗначение?

эта статья прежде всего для себя, даже читая документацию (чего, что скрывать, я делать не люблю) часто очень важные моменты остаются "не у дел", т.к. всасывается все именно на практике. А тут открыл - подсмотрел - и все ок. Не говоря уже о том, что взаимодействие с сообществом is позволяет находить новые тонкие моменты.
+
12. Evil Beaver 8114 19.04.13 17:31 Сейчас в теме
И еще. Если у вас есть СерверныйМодуль.ВычислитьНаСервере, а база опубликована в веб, то любой человек может выполнять на вашем сервере произвольный 1С-код, просто передавая туда HTTP-запросы. Вас это не пугает?
+
13. mxm2 1265 19.04.13 22:36 Сейчас в теме
(12) Evil Beaver, вебом не пользуюсь, но пугает, такая интересная особенность... а ведь она в стандарте УТ11...
+
15. Evil Beaver 8114 22.04.13 09:45 Сейчас в теме
(13)
а ведь она в стандарте УТ11...

Что-то не нашел. Подскажете модуль, номер строки и версию конфы?
+
16. mxm2 1265 22.04.13 10:15 Сейчас в теме
(15) Evil Beaver,
11.0.9.15: ОбщиеМодули.РаботаСФормулами.ВычислитьФормулу (стр. 85) (актуальная на момент написания статьи версия).
11.1.1.11: ОбщиеМодули.РаботаСФормуламиКлиентСервер.ПроверитьФормулу (стр. 32) - правда здесь добавлен код обработки, (который может не позволить использовать само вычисление, но передать на запуск выражение возможно).

Вопрос: какой должен быть HTTP запрос к веб-базе, чтобы выполнить произвольный код на 1С (обходящий права доступа, или вообще вредоносный)?
+
17. Evil Beaver 8114 22.04.13 12:37 Сейчас в теме
(16) mxm2 нет под рукой редакции 11.0, чтобы проверить. Но в 11.1 в модуле РаботаСФормуламиКлиентСервер нет вызова сервера. То есть, формула будет исполнена там, где вызван данный модуль. Перехода на сервер нет, а значит исполнения внешнего (по отношению к серверу) кода тоже нет. Все чисто.
Беда, если у модуля стоит флаг ВызовСервера, а внутри выполнение переданного извне кода. В 11.1 такого нет.
+
18. mxm2 1265 22.04.13 12:44 Сейчас в теме
(17) Evil Beaver, 11.0.9.15: таки да...)
Прикрепленные файлы:
+
19. LexSeIch 210 22.04.13 13:21 Сейчас в теме
Мир этому дому!
В споре рождается истина. Интересно читать полемику - что то новое узнаешь, иногда даже и не в теме: "а база опубликована в веб, то любой человек может выполнять на вашем сервере произвольный 1С-код, просто передавая туда HTTP-запросы" (Evil Beaver) - второй раз за день читаю об очередной дырке... Сколько же их?
+
20. Evil Beaver 8114 22.04.13 13:56 Сейчас в теме
(19) LexSeIch, ну в случае модуля РаботаСФормулами, могу ошибаться, но там, насколько мне известно передается не чистый код, а некий псевдокод, который еще и синтаксическую проверку проходит. То есть, прямого выполнения нет. Так что вроде бы не все так печально.
+
21. пользователь 18.10.13 13:36
Сообщение было скрыто модератором.
...
Внимание! Тема сдана в архив