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

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, за то что наставили на "путь истины", критикой в комментариях (изначально статья имела совсем другое содержание и выводы).

Вступайте в нашу телеграмм-группу Инфостарт

См. также

Загрузка и выгрузка в Excel Универсальные функции Программист 1С:Предприятие 8 Россия Бесплатно (free)

Описанный ниже подход позволяет в три шага заполнять формулы в Excel файлы, вне зависимости от ОС сервера (MS Windows Server или Linux). Подход подразумевает отказ от работы с COM-объектом в пользу работы через "объектную модель документа" (DOM).

30.10.2025    3566    Abysswalker    9    

45

Универсальные функции Работа с интерфейсом Программист 1С:Предприятие 8 Бесплатно (free)

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

14.05.2025    6606    DeerCven    15    

57

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

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

21.05.2024    49376    dimanich70    83    

170

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Абонемент ($m)

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

1 стартмани

18.03.2024    7373    6    John_d    13    

59

Универсальные функции Программист Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

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

12.02.2024    61906    atdonya    31    

70

Универсальные функции Программист 1С:Предприятие 8 Бесплатно (free)

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

30.11.2023    9190    ke.92@mail.ru    17    

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

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

Это, как минимум, кэшируется на уровне платформы - так что при втором и следующих вызовах обращения к серверу не будет.
Evil Beaver; mxm2; +2 Ответить
4. mxm2 1284 07.02.13 11:57 Сейчас в теме
(2) Magister, (3) Поручик, спасибо за критику, принял к сведению, изменил статью.
3. Поручик 4601 07.02.13 01:00 Сейчас в теме
Тоже самое касается и получения пустой ссылки для перечисления и справочника или предопределённых элементов справочника.
5. Модератор раздела 08.02.13 11:32 Сейчас в теме
Вариант 4 сильно ограниченный и не такой универсальный, как другие варианты :(
Для задачи установки фиксированных значений подходит, а вот для других задач уже нет.
Да и предопределенные значения не всегда можно юзать :(
6. mxm2 1284 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 20 18.02.13 13:24 Сейчас в теме
Автор купи себе учебник по стилистике русского языка. Твой заголовок ужасен.
10. mxm2 1284 18.02.13 13:58 Сейчас в теме
(9) TODD22, заголовок неказист, но суть отражает верно ).
11. Evil Beaver 8388 19.04.13 17:28 Сейчас в теме
Обожымой! Зачем эта статья? Сообщить миру, чтобы прежде, чем городить костыли с ОбщийМодуль.ВычислитьНаСервере почитали документацию про ПредопределенноеЗначение?
Дмитрий74Чел; +1 Ответить
14. mxm2 1284 19.04.13 23:04 Сейчас в теме
(11) Evil Beaver,
Зачем эта статья? Сообщить миру, чтобы прежде, чем городить костыли с ОбщийМодуль.ВычислитьНаСервере почитали документацию про ПредопределенноеЗначение?

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

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

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