Исполнение кода в модуле формы при разработке в 1С 8.2

15.01.11

Разработка - Механизмы платформы 1С

Немного теории о новом подходе к программированию форм в 1С 8.2
Рассматриваются директивы компиляции процедур и функций, которые определяются в модуле формы.

Скачать исходный код

Наименование Файл Версия Размер
Исполнение кода в модуле формы при разработке в 1С 8
.doc 44,00Kb
170
.doc 44,00Kb 170 Скачать бесплатно

Внимание!!! По какой то причине статья не отображается в IE. Поэтому, тем кто не может просмотреть статью на сайте, рекомендую скачать doc-файл.

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

До перехода на новую платформу 1С 8.2, я, признаться,  даже не задумывался, где именно исполняется написанный в модуле формы код – на клиенте или на сервере.  Писал код, «как получится». Субъективно, в 1С 8.1 этому не придавалось значения. Объективно, конечно, в книгах давались рекомендации по оптимизации кода, но, как это часто в жизни бывает – я думал, зачем соблюдать какие-то правила, когда можно обойтись без них и получить рабочий результат? Оптимальность кода становилась актуальной, только когда в системе появлялись серьезные «затыки» и приходилось разбираться «отчего так получилось?». И «тяжелое» место в коде было не всегда очевидно. Пляски с бубном, замеры производительности, детальный разбор узких мест…

Теперь в  1С 8.2 применяется новый подход к программированию форм. Благодаря этому многое разложилось по полочкам, но чтобы окончательно во всем разобраться, пришлось потратить какое-то время и перестроить мозги на работу в логике клиент-серверного взаимодействия. Причем все оказалось несколько сложнее, чем казалось первоначально (как всегда). Smile

Пока не разобрался в теории, постоянно допускал ошибки на практике и задавался вопросом «почему не работает?».

Итак, немного ликбеза. Прежде всего, что такое форма? Нужно понимать, что это программный объект, который создается в процессе работы прикладного решения и состоит из двух взаимодействующих частей. Каждая часть выполняется в своем контексте: в контексте сервера или в контексте клиента. Контекст в новой платформе определяет не только программное окружение, в котором выполняется код, но и физическое место, где будет исполняться код (сервер или клиент). Таким образом, разработчик явно программирует отдельно клиентскую и серверную части приложения.

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

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

&НаСервере

&НаКлиенте

&НаСервереБезКонтекста

&НаКлиентеНаСервереБезКонтекста

Код, реализующий бизнес-логику должен быть отделен от кода реализующего интерфейс. Нужно понимать, что форма существует одновременно и на клиенте и на сервере, но каждый из них «видит» только свою часть со всеми вытекающими последствиями. По этой причине все процедуры и функции, создаваемые в модуле формы, должны иметь явное указание на то, в каком контексте они будут исполняться. Например, директива компиляции и процедура могут выглядеть следующим образом:

&НаКлиенте
Процедура ПриОткрытии(Отказ, СтандартнаяОбработка)
     //код исполняемый на клиенте
КонецПроцедуры
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
     //код исполняемый на сервере
КонецПроцедуры 

Если директива компиляции перед описанием процедуры или функции отсутствует, то считается, что данная процедура или функция исполняется на сервере (&НаСервере).

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

Описание директив:

&НаСервере

Указывает на то, что процедура или функция исполняется в контексте серверного приложения. Её используют для всех обработчиков серверных событий формы, а также для собственных процедур и функций, которые определит разработчик, чтобы передать выполнение кода на сервер. Такие процедуры и функции упрощенно называют серверными процедурами формы. Разработчик должен управлять частотой вызовов сервера. В идеале, нужно стремиться к тому, чтобы их количество было минимально, т.к. при каждом вызове система «гоняет» туда-сюда данные.  

&НаКлиенте

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

&НаКлиенте
Процедура ПриВыбореКонтрагента()
   ОснСклад = Справочники.МестаХранения.ОсновнойСклад;
КонецПроцедуры

работать не будет. Правильно будет сделать вызов серверной функции, которая вернет значение:

&НаКлиенте
Процедура ПриВыбореКонтрагента()
   ОснСклад = ПолучитьСкладПоУмолчаниюНаСервере();
КонецПроцедуры
&НаСервере
Функция ПолучитьСкладПоУмолчаниюНаСервере()
   возврат Справочники.МестаХранения.ОсновнойСклад;
КонецФункции

&НаСервереБезКонтекста

Директива указывает на то, что код будет исполняться на сервере, при этом контекст формы будет недоступен. А значит получить доступ к реквизитам и элементам формы из процедуры или функции выполняемой с данной директивой – не получится. Но с другой стороны вызов такой процедуры или функции существенно «легче» по объему передаваемых данных на сервер. Для тонкого клиента или веб-клиента это играет важную роль. Если реквизиты и элементы формы не потребуются для исполнения кода на сервере, то вызов процедуры или функции скомпилированной с директивой &НаСервереБезКонтекста - верный выбор.

&НаКлиентеНаСервереБезКонтекста

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

См. также

Динамическое обновление - это зло?

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

Копнем глубже в тему "Что же такое динамическое обновление" и почему оно может привести к проблемам. И может ли?

09.05.2022    27784    Infostart    83    

243

Как работают управляемые формы и тонкий клиент 1С – взгляд "из-под капота"

Механизмы платформы 1С Управляемые формы Бесплатно (free)

Переход на управляемые формы перевернул процесс разработки на 1С, заставив программистов менять привычные подходы к описанию логики работы интерфейса. Руководитель компании «Цифровой Кот» Юрий Лазаренко в своем докладе на конференции Infostart Event 2019 Inception рассказал о том, как устроены управляемые формы и как правильно работать с тонким клиентом платформы 1С:Предприятие.

23.12.2019    25292    TitanLuchs    23    

101

30 задач. Странных и не очень

Математика и алгоритмы Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

30 задач на знание языка программирования 1С и некоторого поведения платформы. Маленьких. Странных и не очень.

02.12.2019    51338    Infostart    65    

165

Фишечки-рюшечки

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

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

06.11.2019    11320    mpeg1989    95    

66

ЧтениеДанных и ЗаписьДанных. Работа со строками

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

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

04.10.2019    24092    Yashazz    16    

76

Таблица значений. Нюансы

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Обзор некоторых аспектов использования общеизвестного инструмента 1С.

01.10.2019    81422    Yashazz    62    

368

От чего можно отказаться при разработке расширений 1С

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Разработка расширений 1С и оптимизация через механизм БСП: Дополнительные отчеты и обработки.

23.09.2019    13780    independ    34    

126
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. СергейКа 669 17.01.11 07:18 Сейчас в теме
Честно, хотел написать статью на эту тему. Даже заготовки имеются. Но у автора получилось хорошо. Респект. ;)
2. dddxddd 18.01.11 10:11 Сейчас в теме
А у меня ничего на странице нет кроме названия, что это за глюк?
3. alexk-is 6534 18.01.11 10:48 Сейчас в теме
Статья не видна под Internet Explorer. Ошибки в разметке.
4. 1cNike 209 18.01.11 11:46 Сейчас в теме
(3)Действительно, в эксплорере ничего не видно :( Попробую разобраться в чем дело...
5. 1cNike 209 18.01.11 12:15 Сейчас в теме
Коллеги, к сожалению, я не знаю в чем дело.
Скопировал текст в блокнот, из блокнота вновь вставил текст в окно сообщения. По идее все теги форматирования эта операция должна была убрать. Потратил время на форматирование кода, сохранил изменения. Результат прежний - в IE ничего, в Firefox все корректно. :o
Кто использует другие браузеры - отпишитесь, плз, корректно ли отображается статья.
6. 1cNike 209 18.01.11 12:30 Сейчас в теме
Добавил doc-файл со статьей
7. huse 19.01.11 08:23 Сейчас в теме
Теперь 8.2 серьезно сливает php. Не понимаю что добился 1С сделав такой убогий клиент.
8. 1cNike 209 19.01.11 08:46 Сейчас в теме
(7)имхо у 1С сейчас период под названием "охватить необъятное". Это касательно 8.2
Но со временем они все доведут до ума. Деньги есть, время тоже, запас лояльности пользователей их ПО ого-го какой.
13. huse 20.01.11 08:42 Сейчас в теме
(8) Дай Бог, чтобы усилили клиент. Только мне кажется вряд ли они от встроенного языка на нем откажутся. А все самое вкусное в веб-клиентской части лежит в java, ajax, light... Еще бы контекст сессии на сервере сделали.
9. rasswet 82 19.01.11 12:18 Сейчас в теме
много похоже на книжку "разработку УИ" от Ажеронюк, Радченко и т.д.
ждем примеров про РеквизитФормыВЗначение и т.п.
10. 1cNike 209 19.01.11 13:15 Сейчас в теме
(9)читал эту книгу, имхо там много воды, особенно в первой половине. "Коротко о главном" М.Радченко на мой взгляд лучше
11. CheBurator 3120 19.01.11 23:17 Сейчас в теме
на курсах вроде пробегало, что хотя сказано что Сервер и НаСервере - равнозначно, на самом деле - это не так... (могу ошибаться, может что попутал)
kolya_tlt; +1 Ответить
12. 1cNike 209 20.01.11 00:11 Сейчас в теме
(11)директивы по разному обрабатываются. Где то у меня был материал про это. Найду - выложу
14. Dnki 4 27.01.11 00:11 Сейчас в теме
Тоска... Не хочу писать "Клиент-сервер".
Но автору спасибо, может постепенно поверну сознание.
15. kolya_tlt 86 28.01.11 11:28 Сейчас в теме
а в примере не лучше ли использовать &НаСервереБезКонтекста?
зы вы случаем не выполняете финальной дз по базовому http:/spec8.ru/ ? :)
16. 1cNike 209 28.01.11 23:40 Сейчас в теме
(15)Согласен, в последней функции лучше использовать &НаСервереБезКонтекста.
Финальное дз уже выполнил :)
17. veluga 08.08.13 14:08 Сейчас в теме
всё хорошо, и замечтательно, но может быть встречались и знаете в чём причина

если 1С 8.2, конфигурация УТ, база которой крутиться на postgres, который соответственно развернуть под ОС Debian 7

проблема в следующем - не открывается объект DBF, если к нему обращаться с директивой компиляции наСервере,
а вот если с директивой компиляции наКлиенте, то всё ок.

В чем может быть причина и как обойти такую штуку.
18. sules 14.10.15 10:22 Сейчас в теме
ОЧЕНЬ хорошая СТАТЬЯ как автомат КАЛАШНИКОВ !!! ПРОСТО и ДОСТУПНОЙ !!! РЕСПЕКТ !!
Оставьте свое сообщение