Написание кода

Встроенный язык «1С:Предприятия»

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

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

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

Типизация переменных в языке не жесткая, т. е. тип переменной определяется ее значением. Переменные не обязательно объявлять в явном виде. Неявным определением переменной является ее первое упоминание в левой части оператора присваивания. Возможно также явное объявление переменных при помощи оператора Перем. Допускается применение массивов, структур, соответствий и других универсальных коллекций значений.

Подробнее можно прочитать о встроенном языке в документации «1С:Предприятия».

Контексты встроенного языка

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

Наиболее крупными контекстами являются клиентский контекст и серверный контекст. Причина их существования заключается в том, что в самом общем случае прикладные решения работают в клиент-серверном варианте.

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

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

Так как система программ «1С:Предприятие» позволяет работать с прикладными решениями через Интернет, клиентское приложение и кластер серверов могут находиться и исполняться не просто на разных компьютерах, а в разных городах, странах, частях света.

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

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

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

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

Директива &НаСервере значит, что эта процедура будет существовать в модуле, когда он исполняется на сервере. Когда он исполняется на клиенте, в нем этой процедуры не будет.

Пример использования директивы &НаСервере:

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

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

Пример использования директивы &НаКлиенте:

&НаКлиенте
Процедура КомандаОткрыть(Команда)

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

Например, для типа HTTPСервисЗапрос указано:

Доступность: Сервер, толстый клиент.

Это значит, что тип HTTPСервисЗапрос можно использовать в серверном контексте, а также и в клиентском, но только тогда, когда работает толстый клиент. Если вы попробуете исполнить этот же код в тонком клиенте, вы получите ошибку, т. к. в контексте тонкого клиента этот тип отсутствует.

Для типа Массив указано:

Доступность: Тонкий клиент, веб-клиент, платформа мобильного клиента, сервер, толстый клиент,
внешнее соединение, мобильное приложение(клиент), мобильное приложение(сервер).

Это значит, что тип Массив можно использовать практически во всех клиентских и серверных контекстах. В том числе и на мобильных устройствах.

Открыть модуль

Открыть модуль приложения, сеанса или внешнего соединения

В панели Навигатор нажмите Открыть модуль приложения или Открыть модуль сеанса или Открыть модуль внешнего соединения в контекстном меню конфигурации.

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

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

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

Открыть модуль формы
  1. В панели Навигатор выделите нужную форму;
    Общие формы находятся в ветке Общие - Общие формы.
    Формы объектов конфигурации находятся внутри этих объектов в ветке Формы.
  2. Нажмите Открыть модуль формы в контекстном меню.

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

Открыть модуль команды
  1. В панели Навигатор выделите нужную команду;
    Общие команды находятся в ветке Общие - Общие команды.
    Команды объектов конфигурации находятся внутри этих объектов в ветке Команды.
  2. Дважды кликните на команде.
Открыть общий модуль
  1. В панели Навигатор выделите нужный общий модуль;
  2. Дважды кликните на общем модуле.