Что такое директивы компиляции 1с

Использование директив компиляции и инструкций препроцессора

Область применения: управляемое приложение, мобильное приложение, обычное приложение.

1. Директивы компиляции:

&НаКлиенте (&AtClient)
&НаСервере (&AtServer)
&НаСервереБезКонтекста (&AtServerNoContext)

следует применять только в коде модулей управляемых форм и в коде модулей команд. В остальных модулях рекомендуется применять инструкции препроцессору.

В серверных или клиентских общих модулях контекст исполнения очевиден, поэтому смысла в директивах компиляции нет. В общих модулях с признаками клиент и сервер применение директив компиляции затрудняет понимание, какие же процедуры (функции) доступны в конечном итоге.

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

Функция КодОсновногоЯзыка() Экспорт
#Если НЕ ТонкийКлиент И НЕ ВебКлиент Тогда
Возврат Метаданные.ОсновнойЯзык.КодЯзыка;
#Иначе
Возврат СтандартныеПодсистемыКлиент.ПараметрКлиента(«КодОсновногоЯзыка»);
#КонецЕсли
КонецФункции

Функция КодОсновногоЯзыка() Экспорт
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
Возврат Метаданные.ОсновнойЯзык.КодЯзыка;
#Иначе
Возврат СтандартныеПодсистемыКлиент.ПараметрКлиента(«КодОсновногоЯзыка»);
#КонецЕсли
КонецФункции

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

В то же время, как и в обычных клиентских модулях, допустимо ветвление кода для учета специфики различных режимов работы клиентского приложения: веб-клиент, тонкий или толстый клиент (например, #Если ВебКлиент).

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

Процедура Пример1()
а = 1
#Область ИмяОбласти
+ 2;
#КонецОбласти // разрыв выражения
КонецПроцедуры

Результат = Пример4(Параметр1,
#Если Клиент Тогда
Параметр2, // некорректный вызов функции
#КонецЕсли
Параметр3);

Данные ошибки диагностируются автоматически с помощью среды разработки 1C:Enterprise Development Tools (EDT).

Правильно использовать инструкции препроцессора без разрыва конструкций.

Источник

Директивы компиляции

Директивы компиляции — это директивы которые определяют в какой среде будут исполнятся процедуры и функции модулей форм, модуля команды и общего модуля управляемого приложения.

Перед определением директивы ставится «&».

Если директива отсутствует используется директива по умолчанию — &НаСервере.

Использование нескольких директив вместе невозможно.

Допустимые директивы:

&НаКлиенте (&AtClient)

Определяет выполнение процедуры (функции) на клиенте;

Используется на клиенте, доступны процедуры модуля и доступны данные форм.

&НаСервере (&AtServer)

Определяет выполнение процедуры (функции) на сервере;

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

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

Определяет выполнение процедуры (функции) на сервере вне контекста формы. В данном случае не будут доступен контекст формы и ее данные. Позволяет вызывать только внекотекстные процедуры и функции и не позволяет выполнять передачу данных между клиентом и сервером. Данный метод позволяет существенно снизить объем передоваемой информации.

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

определяет выполнение процедуры (функции) на сервере и на клиенте, не имеющую доступа к данным формы, переменным. В данном методе имеется доступ к процедурам и функциям клиентских и серверных одновременно.

&НаКлиентеНаСервере (&AtClientAtServer)

определяет выполнение процедуры (функции) на сервере и на клиенте. В данном методе имеется доступ к процедурам и функциям общих модулей – серверных, не глобальных и серверных и клиентских одновременно, не имеющую доступ к переменным.

Источник

Директивы компиляции и инструкции процессора

1. Директивы компиляции

Директива препроцессора — это специальный способ указать командой препроцессору 1С, где будет выполнен код 1С. В качестве примера можно привести тот факт, что нельзя выдать пользователю диалоговое сообщение на сервере – это будет работать только на клиенте.

Директива 1С определяется символом «&».

Допустимые директивы 1С:

В директивах 1С БезКонтекста недоступны реквизиты формы 1С 8.3 и экспортные переменные формы 1С, но доступен вызов процедур и функций 1С из серверных общих модулей 1С 8.3. По умолчанию если перед процедурой (функцией) ничего не указано, то применяется директива 1С &НаСервере. Перед одной процедурой (функцией) нельзя применять одновременно несколько директив компиляции. Также недопустимо наличие процедур (функций) с одинаковым именем, отличающихся только директивами компиляции.

Читайте также:  Что такое гвс носитель в квитанции

2. Инструкции препроцессора 1С

Инструкции препроцессора 1С применяются для группировки кода, указания разрешения использования процедур (функций) на сервере и клиенте, а также в расширении при изменении части кода. Инструкции выполняются раньше директив компиляции. Ими можно ограничить любую часть модуля, но рекомендуется ограничивать только части методов. Инструкции препроцессора 1С обозначается в коде символом»#».

Для возможности свертки кода и группировки строк 1С применяется инструкция препроцессора 1С #Область. Обязательно указание имени области и инструкция, заканчивающаяся конструкцией #КонецОбласти.

3. При запуске клиент-сервера 1С 8.3

При использовании клиент–сервера 1С 8.3 для запуска платформы 1С:Предприятие 8 есть возможность выполнять различные процедуры (функции) или их части на сервере приложения 1С или на клиенте.

Конструкции НаСервере/Сервер и НаКлиенте/Клиент имеют в таком случае одинаковое значеие.

В расширении в директиве 1С &ИзменениеИКонтроль используется инструкция препроцессора 1С #Вставка и #Удаление, которая позволяет частично изменить(добавить новые фрагменты или удалить) код процедуры (функции). Инструкция #Вставка заканчивается текстом #КонецВставки¸ Инструкция #Удаление заканчивается текстом #КонецУдаления.

Источник

Директивы компиляции и инструкции процессора

1. Директивы компиляции

Директива препроцессора — это специальный способ указать командой препроцессору 1С, где будет выполнен код 1С. В качестве примера можно привести тот факт, что нельзя выдать пользователю диалоговое сообщение на сервере – это будет работать только на клиенте.

Директива 1С определяется символом «&».

Допустимые директивы 1С:

В директивах 1С БезКонтекста недоступны реквизиты формы 1С 8.3 и экспортные переменные формы 1С, но доступен вызов процедур и функций 1С из серверных общих модулей 1С 8.3. По умолчанию если перед процедурой (функцией) ничего не указано, то применяется директива 1С &НаСервере. Перед одной процедурой (функцией) нельзя применять одновременно несколько директив компиляции. Также недопустимо наличие процедур (функций) с одинаковым именем, отличающихся только директивами компиляции.

2. Инструкции препроцессора 1С

Инструкции препроцессора 1С применяются для группировки кода, указания разрешения использования процедур (функций) на сервере и клиенте, а также в расширении при изменении части кода. Инструкции выполняются раньше директив компиляции. Ими можно ограничить любую часть модуля, но рекомендуется ограничивать только части методов. Инструкции препроцессора 1С обозначается в коде символом»#».

Для возможности свертки кода и группировки строк 1С применяется инструкция препроцессора 1С #Область. Обязательно указание имени области и инструкция, заканчивающаяся конструкцией #КонецОбласти.

3. При запуске клиент-сервера 1С 8.3

При использовании клиент–сервера 1С 8.3 для запуска платформы 1С:Предприятие 8 есть возможность выполнять различные процедуры (функции) или их части на сервере приложения 1С или на клиенте.

Конструкции НаСервере/Сервер и НаКлиенте/Клиент имеют в таком случае одинаковое значеие.

В расширении в директиве 1С &ИзменениеИКонтроль используется инструкция препроцессора 1С #Вставка и #Удаление, которая позволяет частично изменить(добавить новые фрагменты или удалить) код процедуры (функции). Инструкция #Вставка заканчивается текстом #КонецВставки¸ Инструкция #Удаление заканчивается текстом #КонецУдаления.

Источник

[ Наглядно о непонятном ] – Как работает серверный вызов в 1С

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

Это будет полезно начинающим разработчикам и тем, у кого есть пробелы в области клиент-серверного взаимодействия – всё объясним «на пальцах» 🙂

Клиент-серверная архитектура заложена в платформе изначально – со времен «1С:Предприятие 8.0».

Однако при разработке на 8.0 и 8.1 о разделении кода на клиентскую и серверную часть можно было не заботиться, поскольку на клиенте (на толстом клиенте) был доступен тот же функционал, что и на сервере.

Всё изменилось с выходом платформы «1С:Предприятие 8.2», когда появился тонкий клиент. Теперь на клиенте доступен один функционал, на сервере – другой. Клиент и сервер «общаются» между собой с помощью серверного вызова.

Конечно, это усложнило процесс разработки, но с другой стороны – можно создавать более оптимальные (быстрые) решения, поскольку все сложные задачи выполняются на сервере.

Немного базовой теории

Перед тем, как перейти к содержательной части, договоримся о некоторых ограничениях:

Далее, освежим в памяти немного теории.

Директивы, в имени которых упоминается «Клиент», устанавливают ограничение на обращение к базе данных.

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

Читайте также:  Что такое брикс и какие страны туда входят
Директива Данные формы База данных
&НаКлиенте +
&НаСервере + +
&НаСервереБезКонтекста +
&НаКлиентеНаСервереБезКонтекста

Опережая вопрос «Для чего же директива с самым длинным названием, если она ограничивает и использование контекста форм, и обращения к базе данных?», напомню: любая процедура и функция поддерживает обработку информации, переданной в неё в качестве параметров.

Отсюда делаем вывод: у методов, описанных под директивой «&НаКлиентеНаСервереБезКонтекста», единственным источником данных являются эти самые переданные параметры.

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

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

Теперь про серверный вызов

Серверный вызов – это передача какой-то информации с клиентской части «1С:Предприятие 8» на серверную часть с целью вернуть обратно некий набор данных.

Самый первый серверный вызов инициализируется в момент начала сеанса работы 1С. То есть когда пользователь выполняет вход в информационную базу:

«Оу! При чём тут Библиотека?!» – спросите Вы.

Обратите внимание, что доступ к базе данных есть только на серверной части, а соединение между клиентом и сервером имеет ограниченную пропускную способность. Это и неудивительно – ведь соединение между клиентской и серверной частью может быть установлено даже по нестабильному низкоскоростному каналу связи (например, посредством мобильного интернета).

Кроме этого, передача данных между клиентом и сервером возможна только посредством серверного вызова.

Но, для того чтобы перейти к основной теме данной статьи, необходимо сначала разобраться – где будет выполняться программный код, написанный под определенными директивами. То есть на какой части приложения «1С:Предприятие 8» будут доступны процедуры и функции, описанные под директивами «&НаКлиенте», «&НаСервере», «&НаСервереБезКонтекста» и «&НаКлиентеНаСервереБезКонтекста»:

Видим, что на стороне клиента у нас будут доступны процедуры и функции, написанные под двумя директивами из четырёх, а на стороне сервера – под тремя из четырёх.

Сразу возникают вопросы: «Зачем такое многообразие и чем оно полезно?», «Как метод, описанный под директивой «&НаКлиентеНаСервереБезКонтекста» может выполняться и на клиенте, и на сервере?».

Сейчас мы постараемся понять особенности работы системы при использовании директив и почему необходимо уметь правильно использовать каждую из существующих директив компиляции.

И в этом нам помогут наши новые друзья, знакомьтесь!

Итак, давайте рассмотрим несколько особенностей работы программного кода в «1С:Предприятие 8», написанного под разными директивами.

Действие 1. Открытие пользователем формы с данными.

Действие 2. Получение из открытой Пользователем формы дополнительных данных из Базы данных.

Получение этих данных может быть описано под двумя директивами – «&НаСервере» и «&НаСервереБезКонтекста». Рассмотрим оба случая.

Явление 1. Директива «&НаСервере»

После выполнения метода на сервере, весь этот «пакет» транспортируется обратно. Таким образом, форма со всеми элементами и данными дважды проходит через самое узкое место системы.

Явление 2. Директива «&НаСервереБезКонтекста»

Таким образом, серверный вызов не несёт лишней нагрузки, и для передачи данных между клиентом и сервером потребуется меньше ресурсов.

Из примеров видно, что далеко не всегда оправдано указание директивы компиляции «&НаСервере» с точки зрения использования контекста (данных) формы на сервере.

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

До этого момента при каждом изменении свойства «Видимость» происходил серверный вызов, как при использовании директивы «&НаСервере».

Но использование директивы «&НаСервереБезКонтекста» не является панацеей. Помимо нагрузки на серверный вызов, всегда необходимо задумываться ещё над одним параметром.

Действие 3. Обработка данных табличной части формы с получением дополнительной информации из Базы данных.

Явление 1. Построчная обработка табличной части на стороне клиента с организацией серверного вызова для получения дополнительной информации из базы данных.

Читайте также:  Что такое план по русскому языку 4 класс

Мы уже знаем – лучше использовать директиву «&НаСервереБезКонтекста».

Явление 2. Предварительная обработка табличной части на стороне клиента с целью подготовки требуемых к обработке на сервере данных и «упаковки» их в набор параметров. Затем передача этого набора на сервер для получения дополнительной информации из базы данных.

Используем всё ту же директиву «&НаСервереБезКонтекста».

Большое количество текущих серверных вызовов может свидетельствовать о неоптимальном программном коде.

Избегайте создания серверных вызовов внутри цикла. Подготовьте набор параметров и единожды выполните его передачу для обработки на сервер. Если предполагается сложная обработка большого количества данных формы – передайте её полностью на сервер (при помощи директивы «&НаСервере») и выполните все действия на стороне сервера.

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

Давайте теперь попробуем разобраться, для чего нужна директива «&НаКлиентеНаСервереБезКонтекста».

Действие 4. Выполнение обработки данных.

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

Та-дам!

Для копирования у нас есть ксерокс. Но куда его поставить? На сторону клиента или сервера? Под какой директивой его разместить?

Как было озвучено ранее – любая процедура и функция поддерживает обработку информации, переданной в неё в качестве параметров.

Давайте для начала попробуем разместить копировальный аппарат на стороне клиента. Для этого описываем процедуру или функцию «Ксерокс» под директивой «&НаКлиенте». Тогда процесс клиентской части в любой момент сможет без проблем обратиться к ней и все действия будут выполнены в соответствии с программным кодом.

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

Получается, что использовать директиву «&НаКлиенте» неправильно, а директиву «&НаСервере», как мы изучили ранее – нежелательно. Давайте посмотрим поведение системы при использовании директивы «&НаСервереБезКонтекста».

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

Избавиться от излишней передачи на сервер при сохранении возможности копирования на клиенте и на сервере можно при помощи директивы «&НаКлиентеНаСервереБезКонтекста».

Не углубляясь в детали, отметим, что метод, описанный под данной директивой управления, создаётся в двух копиях – и на стороне клиента, и на стороне сервера. Это позволяет выполнить необходимые действия там, где появилась потребность в них (клиент/сервер), без лишних серверных вызовов.

С точки зрения выполнения программы результат будет одинаков. Но объяснение «почему так не надо делать» – это уже совершенно другая тема…

Вместо заключения

В данной статье мы на наглядных примерах рассмотрели влияние различных директив компиляции на такое явление системы «1С:Предприятие 8», как серверный вызов. Как видно, основная причина для выбора правильной директивы – производительность транспортировки данных между клиентской и серверной частью.

Придерживайтесь при разработке следующих правил:

Учитывайте потребность в доступности тех или иных видов данных, обоснованность передачи управления и не стесняйтесь при необходимости дробить процедуры и функции. И будет Вашему серверному вызову всегда легко, а Вы от пользователей Вашей программы получите «молчаливую благодарность»!

Программист Иван при доработке 1С на своём предприятии сделал ошибку в выборе директивы компиляции. Из-за неё длительность одного из серверных вызовов была больше возможной на полсекунды.

Пользователей, применяющих этот функционал, – 25 человек, и каждый из них за рабочий день в среднем совершает 110 таких операций. Всего впустую за рабочий месяц потрачено 28875 секунд (21 рабочий день * 25 человек * 110 операций * 0,5 секунды) = 8,02 часов.

Иван, каково тебе осознавать, что за месяц ты задолжал своему предприятию целый рабочий день?

Об авторе

Автор статьи – Павел Ванин

Источник

Информационный сайт