Директивы 1с
Часть на собеседовании я задаю такой простой вопрос: ‘Какие директивы компиляции вы знаете?’. Если часть программистов вообще не знает что это такое, то остальная часть, которая может их перечислить, не может внятно объяснить какую и где нужно применять при разработке. И лишь немногие действительно знают что это такое и с чем это едят.
Так давай же разбираться!
Директивы компиляции – это специальные определения, с помощью которых платформа понимает, в каком контексте необходимо выполнять функцию (далее ‘Ф’) или процедуру (далее ‘П’) модуля. Контекст в данном случае это по сути доступные свойства и методы программного модуля. Директивы имеют смысл в клиент-серверном варианте работы 1с через тонкий клиент.
Есть 5 директив компиляции:
- &НаКлиенте;
- &НаСервере;
- &НаКлиентеНаСервере;
- &НаСервереБезКонтекста;
- &НаКлиентеНаСервереБезКонтекста.
&НаКлиенте – эта директива указывает нам на то, что ‘П’ или ‘Ф’ будет выполнена ‘у вас на компьютере‘ , попросту говоря на клиенте, без вызова сервера. Здесь доступны элементы формы, реквизиты, переданные параметры, свойства и методы встроенного языка управляемой формы. Можно вызывать серверные и клиентские ‘П’ и ‘Ф’.
Самая известная клиентская ‘П’ – ‘ПриОткрытии’:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
&НаКлиенте Процедура ПриОткрытии(Отказ) ПроверитьВозможностьВводаДокумента(Отказ); ЭтоНовый = ?(Параметры.Ключ.Пустая(), Истина, Ложь); Если ЭтоНовый Тогда СтрокаКомментарий = Объект.Комментарий; ИзменениеСтатьиОборотов(Объект); ПроверитьПринадлежностьЦФОКСтатьеОборотов(Объект); УправлениеЭлементамиФормы(); КонецЕсли; // Вывести в заголовке формы вид операции и статус документа (новый, не проведен, проведен). УстановитьЗаголовокФормыДокумента(); ЭтаФорма.Статус = ПолучитьСтатус(); ЭтаФорма.ДатаИзмененияСтатуса = "Какая то д"; // Установим текущий статус. УстановитьСтатусВФорме(); ПодготовитьЭлементыФормы(); КонецПроцедуры |
&НаСервере – эта директива говорит нам о том, что здесь доступны данные формы и данные базы данных (ссылки, объекты, получение данных через точку, запросы и т.д.). Весь код будет выполнен на стороне сервера. Из серверной ‘П’ или ‘Ф’ невозможно вызвать клиентскую. Пример процедуры с такой директивой:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
&НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) МетаданныеОбъекта = Объект.Ссылка.Метаданные(); // Заполняем кэш значений. ЗаполнитьКэшЗначений(мКэшЗначений); // Заполним список имен элементов управления, которые необходимо блокировать при изменении статусов. ЗаполнитьСписокИменЭлементовУправленияПодлежащиеБлокировке(); // Заполним текст про график начислений. ЗаполнитьТекстПроГрафикНачислений(); ЭтоНовый = ?(Параметры.Ключ.Пустая(), Истина, Ложь); Если ЭтоНовый Тогда ЗаполнениеНовогоДокумента(); КонецЕсли; КонецПроцедуры |
&НаКлиентеНаСервере – директива, которая используется исключительно в модуле команд. На практике я даже и не вспомню, работал ли с этой директивой. Может быть вызвана как с клиента так и с сервера:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
&НаКлиенте Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) ТестКлиентСервер(); ВызываемСервер(); КонецПроцедуры &НаСервере Процедура ВызываемСервер() ТестКлиентСервер(); КонецПроцедуры &НаКлиентеНаСервере Процедура ТестКлиентСервер() Сообщить("Привет!ы"); КонецПроцедуры |
&НаСервереБезКонтекста – аналогична директиве ‘&НаСервере‘, за исключением того, что нам здесь не доступен контекст формы! Если нам нужно получить какие-либо данные без обращения к форме (по параметрам, или данным из базы), то используем именно эту конструкцию:
1 2 3 4 5 6 |
&НаСервереБезКонтекста Процедура УстановитьИДСтроки(ТекущаяСтрока_ИД) Экспорт ТекущаяСтрока_ИД = Строка(Новый УникальныйИдентификатор()); КонецПроцедуры // УстановитьИДСтроки() |
Очень часто не обращают внимания и не используют эту конструкцию молодые программисты – лишний раз передавая контекст формы на сервер и не используя его!
- &НаКлиентеНаСервереБезКонтекста – нужна если нам необходимо вызывать ‘Ф’ или ‘П’ и с сервера и с клиента, не используя контекст формы и данные базы. Идеально подходит если нужно обработать передаваемые в ‘П’ или ‘Ф’ параметры:
1 2 3 4 5 6 |
&НаКлиентеНаСервереБезКонтекста Процедура ОбработатьПараметры(п_1, п_2) П_1 = (П_2 + 1) / 100; КонецПроцедуры |
Все вышеописанное можно кратко уместить в одной таблице:
Теперь вы с легкостью будет понимать: где, когда и какие директивы использовать!