📱

Get Our Mobile App

Take your business learning on the go!

Download on the App StoreGet it on Google Play

Марафон "Основы программирования в 1С". Урок 4. Программирование под управляемым приложением

Программирование в 1С с Ильясом Низамутдиновым1:19:11

Transcription

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

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

С чего мы начнем? А начнем мы с варианта хранения данных. В платформе 1С существует два варианта хранения данных. И первый вариант – это файловый. Что такое файловый вариант хранения данных? Это значит, что вся наша информация, вся наша база хранится в одном файле. Это один файл, в котором всё у нас, естественно, хранится. И 1С:Предприятие работает с этим файлом, то есть она извлекает информацию из этого файла и отображает эту информацию в клиентском приложении. И также наоборот, она записывает какую-то информацию в этот файл. То есть вот такой двухсторонний обмен всё время постоянно происходит.

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

Итак, давайте запустим стартер 1С. И здесь у нас в стартере есть список информационных баз. И заметьте, внизу этого списка, соответственно, написан файл по-английски и путь к этой базе. То есть этот путь к базе и есть тот каталог, где хранится наша база. В некоторых случаях вот этот нижний путь может быть очень длинным, поэтому можно посмотреть по-другому. Мы выделяем эту базу, нажимаем кнопку "Изменить", и здесь есть вот этот каталог информационной базы. Если мы сейчас скопируем в буфер обмена, откроем проводник, то мы сможем в проводнике вставить этот каталог и перейти по соответствующему пути. То есть вот этот путь у меня здесь сверху. И в этом пути вот этот файл нас интересует: 1С 8.1.cd, то есть с расширением .cd. И этот файл есть наша база. Мы можем удалить вот это вообще всё, что тут есть, но если этот файл останется, то наша база останется. Да, конечно, у нас удалится журнал регистрации, но, в принципе, вся наша база, все наши документы, все наши справочники, все наши регистры – они у нас сохранятся. То есть сохранится как структура метаданных, которую мы с вами сделали, так и сохранятся те данные, которые ввели пользователи при работе с этой программой. То есть вот таким образом она хранится.

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

В клиент-серверном варианте хранения данных, или его ещё по-другому называют клиент-серверная архитектура, у нас существует три звена. Первое звено – это локальная машина, то есть та машина, где работает пользователь. Второе звено – это кластер серверов 1С. Это отдельная машина, на которой установлена и работает специальное программное обеспечение, или сервер 1С. И третье звено – это СУБД, система управления базами данных. Тоже, как правило, это отдельная машина, хотя это может быть и та же машина, где у нас установлен и работает кластер серверов 1С, на которой установлена база данных, где хранится вся информация. То есть в кластере серверов 1С у нас ничего не хранится, у нас всё хранится вот в этой БД. Причем, если кластер серверов 1С – это программное обеспечение фирмы 1С, то СУБД – это, как правило, какое-то стороннее программное обеспечение под управлением Oracle, Microsoft и далее. Мы вот именно в особенности клиент-серверного варианта хранения данных вдаваться не будем, но у нас работа осуществляется вот по такому принципу архитектуры. Причем оба варианта хранения данных – и файловый вариант хранения данных, и клиент-серверный вариант хранения данных – они работали и под обычным приложением, которое было раньше.

Что же у нас изменилось с приходом управляемого приложения? А изменилось то, что у нас добавились виды клиентских приложений. Итак, давайте мы плавно перейдем к видам клиентских приложений. Раньше в платформах 8.0 и 8.1 существовало всего два вида клиента, или два вида клиентских приложений, то есть два вида приложений, под которыми работал клиент: это конфигуратор и толстый клиент, ну то есть обычное приложение. Связь между кластером серверов 1С и клиентскими машинами, вот эта вот связь, которые здесь у меня слева в виде стрелочек изображена, оно осуществлялось только по локальной сети. Это была работа под обычным приложением. Обычным приложением в этом марафоне мы касаться не будем, это довольно-таки уже устаревшая технология, хотя она иногда периодически кое-где встречается.

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

Для локальных машин появились разные виды клиентских приложений. Что такое клиентское приложение? Клиентское приложение – это программа, работающая на устройстве пользователя, которая обеспечивает интерактивное взаимодействие пользователя с 1С:Предприятие. Ну и более кратко, клиентское приложение так называют клиентом. Платформе 8.2, а потом с развитием и в платформе 8.3, появились следующие виды клиентов или клиентских приложений:

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

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

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

Четвертый вид клиента – это вид клиента, который появился в платформе 8.3, это мобильный клиент. То есть тоже посредством этого клиента связь с кластером серверов 1С осуществляется посредством сети интернет.

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

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

Конечно же, вы меня сейчас можете спросить: "А в чем вот нам весь этот сервер знать? Про этот сервер, про эту трехзвенную архитектуру, если у нас файловая база? У нас нет никаких кластеров серверов 1С, у нас нет никаких серверов, у нас нет никаких СУБД". Да, это так. Но в случае файловой базы вот вся эта трехзвенная архитектура, которую я показывал ранее, она эмулируется платформой. Ее, конечно, напрямую нету, но вся работа управляемого приложения 1С именно заточена под трехзвенную архитектуру. Поэтому всё равно вам надо представлять эту трехзвенную архитектуру, чтобы вам был ясен смысл взаимодействия.

И поскольку в управляемом приложении возможна связь через интернет, то нам стало критично, где выполняется наш код. Мы не можем через интернет гонять большие объемы информации. Все расчеты, все вычисления должны выполняться на стороне кластера серверов 1С, на какой-то мощной такой машине, производительной. А на стороне клиентского приложения по сути нужно только прорисовываться форма и выполняться различные обработчики на форме, то есть нажать на кнопку или еще какие-либо действия. А что-то тяжелое, например, проведение документа или запрос, должно выполняться на стороне сервера, то есть на стороне кластера серверов 1С.

Тем самым мы переходим к контексту выполнения кода. Поскольку в управляемом приложении нам стало важно, где выполняется наш код – на клиентской машине или на машине, где установлен кластер серверов 1С, ну или на сервере его еще называют, – появляется два контекста выполнения кода. Это клиентский контекст, то есть код выполняется у нас на клиентской машине, то есть вот на этой локальной машине. И серверный контекст, то есть код выполняется на машине кластера серверов 1С. Если код выполняется на клиентской машине, то это клиентский контекст выполнения кода. А если код выполняется на кластере серверов 1С, то это серверный контекст выполнения кода. Это запомните, и это очень важно. Понимание вот клиентского и серверного контекста выполнения кода потом вам очень пригодится в вашей дальнейшей работе.

И также контекст выполнения кода у нас связан с видами клиентов. Код, который работает на тонком, толстом, веб- или мобильном клиенте – это код, который работает в клиентском контексте. И соответственно, код, который работает на сервере – это код, который работает в серверном контексте.

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

1. **Директива "На клиенте"**: Если у нас метод предваряется этой директивой, то код в этом методе выполняется в клиентском контексте, то есть на компьютере клиента.

2. **Директива "На сервере"**: В этом случае код выполняется в серверном контексте на компьютере сервера, то есть на компьютере, где установлен кластер серверов 1С. Но если эта директива предваряет метод в модуле формы, то в методе будет доступен контекст формы. Чуть позже мы с вами более подробно познакомимся с контекстом формы.

3. **Директива "На сервере без контекста"**: В этом случае код выполняется тоже в серверном контексте, то есть на компьютере сервера, на компьютере кластера серверов 1С. Но если эта директива предваряет метод в модуле формы, то в этом методе не будет доступен контекст формы.

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

И так, давайте более подробно разберем работу с контекстом, то есть работу клиента и сервера. И начнем мы по старшинству с общих модулей. Мы с вами уже сделали один модуль "Общего назначения". Он, скорее всего, пустой, и мы его сделали просто показав, что можно такой модуль сделать. Если его у вас нету, то создайте его самостоятельно. Возможно, я как-то его сам сделал, потом забыл вам сказать, но не суть. Мы сейчас с вами займемся более подробно этим общим модулем.

Давайте откроем палитру свойств. Обратим внимание на свойства общего модуля. Свойство "Клиент" означает, что процедуры и функции в этом модуле выполняются в клиентском контексте, то есть на компьютере, где работает наш клиент, то есть где работает наш пользователь. Свойство "Сервер" означает, что процедуры и функции в этом модуле выполняются в серверном контексте, то есть на том компьютере, где у нас установлен и работает кластер серверов 1С. Свойство "Внешнее соединение" означает, что методы модуля можно использовать во внешнем соединении, но в принципе, это неинтересно, и мы этого касаться не будем. Свойство "Привилегированный" означает, что для методов модуля предоставляется полный права доступа, то есть если какой-то пользователь инициирует метод из модуля с этим флагом, то метод будет выполнен в любом случае, независимо от того, есть у пользователя право на выполнение этого метода или нет. А вот это свойство "Вызов сервера" ставится тогда, когда стоит флаг "Сервер", и это свойство означает, что серверные модули можно будет вызвать из клиентского контекста. Сейчас я вам это продемонстрирую.

Но перед этим остановимся подробнее на "Вызове сервера". Когда нам в клиентском контексте нужно сделать что-то, что мы не можем делать в этом клиентском контексте, ну, например, создать какой-то объект или выполнить какой-то сложный запрос, то нам нужно передать эту задачу на сервер и сделать это уже в серверном контексте, то есть ресурсами той машины, где запущен сервер 1С. Вот это сама передача задачи с клиентской машины на сервер и называется "вызов сервера". То есть вот это у нас будет происходить вызов сервера.

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

Давайте создадим метод в модуле общего назначения, и этот метод так и назовем: "Проба вызвать сервер". Это будет процедура, которую мы назовем "Проба вызвать сервер". Чтобы мы могли эту процедуру из общего модуля вызвать где-то в другом месте, нам необходимо эту процедуру сделать экспортной. Для этого мы после названия этой процедуры пишем ключевое слово "экспорт". Здесь я просто сделаю какое-то сообщение. В принципе, сделали, покажу ещё раз вам модуль нашего общего назначения. Заметьте, "Вызов сервера" не стоит. Я сейчас специально пока его не ставлю. Но наш модуль вот этот общего назначения работает на сервере, то есть эта процедура "Проба вызвать сервер" выполняется в серверном контексте. И давайте мы ее с вами вот в этом модуле приложения, процедуре "При начале работы системы" попробуем вызвать.

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

Сохраним. Теперь давайте обновим конфигурацию базы данных и запустим 1С:Предприятие. Я запущу в режиме отладки, и у нас возникла ошибка: "Переменная не определена". Общего назначения. Давайте посмотрим подробно на эту ошибку. То есть вот здесь, когда мы пробуем вызвать, у нас ругается, что переменная не определена. То есть мы не можем использовать вот этот вот, соответственно, модуль общего назначения. И чтобы мы могли в клиентском контексте использовать методы вот из этого модуля, который у нас работает в серверном контексте, нам необходимо поставить флаг "Вызов сервера". Всё, поставили. Давайте сохраним, обновим конфигурацию баз данных и запустим 1С:Предприятие.

И в этот раз у нас всё нормально запустилось, никаких ошибок не возникло. И заметьте, здесь внизу вышло сообщение, что мы вызывали сервер. То есть вот наша эта процедура серверная сработала. Всё замечательно, мы замечательно смогли с вами вызвать сервер. Замечу, что мы можем только с клиента сделать вызов сервера, то есть мы можем только с клиента вызвать сервер. Мы не можем сделать наоборот, то есть мы не можем с сервера вызвать клиент. Это имейте в виду, то есть обратный путь невозможен.

Теперь перейдем к названиям общих модулей. Обычно, если модуль имеет какой-то конкретный контекст, то в модуле указывают этот контекст. Например, в нашем случае, в модуле "Общего назначения" возможен вызов сервера, значит, в конце этого модуля и необходимо написать название "Вызов сервера". Давайте мы это сделаем. Вот это "Общего назначения", придем в палитру свойств и поменяем его, напишем "Вызов сервера". И раз уж мы изменили название общего модуля, то чтобы у нас не было ошибок, давайте изменим то место, где мы процедуру из этого модуля вызываем, в модуле приложения. Откроем модуль приложения и найдем вот эту нашу процедуру "При начале работы системы". Здесь у нас потенциальная ошибка, которая не даст запускать наше приложение. У нас тут старое название у модуля общего назначения, сейчас же у нас название модуля новое, и нам необходимо поменять это название. Давайте скопируем и вставим. Всё, поменяли. Давайте обновим конфигурацию базы данных и посмотрим, как у нас запустится 1С:Предприятие.

Всё, запустилась нормально, у нас модуль вызвался. Мы с вами сейчас поменяли название модуля, сделали это название более понятным для дальнейшей работы. Что у нас в этом модуле "Общего назначения" осуществляется вызов сервера. Причем заметьте, поскольку у нас этот модуль выполняется с вами в серверном контексте, то нам в этом модуле не обязательно писать директивы компиляции. То есть у нас вот эта наша процедура, которую мы сделали, оно само по себе работает в серверном контексте, плюс она всегда будет выполняться на компьютере, где установлен кластер серверов 1С. Любой метод из этого модуля "Общего назначения" "Вызов сервера" будет работать в серверном контексте, то есть он будет работать на той машине, где у нас установлен кластер серверов 1С. А если ещё у этого метода есть ключевое слово "экспорт", то это значит, что этот метод можно применять в клиентском контексте, то есть использовать с помощью него вызов сервера, то есть передавать управление на сервер.

Теперь давайте создадим еще один общий модуль, который будет у нас тоже называться "Общего назначения", но у него будет приставка "Клиент". Это значит, что этот модуль будет выполняться в клиентском контексте. Мы закроем, и здесь мы у него в свойствах ставим "Клиент", а сервер снимем. То есть это у нас будет конкретно модуль для клиентского контекста. То есть теперь все методы вот этого модуля у нас будут работать в клиентском контексте.

Давайте создадим в этом модуле экспортную процедуру, которая будет показывать название компьютера. То есть обычно процедура у нас выдается так: вот пишется название процедуры и пишется открывающая, закрывающая скобка. Но эту процедуру мы с вами будем вызывать откуда-то из других мест, поэтому обязательно после этой процедуры, после открывающей и закрывающей скобки, пишем ключевое слово "экспорт". Создадим переменную, которую назовем "Название компьютера". Теперь этой переменной присвоим имя компьютера. Для этого мы будем использовать метод глобального контекста, который так и называется "Имя компьютера". Такой вопрос: можем ли мы использовать в модуле, который работает в клиентском контексте, вот эту процедуру "Имя компьютера"? Чтобы ответить на этот вопрос, давайте найдем это "Имя компьютера" в синтакс-помощнике. То есть найдем справку о ней. Для того, чтобы быстро найти вот эту процедуру в синтакс-помощнике, сделаем следующий трюк: поставим курсор на эту процедуру и нажмем Ctrl+F1. Нас открылся список выбора глав, и здесь мы найдем вот такую главу "Процедуры и функции сеанса работы". То есть вот у нас наша процедура "Имя компьютера". И посмотрите ее доступность. Доступность у нас: тонкий клиент, мобильный клиент, сервер, толстый клиент и так далее. Теперь вспомним тот слайд, где я показал вам клиентские контексты и доступность. Клиентский контекст у нас выполняется под тонким клиентом. То есть мы с вами можем смело использовать эту процедуру именно в клиентском контексте. Поэтому, когда вы работаете с какими-то методами платформы 1С, которые выполняют какие-то действия, всегда обращайте внимание на доступность этого метода. То есть в каком контексте он может работать. Напрямую это не написано, придется вот так вот косвенно определять. Если у вас написан "тонкий клиент", "мобильный клиент", то значит, эту процедуру можно использовать на тонком клиенте и в клиентском контексте, как следствие.

Итак, мы с вами сделали процедуру, которая выводит нам название компьютера. Давайте сделаем вывод этого. Будем сообщать название компьютера. Всё хорошо. Сохраним. И давайте мы эту процедуру вызовем вот "При начале работы системы". Для того, чтобы вызвать эту процедуру, нам необходимо сначала написать название вот этого нашего модуля "Общего назначения Клиент". Теперь поставим точку, и в контекстной подсказке у нас появится вот эта наша процедура, которую мы с вами только что сделали. Давайте выберем ее. Сохраним, обновим ее и посмотрим, как у нас всё запустится.

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

Мы с вами можем создать также серверный модуль без вызова сервера. Часто так и делают. В модуле с вызовом сервера размещают методы, которые используются в клиентском контексте, а они уже вызывают методы и серверного модуля. Давайте создадим общий модуль, который назовем "Общего назначения". Обычно 1С так и рекомендует. В том случае, когда мы создаем серверный модуль, нам не обязательно делать в конце приставку "Сервер". То есть, в отличие от клиента, мы делаем приставку "Клиент", в отличие от вызова сервера, делаем приставку "Вызов сервера". А в случае серверного общего модуля просто пишем "Общего назначения". Давайте сделаем такой общий модуль, назовем его "Общего назначения", и этот модуль у нас будет сервера. То есть мы так, этот флажок "Сервер" и оставим. Больше ничего мы ставить не будем. И всё, все настройки, которые есть, мы и оставим.

Теперь давайте в этом модуле "Общего назначения" присвоим параметру сеанса имя компьютера. Мы с вами раньше сделали параметр сеанса, который так и назвали "Имя компьютера". Теперь давайте мы сделаем две процедуры: одна процедура присваивает этому параметру сеанса имя компьютера, а вторая процедура просто будет выводить значение параметра сеанса. Эта процедура будет экспортной. Обратимся к параметру сеанса. Как это делается? Делается это через коллекцию, которая так и называется "Параметры сеанса". После того, как мы вызвали эту коллекцию, нам необходимо поставить точку и вызвать вот этот самый параметр сеанса "Имя компьютера". Поставили точку, и контекстная подсказка предложила нам единственный параметр сеанса, вызываем. И теперь присвоим ему имя компьютера. Для этого будем использовать тоже тот метод, который возвращает имя компьютера, он так называется "Имя компьютера".

Почему мы с вами параметру сеанса присвоили значение в серверном модуле, а не сделали, например, это в клиентском модуле? Давайте посмотрим на вот эту коллекцию "Параметры сеанса". Поставим курсор и нажмем Ctrl+F1. Здесь есть свойство глобального контекста, которое называется "Параметры сеанса". Вот оно. Если мы посмотрим на доступность, то у него доступность следующая: это сервер, толстый клиент и так далее. То есть мы, конечно, в клиентском контексте можем с вами работать вот с этим параметром сеанса, но можем это только делать под толстым клиентом. Если мы работаем под тонким клиентом, то мы не будем иметь доступ вот к этому параметру сеанса. И на будущее всегда запомните: поскольку сейчас большинство современных приложений 1С работает под тонким клиентом, то если какой-то метод платформы 1С имеет доступность "толстый клиент", то желательно этот метод использовать в серверном контексте, ну что толстый клиент – это устаревшая технология, поскольку нигде она не используется.

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

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

И теперь в этой процедуре "Установить параметр сеанса" мы вызовем процедуру из общего модуля "Общего назначения". То есть вот "Присвоить параметру сейчас 7 компьютера". Все. И теперь давайте мы вот в нашем модуле приложения вызовем эту процедуру "Установить параметр сеанса". Все. Теперь у нас соответственно произойдет установка параметра сеанса. Так, с этим мы разобрались. Параметры сеанса мы установили. Давайте сохраним. 1С:Предприятие, обновим конфигурацию базы данных и запустим наш 1С. Посмотрим, не возникнет какая-то ошибка. Нет, ошибка никто не возникло. Параметр сеанса установлен. Чуть позже мы с вами сделаем так, чтобы информацию о параметре сеанса можно было прочитать и вывести потом эту информацию куда-нибудь.

А теперь давайте создадим общий модуль, который будет у нас выполняться и на клиенте, и на сервере. Такой общий модуль мы назовем "Общего назначения клиент-сервер". То есть мы сразу у него поставим оба флага. И здесь мы поставим "Толстый клиент". Если сейчас в этом общем модуле мы создадим процедуру без указания директивы компиляции, то эта процедура будет доступна и в клиентском, и в серверном контексте. Давайте это сейчас продемонстрируем. Создадим процедуру, которую назовем "Доступна везде". Я так ее и назову. Ну, никакого смысла у него не будет. Она будет экспортной и просто сообщения выведем, что "Используем процедуру доступна везде".

Теперь эту процедуру можно использовать как в клиентском, так и в серверном контексте. Ну, например, давайте мы ее вызовем просто в нашем обработчике "При начале работы". То есть вот мы эту процедуру вызвали в обработчике "При начале работы". Если мы запустим 1С:Предприятие, видите, все нормально сработало, никаких ошибок не возникло. Хотя конкретно у этой процедуры флажок "Вызов сервера" не стоял. Мы просто ее использовали, потому что вот она доступна и в том числе в клиентском контексте.

Теперь давайте эту процедуру попробуем вызвать в серверном контексте. Для этого мы с вами будем использовать вот этот наш общий модуль "Общего назначения вызов сервера", где мы устанавливаем параметр сеанса. Так, вот поставим ее. То есть эту процедуру отсюда я удалил из обработчика "При начале работы системы". Сохраним, обновим и запустим 1С:Предприятие. Тоже она опять сработала, никаких ошибок не возникло. То есть процедуры и функции из модуля "Клиент-сервер" мы можем использовать и там, и там, если они не идут ни под какими директивами компиляции.

Но если мы процедуру будем обрамлять какой-то директивой компиляции, то она будет доступна только в этом контексте. Например, мы эту процедуру используем "Процедуру доступна везде". Давайте перед ней сделаем директиву компиляции "На клиенте". И сейчас у нас возникнет ошибка. Допустим, запустим 1С:Предприятие. Видите, "Метод не обнаружен". Давайте мы сюда опять перейдем в конфигуратор. Почему возникла эта ошибка? Потому что мы вот эту процедуру "Процедуру доступна везде" с вами использовали в модуле "Общего назначения вызов сервера". А что это за модуль? Это серверный модуль. Хоть он и стоит "Виза", но это все равно серверный модуль. То есть мы постарались клиентскую процедуру использовать в серверном модуле.

Но если мы с вами сделаем "На сервере" и попробуем перенести процедуру "Доступна везде" в клиентский контекст, то есть вот сюда "При начале работы системы", то у нас тоже ничего не произойдет. Мир, не у нас произойдет ошибка. Так, аннотация "На сервере" правильно назвал. Так, вот так. Давайте сохраним, обновим и попробуем запустить 1С:Предприятие. И видите, опять возникла ошибка. То есть мы не можем эту процедуру использовать уже в клиентском контексте. Так, это давайте удалим. И сделаем вывод. Тоже я удалю. Какое у нас вывод? То есть модули, которые используются одновременно и на клиенте, и на сервере, то есть у него два флажка, то процедуру или функцию из этого модуля можно обрамлять какой-то директивой компиляции. В этом случае оно доступно будет только в том тексте, которому соответствует эта директива компиляции. Но как правило, в современных конфигурациях директивы компиляции не используются в общих модулях, хотя такая возможность имеется. Это имейте в виду.

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

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

В случае же внеконтекстного или безконтекстного вызова данные формы не передаются на сервер. И как следствие, у нас в серверном контексте нет данных об этой управляемой формы, из которой произошел вот этот наш внеконтекстный вызов. То есть нас в принципе все доступно, мы можем какие-то запросы делать, но информацию о форме мы получать не можем. Контекстный вызов у нас осуществляется тогда, когда процедура или функция выполняется под директивой "На сервере". Внеконтекстный вызов у нас будет осуществляться тогда, когда процедура или функция выполняется под директивой "На сервере без контекста". Естественно, понятно, что внеконтекстный вызов более быстрый, чем контекстный. То есть у нас, поскольку данные формы не гонятся на сервер, то у нас просто происходит вызов сервера и никакой передачи нету. Мы делаем вызов сервера и передали управление на сервер. Тут же контекстного вызова данные всей формы у нас уходят на сервер. То есть наш канал связи более будет занят. В этом суть.

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

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

Теперь давайте создадим форму обработки. Перейдем на закладку "Формы" и здесь вот в этом окошке добавим новую форму. Здесь ничего больше особо добавлять нечего. Просто нажимаем на кнопку "Готово". Форму мы сделали. Теперь давайте у этой формы создадим два реквизита. Конечно, более подробно с управляемыми формами мы будем с вами разбираться в другом уроке, поэтому чтобы не пропустить этот урок, подпишитесь на мой канал, жмите колокольчик, чтобы вовремя получать все уведомления. И также подписывайтесь на мою группу ВКонтакте и на канал в Телеграме, где я буду выкладывать дубли этих уроков.

И так, давайте создадим у этой формы два реквизита. Один реквизит назовем "Имя компьютера", а второй реквизит будет называться "Каталог программы 1С". Тип, как и оставим, строка в неограниченной длины. И давайте оба реквизита разместим на управляемой форме. Мы просто их сюда вот перетащим. И чтобы эти реквизиты нельзя было менять формы, давайте установим у них свойство "Только просмотр". Для этого мы зайдем в палитру свойств реквизита и в этой палитре вот у этого свойства "Только просмотр" поставим флажок. И то же самое мы сделаем с другими реквизитами.

Теперь давайте создадим команду, которую назовем "Получить данные". Перейдем на закладку "Команды" и создадим обработчик этой команды. Для этого мы перейдем вот в это свойство "Действия" и нажмем вот на эту кнопку "Открыть". Появилось окно с выбором варианта создания обработчиков. Мы выбираем вот этот первый вариант "Создать на клиенте". Вы видите, что этот обработчик у нас сразу же притворился директивой "На клиенте". То есть все обработчики команд, каких-то элементов и так далее, у нас всегда выполняются сначала на клиентском контексте. И это понятно, потому что мы с вами работаем с этой кнопкой или с каким-то другим элементом формы именно на клиенте. То есть вот на нашем этом компьютере. Поэтому все обработчики элемента формы сначала всегда должны выполняться на клиенте, а потом они должны вызывать, допустим, какой-то серверный обработчик или безконтекстный серверный обработчик.

То есть когда мы с вами создавали вот этот вот обработчик "Получить данные", у нас платформа автоматически сгенерировала на форме клиентский обработчик. То есть вот он. Теперь мы с вами получим имя компьютера. Мы уже сами знакомы с таким методом. Давайте к реквизиту формы присвоим результат работы этого метода. Мы пишем название нашего реквизита "Имя компьютера" и пишем самой эту процедуру. То есть вот "Имя компьютера". На всякий случай зайдем в контекстную подсказку этой функции и посмотрим, может ли она выполняться в клиентском контексте. Я поставил курсор, нажимаю комбинацию клавиш Ctrl+F1. И вот здесь нас интересует вот этот нижний вариант "Глобальный контекст. Процедуры функции сеанса работы". И вы видите "Доступность: тонкий клиент, мобильный клиент, сервер и так далее". То есть мы с вами можем полнее использовать в клиентском контексте, даже если будем работать под тонким клиентом.

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

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

И, конечно же, вы мне скажете: "А зачем мы получаем имя компьютера напрямую вот из этой вот процедуры, если у нас есть параметр сеанса, в котором хранится имя компьютера?". Давайте получать имя компьютера из параметра сеанса. И давайте мы с вами попробуем это сделать. Вот это я закомментирую. И давайте попробуем получить имя компьютера из параметра сеанса. "Параметры сеанса. Имя компьютера". И вот она у нас сотряс он должно быть. Закроем и обновим. Запустим 1С:Предприятие. Придем в "Сервис", "Информация о системе". И у нас возникла ошибка: "Переменная не определена: Параметры сеанса". То есть вот у нас эта ошибка здесь появилась. Почему она возникла? Конечно же, вы должны мне уже сами на это ответить. Но на всякий случай, давайте посмотрим на вот эту коллекцию "Параметры сеанса". Синтаксис-помощник. Также ставим курсор и нажимаем Ctrl+F1. То есть вот это свойство глобального контекста. Так, вот мы получили "Параметры сеанса". И вы видите, что у этой коллекции "Доступность: сервер, толстый клиент". То есть она у нас под тонким клиентом работать не может. То есть мы с вами уже на клиенте, а вернее, на тонком клиенте не можем обращаться к параметру сеанса и получить какой-то параметр сеанса. Если мы хотим это сделать, то нам необходимо осуществлять серверный вызов.

Давайте мы это сделаем. Я вот так вот оставлю, как все есть, потому что вы потом будете на века смотреть этим пользоваться. И я создам новую команду, которую назову "Получить данные из параметров". Давайте перейдем на форму. То есть вот у меня закладка "Команды" открыта. И создадим новую команду формы. Так, давайте разместим ее в командной панели. И создадим обработчик этой команды. Команды "Получить данные из параметров". Также мы у свойства "Действия" нажмем вот на эту кнопку "Открыть". И в этом случае мы с вами выберем не вот тот первый вариант, который выбирали "Создать на клиенте", а выберем вот последний вариант "Создать на клиенте и процедуру на сервере". Окей. И видите, у нас автоматически была создана процедура на клиенте, которая вызывает процедуру на сервере, которая тоже была создана. То есть вот эта процедура. И сейчас мы здесь с вами напишем код, в котором будем получать имя компьютера из параметра сеанса и присваивать это значение реквизиту формы. А вот с каталогом программы вы сделаете самостоятельно. То есть вы самостоятельно создадите параметр сеанса, который будет называться "Каталог программы", и самостоятельно получите в данном случае значение из параметра сеанса. Это будет у вас такое домашнее задание.

Давайте обратимся к "Имя компьютера" равно "Параметры сеанса". И получаем "Имя компьютера". Все хорошо. Сохраним. Обновим. Так, опять я забыл открыть. Закроем. Так, и запустим наши 1С:Предприятие. "Гимнасия", "Сервис", "Информация о системе", "Получить из параметров сеанса". И вот мы получили этот самый наш сигнал. Это мы с вами использовали сейчас контекстный вызов. То есть у нас вот эта процедура "Получить данные из параметров" на сервере, она осуществляет вызов сервера, но при этом оно осуществляет контекстный вызов сервера. То есть у нас все данные формы передаются на сервер. И как следствие, у нас у этой процедуры доступны данные формы. То есть мы с вами смело обратились к реквизиту формы и присвоили этому реквизиту какое-то значение.

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

Так, и давайте вот этот вариант без контекста мы уберем. Пусть у нас будет нормальный вызов. И давайте рассмотрим еще один пример, который наглядно поможет вам отличать контекстный вызов формы от безконтекстного вызова формы. Мы попробуем с вами прочитать на сервере значения вот этих наших реквизитов управляемой формы. Это такой чистый учебный пример, который поможет наглядно показать отличие контекстного и безконтекстного вызова формы. Давайте мы с вами создадим еще одну команду, которую назовем "Прочитать данные".

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

Так, хорошо. Сохраним, обновим базу данных и запустим 1С:Предприятие в пользовательском режиме. Идем "Сервис", "Информация о системе". Сначала мы с вами получим данные, а потом "Прочитаем". И вот высшую информацию "Сигнал" и "Который программа". Хорошо. А теперь давайте сделаем безконтекстный вызов сервера. То есть мы эту директиву "На сервере" поменяем на директиву "На сервере без контекста". Поменяли. Сохраним. Вы видите, у нас уже при сохранении сразу же возникла ошибка, что "Переменная не определена". И спрашивает: "Продолжить или не продолжить?". Ну, давайте продолжим. Как мы попробуем обновить, запустим 1С:Предприятие. И попробуем открыть наш вот эту обработку. И уже нам ничего даже нет его открыть. Лучше ошибка, что "Переменная не определена". То есть наглядно видно, что по директиве "На сервере без контекста" нам контекст формы недоступен. То есть мы не можем работать ни с реквизитами, ни с чем остальным.

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

Теперь давайте свяжем общий модуль и формы. То есть покажем, как с форм обращаться к методам общих модулей. Вы помните из первой части этого урока, что у нас общий модуль есть клиентские, серверные, клиент-серверные. И также общие модули с вызовом сервера. Сначала мы сами научимся работать с клиентскими общими модулями. То есть вот у нас есть модуль "Общего назначения клиент". И в нем есть единственный метод, который так и называется "Показать название компьютера". Давайте мы этот метод вызовем на управляемой форме из клиентского общего модуля. Мы можем вызвать экспортную процедуру только из клиентского контекста. То есть мы можем процедуру под директивы "На клиенте" вызвать эту процедуру, а под директивы "На сервере" или "На сервере без контекста" - нет. Давайте это проверим.

Давайте создадим новую команду, которая будет называться "Прочитать данные клиент". Так, также у сюда вниз и перетащим. И давайте создадим действие у этой команды "На клиенте". То есть она у нас будет выполняться в клиентском контексте. И теперь вот в этой процедуре "На клиенте" мы с вами вызовем процедуру вот из нашего общего модуля "Общего назначения клиент". Делается это следующим образом: мы пишем название общего модуля. Если мы сейчас нажмем Ctrl+Пробел, то контекстная подсказка что-то нам предложит. То есть вот она предложила этот общий модуль "Общего назначения клиент". После этого пишем точку. И здесь выпадающий список нам предложит единственную нашу процедуру "Показать название компьютера". Все, мы с вами ее вызвали. Теперь давайте попробуем ее выполнить. Обновим. Так, вкладку закроем. И запустим 1С:Предприятие. Вот мы спокойно показали информацию о компьютере. То есть мы обратились к клиентской процедуре. Но в то же время, если мы с вами сделаем вызов этой процедуры в серверном контексте, то у нас ничего не получится. Давайте это попробуем. Никакие новые команды пока создавать не будем, а мы вот этот код внесем вот в эту нашу процедуру "Прочитать данные на сервере". То есть вот здесь вот она у нас будет. Так, мы ее и добавили. И прежде чем сохранить и что-то запускать, просто сделаем синтаксическую проверку. Синтаксическая проверка мы сделали, и уже на стадии проверки возникло сообщение, что "Переменная не определена: Общего назначения". Мы не видим уже в нашей процедуре на сервере. То есть процедуры и функции из клиентских общих модулей мы можем использовать только в так под директивы "На клиенте". И то имейте в виду.

Так, давайте сюда ее удалим. И так, с клиентскими общими модулями разобрались. А что же серверными общими модулями? Давайте посмотрим на модуль "Общего назначения". Вот этот вот у нас. У этого модуля одна процедура, которая присваивает параметру сеанса имя компьютера. Давайте же мы просто сделаем такую чудную процедуру, которая будет читать данные из параметра сеанса. И сделаем просто вот сообщения: "Мы видим значение параметра сеанса". И давайте мы с вами сделаем ее экспортной, чтобы мы могли ее вызвать. Потому что если мы в общем модуле какую-то функцию или процедуру не сделаем экспортной, только этой процедуры или функции можно будет обращаться только в этом модуле. Больше нигде к ней обращаться будет нельзя. Метр. Так, мы сами сделали экспортную процедуру в этом модуле. Хорошо.

Давайте сохраним ее и попробуем к этой процедуре обратиться уже на нашей форме. Так, вот у нас форма. Сначала мы с вами попробуем обратиться на клиенте. То есть мы попробуем с клиентского вот этого "Прочитать данные клиент" обратиться к этой процедуре модуля "Общего назначения". То есть вот "Получить параметр сеанса". Так, вот это процедура. Сохраним. Так, давайте сделаем синтаксическую проверку. Проверка все абсолютно нормально сработала. Давайте запустим 1С:Предприятие в пользовательском режиме. И видите, что даже при попытке открыть эту форму у нас возникла ошибка: "Переменная не определена: Общего назначения". В конфигуратор. То есть мы с вами не можем в клиентском контексте использовать процедуру или функцию, которая у нас написана в серверном модуле.

Но в то же время мы с вами это сможем сделать в серверном контексте. Давайте мы вот эту нашу процедуру, которая приводит к ошибкам, мы ее отсюда уберем и перенесем вот в эту процедуру "Прочитать данные на сервере". То есть это серверная процедура. "Прочитает данные на сервере". У нас, напомню, вызываются процедуры "Прочитать данные", которые у нас вызываются командой "Прочитать данные". Сейчас мы эту команду попробуем выполнить и посмотрим, что у нас произойдет. Если у нас произойдет все корректно, то у нас имя компьютера должно выйти два раза. Так, давайте обновим и запустим 1С:Предприятие. Так, давайте сначала получим данные, а потом выполним команду "Прочитать данные". И все у нас все корректно вышло. То есть нас сначала высшего вот это наш сигнал, потом вышел "Каталог программы", потом вышел опять "Сигнал", который в этот раз вызвала вот эта процедура "Прочитать параметр сеанса". То есть вот этот наш второй сигнал - это уже данные из параметра сеанса.

И так, мы с вами уже выяснили, что из клиентского контекста мы не можем использовать процедуру или функцию, которая у нас написана в серверном модуле. Но из первой части нашего урока вы должны помнить, что у нас у серверных общих модулей есть такое свойство, как "Вызов сервера". Если это свойство стоит, то значит, процедуру или функцию из серверного общего модуля можно вызвать с клиентского контекста. Мы это с вами уже делали. Давайте это сделаем еще раз. То есть вот у нас есть общий модуль "Вызов сервера", и у него стоит вот этот признак "Вызов сервера". Давайте мы какую-то процедуру из этого общего модуля попробуем вызвать вот нашей этой форме.

Так, вот это все пока закроем. И это все пока тоже закроем. Так, давайте откроем модуль. И у нас здесь есть две процедуры: это "Пробуем вызвать сервер" и "Уж то ведь параметры сеанса". И раз мы уже с вами вот в этом модуле "Общего назначения" создали метод "Прочитать параметр сеанса", который у нас является чисто серверным, то давайте вот в этом общем модуле "Вызов сервера" сделаем вызов вот этого метода. И тогда мы с вами сможем обращаться к этому методу нашей формы. Давайте это сделаем. Пусть это так сложно показываю, чит. Но давайте мы это сделаем. Я сейчас буду использовать шаблон. Я уже его использовал, просто не сказал, чтобы более быстро написать. Я нажимаю Ctrl+Пробел, выбираю процедуру. И здесь напишем название процедуры. Эта процедура будет называться "Получить параметр сеанса вызов сервера". И в этой процедуре мы сделаем вызов вот той вот нашей процедуры из модуля "Общего назначения", который является серверной. И все, больше ничего нам не надо делать. Ну, единственное, что нам эту процедуру нужно сделать экспортной, чем ее не увидим. Все. Теперь мы с вами в модуле формы обратимся вот к этой процедуре "Получить параметр сеанса вызов сервера", которая вызовет вот ту процедуру из серверного общего модуля. То есть сначала мы.

вызовем модуль общего назначения, вызов сервера. И у этого модуля мы будем использовать метод "получить параметры сеанса", вызов сервера. Вот так вот. Давайте сохраним, обновим и посмотрим, как у нас работает. И вы видите, у нас абсолютно нормально вышло второе название нашего компьютера. То есть, первое название мы получили при помощи вот этого клиентского общего модуля, а второе название мы получили при помощи серверного общего модуля, у которого стоял признак "вызов сервера". Вот это основное отличие.

И посмотрим, как у нас осуществляется работа с клиент-серверным общим модулем. Для этого мы вызовем единственную процедуру этого модуля сначала на клиенте, а потом на сервере. Так, давайте мы его откроем и посмотрим на эту процедуру. Вот она у нас одна, называется "доступна везде" и просто выводит вот такое сообщение. Давайте эту процедуру мы выведем вот в нашей последней обработчике команды "прочитать данные клиент". То есть, вот этот, этот обработчик, и мы здесь его выведем. Методы клиент-серверных общих модулей вызывается точно так же, как и методы остальных модулей. Пишется название этого модуля, потом ставится точка, а потом пишется название метода. Давайте это сделаем. То есть, вот наш общий модуль общего назначения "клиент-сервер". И все. Вот у нас единственная процедура - это "доступна везде". Давайте сохраним, обновим и посмотрим, как оно у нас будет работать. Так, зайдем в нашу обработку, и вот эта команда "прочитать данные клиент". И вы видите, наша процедура выполнялась в данном случае абсолютно нормально. Причем, обратите внимание, что мы вот эту процедуру "доступна везде" вызвали из клиентского контекста, и она у нас также выполнилась тоже на клиентском контексте.

Теперь давайте мы с вами доработаем вот эту команду "прочитать данные на сервере" и тоже в ней вызовем вот эту процедуру "доступна везде" из клиент-серверного общего модуля. Также пишем название общего модуля "клиент-сервер", точка, "доступна везде". Сохраним, давайте обновим и заново запустим 1С:Предприятие. Так, давайте сначала получим данные, чтобы у нас не было пустых данных. И все у нас точно так же выше сообщение, что мы используем процедуру "доступна везде". Причем, в этом случае у нас произошел серверный вызов. То есть, мы сервера вызвали сервер. То есть, если мы с вами используем процедуру из клиент-серверного общего модуля, которая, замечу, не идет ни под какой директивы компиляции, то мы эту процедуру можем использовать везде. А если мы сейчас, допустим, напишем какую-нибудь директиву компиляции, то тут возникают нюансы. Давайте вот мы эту процедуру "доступна везде" скопируем и сделаем, чтобы она у нас выполнялась в клиентском контексте. То есть, она будет притворяться директивы компиляции на клиенте. Так, сохраним. Так, я неправильно назвал директиву на клиенте. Так, сохранил. И теперь давайте вот здесь, в клиентском контексте, попробую вызвать эту процедуру. То есть, вот "доступна везде" клиент. У нас абсолютно нормально вызвать. Если мы сейчас идем в наше 1С:Предприятие и опять забыл закрыть, обновим и давайте зайдем в 1С:Предприятие, попробуем выполнить эту клиентскую процедуру. То есть, вот у нас выполнилась клиентская процедура. Но если мы с вами попробуем ее выполнить в серверном контексте, вот здесь вот, то у нас ничего не получится. Давайте сохраним и опять заново откроем. Так, давайте получим данные. "Прочитать данные" у нас выше ошибка, что метод объекта не обнаружен. То есть, мы с вами не можем использовать вот эту вот клиентскую процедуру в серверном контексте. Это имейте в виду. То есть, мы можем использовать здесь только серверную процедуру.

Давайте мы, кстати, это проверим. Давайте мы также сделаем еще один метод "доступна везде сервер". Она будет выполняться на сервере. Тупо "доступна везде на клиенте". 10 правильно, сервере. Так, здесь мы сейчас вместо с клиентского вызова сделаем серверный вызов "доступна везде сервер". Сохраним, закроем и давайте попробуем обновить и заново проверить. Сервис, может, системы. И все, в этом случае все нормально произошло. То есть, у нас вызвали серверную процедуру. А если сейчас мы эту серверную процедуру попытаемся вызвать уже в клиентском контексте, получателю на что-нибудь, давайте проверим. То есть, вот мы сначала "доступна везде клиент" вызвали, а потом "доступна везде сервер". Какие-то закроем и попробуем заново все запустить. И в этот раз возникла ошибка, что метод объекта не обнаружен. Почему? Потому что в этом случае мы с вами выполняли процедуру в серверном контексте, а у нас у этого клиент-серверного общего модуля, напомню вам, что флаг "вызов сервера" не стоит. Даже если мы с вами поставим вот этот флажок "вызов сервера", то у нас все равно вызов сервера в клиент-серверном общем модуле не будет работать. То есть, желательно, если вы хотите делать вызов сервера, это необходимо использовать для этого какой-то отдельно общий модуль, который будет так называться "вызов сервера".

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

Сейчас мы с вами научимся пользоваться этими инструкциями препроцессора. И для того, чтобы разобраться, как работают инструкции препроцессора, давайте решим с вами небольшую простую задачку. Мы при помощи этих инструкций при начале работы нашего приложения будем определять, под каким видом клиента работает это приложение: под толстым клиентом, или под тонким клиентом, или под каким-то иным видом клиента. Давайте зайдем в уже знакомый нам модуль "приложение". Здесь, вот в этом обработчике "при начале работы системы", мы и будем определять, под каким видом клиента работает наше приложение и также выводить соответствующее сообщение. Как задать нам инструкцию препроцессора в коде? Мы пишем с вами решетку, и после этой решетки, как правило, пишется конструкция "если". То есть, при помощи этой конструкции мы и будем указывать, что если у нас какой-то вид клиента или такой-то контекст, у нас выполняется такой-то кусок кода, в другом случае у нас выполняется другой кусок кода. Чуть позже я вам покажу, где найти вот эти самые определения: "тонкий клиент", "толстый" и так далее. То есть, мы пишем ключевое слово "если". Мы это уже знаем. Если. И в этом суть. Пишется конкретная запись, то есть "тонкий клиент". Потом пишется "тогда", и здесь мы выводим уже наше сообщение. То есть, у вас здесь вместо сообщения может выполняться любой другой кусок кода, который вы сочтете нужным.

Теперь нам необходимо отработать условие "иначе если". То есть, в случае, когда у нас работает толстый клиент. Также мы пишем решетку. То есть, в этом случае обязательно у нас пишется решетка. Сейчас мы опять пишем конкретное название - это "толстый клиент", "управляемое приложение". Она тоже зафиксирована. Здесь вот мы что попало, что нам придет на ум писать не можем. Пишем ключевое слово "тогда" и выведем опять сообщение: "запустили под толстым клиентом". И здесь мы просто пишем "иначе". То есть, опять следующей инструкции у нас начинается с решетки. Она все они всегда начинается с решетки. Здесь просто выведем "сообщить", что "что-то другое". И обязательно напишем "конец если". То есть, опять мы пишем решетку и "конец если".

Теперь, как нам узнать вот название всех вот этих "тонкий клиент", "толстый клиент"? Я же сейчас вам сказал, что они конкретно зафиксированы. Где нам это посмотреть? Посмотреть об этих названиях мы можем в синтакс-помощнике. Давайте зайдем в синтакс-помощник. И здесь нас интересует такой вот раздел, который так и называется "инструкции препроцессора". То есть, вот здесь идет. Тут как раз вот эти термины: это "если", "иначе если", "тогда", "в основу". То есть, у нас идут они также "область", "конец области". Мы с вами "область", "конец области" еще изучим. А "вставка" и "конец вставки" и "удаление", "конец удаления" мы в этом уроке проходить не будем. И после этого идут вот эти вот термины: "тонкий клиент", "веб-клиент", "мобильный клиент" и так далее. То есть, вот они должны быть. Хотя, конечно, тут и написано, что регистр значения не имеет, но хорошим тоном будет считаться делать это все с учетом регистра. То есть, вот, в принципе, их не так много. То есть, мы можем при помощи инструкций препроцессора и конструкции "если" определить, под каким видом клиента у нас запущена наше приложение.

Так, давайте мы с вами сохраним, обновим и зайдем в 1С:Предприятие. Так, я неправильно ключевое слово "тогда" написал. То забыл. А, эти. Опять сохраним, обновим и зайдем в 1С:Предприятие. Так, вот возникло сообщение, что мы запустили под тонким клиентом. И все сработало. Теперь давайте попробуем запустить под толстым клиентом. Идем "Отладка", "Начать". Так, и "толстый клиент". Если мы сейчас откроем окно программы, увидим здесь, что "толстый клиент". То есть, первое назначение инструкции препроцессора - это можно определять, под каким видом клиента у нас запущена наше приложение.

Также при помощи инструкции препроцессора можно разделять клиент и сервер клиент-серверных общих модулей. У нас с вами создан был клиент-серверный общий модуль "общего назначения", и здесь вот есть у нас такая процедура, которая называется "доступна везде". Эта процедура у нас может выполняться и на клиенте, и на сервере, как вы помните. Но давайте эту процедуру усложним. Мы при помощи инструкции препроцессора сейчас можем определить, когда выполняется наш код на клиенте, а когда выполняется наш код на сервере. Давайте это сделаем. В этом случае мы также пишем решетку, также пишем "если". Он у нас, в принципе, других вариантов для инструкций препроцессора уже нету, только "если", "область", "вставка" и "удаление" и так далее. Мы пишем "если", и теперь мы пишем слово "сервер". И здесь мы указываем, что используем процедуру "доступна везде на сервере". Теперь мы также пишем ключевое слово "иначе если". Давайте это скопирую, и в этот раз мы пишем "клиент". И мы пишем "конец если" тоже через решетку. Все. Давайте мы так красиво сделаем. Так. И где у нас выполняется это "доступна везде"? То есть, мы сейчас идем в этот модуль. То есть, она у нас выполняется в двух местах. Сервер мы тогда уберем, потому что у нас приводит к ошибке, как вы помните. И здесь "доступна везде клиент" закомментируем. Здесь просто будем выполнять "доступна везде". То есть, сейчас мы вместо "доступна везде клиент" будем выполнять вот наш старый метод, который самый первый раз сделали, "доступна везде". Но если инструкция препроцессора работает корректно, то у нас выйдет сообщение, что наша процедура сработала на клиенте. То же самое мы сделаем для сервера. То есть, мы это "доступна везде сервер" запоминать будем вот так вот. И сейчас давайте проверим, как сработает наш инструкция препроцессора, определит ли она контекст. Так, сначала посмотрим, как у нас на клиенте работает. Так, в этот раз мы смогли все нормально получить. "Доступна везде на клиенте". Так, и теперь давайте прочитаем данные. То есть, в этот раз у нас должна выполниться наша процедура "доступна везде" в серверном контексте. Еще у нас выполнилась на сервере. Так, давайте ещё раз посмотрим. Также, заметьте, здесь есть другие слова: "на клиенте" и "на сервере". Давайте попробуем на них поменять. Так, я заблудился. Я обновлю и запущу 1С:Предприятие. Информация системе. Так, давайте сначала клиент "доступна везде на клиенте" и сервер "доступна везде на сервере". То есть, вот у нас для того, чтобы определить клиентский серверный контекст, есть два таких ключевых слова: "на клиенте" и "на сервере". Они, в принципе, одинаковые. Чем они конкретно отличаются в данном случае? Ну, честно говоря, не нашел. Если у вас есть какие-то варианты, соображения, любишь знаете, куда дополнительную информацию, можете смело написать в комментариях. Я почитаю, и вполне возможно, что это будет очень интересно и нужно. Комментарий для остальных. То же самое главное, вот то, что я вам сейчас показал, 1С этого не рекомендует делать. То есть, рекомендация 1С - не использовать клиентские и серверные инструкции препроцессора на клиент-серверных общих модулях, потому что нельзя точно в клиент-серверных общих модулях определить, что выполняется на клиенте, а что выполняется на сервере. То есть, нельзя точно и надежно определить контекст исполнения. Поэтому забудьте все, что я вам сейчас показал. Но тем не менее, такая возможность имеется.

И давайте рассмотрим ещё одну инструкцию препроцессора - это "область". Эта инструкция никак не влияет на исполнение кода. То есть, она ни на что не влияет и нужна только для красивой группировки кода. Давайте мы это сделаем. Давайте мы зайдем в наш модуль "приложение". Здесь сгруппируем наш код. Заметьте, у нас здесь код по определенной с вами идет логике. То есть, есть код "получить", "вывести", "прочее". И давайте мы сделаем такие области. Все инструкции препроцессора у нас начинается с решетки. То есть, мы пишем решетку, "область". После ключевого слова "область" идет название области. Давайте нашу область назовем "выводим". Здесь пишем также решетку и "конец области". И все. Сейчас мы все наши процедуры с выведением перетащим вот в эту область. То есть, вот мы "вывести" перетащили. Давайте ещё вот у нас "вывести" есть, такие перетащим. Так, вот ещё "выведем сообщение". Чего перетащим? Ну и все, в принципе, по моему достаточно. И давайте создадим другую область, которую назовем "получаем". Также мы пишем решетку, "область" и "конец области". И также вот мы этот "поучить завтрашний день" и "вчерашний день" до поместим. И также давайте создадим область "вычисляем". И также вот мы эти вычисления до поместим. Все замечательно. То есть, мы с вами можем использовать области как и над нашими процедурами, функциями, то есть группировать при помощи этих областей наши процедуры и функции. Так мы их можем использовать и внутри просто кода. Давайте вот мы этот код, который сделали на уроке, вот этот вот наш с вами, тоже затащим в область. И давайте вот всё закомментировано. И мы сюда перетащим. Ещё мы можем здесь все свернуть. Так, вот чтобы у нас все это было красиво. Все при помощи областей мы просто можем делать наш код удобным, красивым и хорошо читаемым.

На этом мы закончим этот урок. И, конечно же, у вас возникнет вопрос: что делать дальше? А дальше вы должны сделать следующее: во-первых, вы должны сделать все примеры с этого урока и потом сделать их еще раз. Второе: вы должны сделать домашнее задание и тоже потом сделать его еще раз. Запомните, чем больше вы программируете, тем она более эффективно откладывается у вас в мозгу. И, конечно же, отпишитесь в комментариях к этому видео о том, что у вас получилось. И не забудьте поставить лайк этому видео, и тем самым вы очень поможете мне продвинуть мой канал и мою группу. И бы вы это видео не смотрели. Эффективного и продуктивного вам обучения. До скорой встречи.