Опубликован: 06.12.2011 | Уровень: для всех | Доступ: платный
Лекция 3:

Константы, основы клиент-серверного программирования, общие реквизиты

< Лекция 2 || Лекция 3: 12345 || Лекция 4 >

Основы клиент-серверного программирования

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

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

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

&НаКлиенте
Процедура ПриОткрытии(Отказ)
    Сообщить("Вы открыли форму констант!");
    Сообщить(ПолучитьКонстанту()+" - из функции модуля формы без директивы");
    Сообщить(СерверныеФункции.ПолучитьКонстанту()+" - из общего модуля");
    Сообщить(ПолучитьКонстантуНаСервере()+" - из функции модуля формы с директивой &НаСервере");
 КонецПроцедуры

//По умолчанию функция считается серверной
 Функция ПолучитьКонстанту() 
    //Возвращаем полученное значение константы
    Возврат(Константы.ТекстСообщения.Получить());
КонецФункции

//Директива компиляции задана явно
&НаСервере
 Функция ПолучитьКонстантуНаСервере() 
    //Возвращаем полученное значение константы
    Возврат(Константы.ТекстСообщения.Получить());
КонецФункции 

Здесь мы создали пару функций – одну назвали ПолучитьКонстанту(), при ее описании директиву компиляции мы не указывали. Вторую назвали ПолучитьКонстантуНаСервере() – при ее описании была указана директива &НаСервере. Мы вызвали эти функции для вывода сообщения в клиентской процедуре ПриОткрытии(). У нас уже есть серверная функция в общем модуле СерверныеФункции – здесь показан пример ее использования, в подобном случае, возникшем при реальной разработке, если действия, которые выполняются в серверной функции модуля формы, совпадают с действиями функции, описанной в общем модуле, можно и даже нужно пользоваться функцией общего модуля.

На рис. 2.19. вы можете видеть вывод сообщений, выполненный вышеприведенным кодом.

Вывод сообщения в форму констант, разные варианты работы с серверными данными

Рис. 2.19. Вывод сообщения в форму констант, разные варианты работы с серверными данными

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

Таблица 2.1. Применение директив компиляции в модулях и переменных
Директивы компиляции Модули Переменные
Модуль формы Модуль команды Общий модуль
&НаКлиенте Да Да Да Да
&НаСервере Да Да Да Да
&НаКлиентеНаСервере Нет Да Нет Нет
&НаСервереБезКонтекста Да Нет Нет Нет
&НаКлиентеНаСервереБезКонтекста Да Нет Нет Нет

Опишем основные особенности их применения:

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

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

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

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

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

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

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

Общие реквизиты

Общие реквизиты являются новой возможностью, которая была добавлена в 14-й релиз платформы 1С:Предприятие 8.2. Общие реквизиты можно использовать двумя способами. Первый из них заключается в использовании их, как, собственно, реквизитов, которые присутствуют у всех (или у достаточно большого количества) объектов конфигурации. Второй способ предусматривает использование общих реквизитов в механизме разделения данных в качестве разделителей данных. В базе, использующей механизм разделения данных, могут работать несколько пользователей, набор данных каждого из которых не пересекается с набором данных других пользователей, то есть – каждый из них считает, что база содержит лишь "его" данные и ничего больше.

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

  • планы обмена
  • справочники
  • документы
  • планы видов характеристик
  • планы счетов
  • планы видов расчета
  • регистры сведений
  • регистры накопления
  • регистры бухгалтерского учета
  • регистры расчета
  • бизнес-процессы
  • задачи

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

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

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

Создадим новый общий реквизит со следующими параметрами, рис. 2.20.:

Имя: Комментарий

Тип: Строка, длина 50

Настройка общего реквизита

увеличить изображение
Рис. 2.20. Настройка общего реквизита

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

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

Создадим второй общий реквизит:

Имя: Организация

Тип: СправочникСсылка.Организации

Автоиспользование: Использовать

Этот реквизит мы планируем добавить ко всем объектам, допускающим использование общих реквизитов, за исключением справочника Организации и некоторых других. Перейдем в окно настройки состава общего реквизита и установим свойство Использование у справочника Организации в значение Не использовать, рис. 2.21.

Настройка общего реквизита

увеличить изображение
Рис. 2.21. Настройка общего реквизита

Откроем нашу конфигурацию в режиме 1С:Предприятие и посмотрим, как выглядит документ ПоступлениеМатериалов и справочники Организации и Сотрудники.

Для начала перейдем на вкладку Оперативный учет материалов. Обратите внимание на то, что в панель навигации раздела были автоматически добавлены ссылки для доступа к только что созданному справочнику Организации и к документу Поступление материалов. Щелкнем по ссылке Организации. В рабочей области окна появится список справочника. На данный момент он пуст, так как мы пока не заполняли справочник организациями, по которым будет вестись учет в базе. Щелкнем по кнопке Создать, которая расположена на командной панели списка – появится отдельное окно для заполнения свойств элемента справочника, рис. 2.22. Можно отметить, что помимо стандартных реквизитов (Наименование, Код) данный справочник не содержит ничего другого – это неудивительно, мы исключили его из состава общего реквизита Организация.

Справочник Организации

Рис. 2.22. Справочник Организации

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

Справочник Сотрудники

Рис. 2.23. Справочник Сотрудники

Откроем, наконец, окно создания документа ПоступлениеМатериалов. Здесь мы видим два общих реквизита – Комментарий и Организация, рис. 2.24.

Документ ПоступлениеМатериалов

Рис. 2.24. Документ ПоступлениеМатериалов

Выводы

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

< Лекция 2 || Лекция 3: 12345 || Лекция 4 >
Лариса Дятчина
Лариса Дятчина

Код 

&НаКлиенте

Процедура ОсновноеКонтактноеЛицоПриИзменении(Элемент)

Если НЕ ПроверитьЗаполнениеРеквизита() Тогда

 Сообщить("Выбранное контактное лицо, "+Объект.ОсновноеКонтактноеЛицо+",не работает у контрагента.");

КонецЕсли;

КонецПроцедуры

 

&НаСервере

Функция ПроверитьЗаполнениеРеквизита()

 Возврат (Объект.ОсновноеКонтактноеЛицо.ПредставительРаботает);  

КонецФункции

&НаСервере

Процедура УстановитьНомерПредставителя()

 

 Объект.ТелефонКонтактногоЛица=Объект.ОсновноеКонтактноеЛицо.КонтактныеСведения;

КонецПроцедуры

При проверке выдает ошибку:

{Справочник.Контрагенты.Форма.ФормаСписка.Форма(12,11)}: Переменная не определена (Объект)
 Возврат (<<?>>Объект.ОсновноеКонтактноеЛицо.ПредставительРаботает);   (Проверка: Сервер)
{Справочник.Контрагенты.Форма.ФормаСписка.Форма(17,2)}: Переменная не определена (Объект)
 <<?>>Объект.ТелефонКонтактногоЛица=Объект.ОсновноеКонтактноеЛицо.КонтактныеСведения; (Проверка: Сервер)
{Справочник.Контрагенты.Форма.ФормаСписка.Форма(17,32)}: Переменная не определена (Объект)
 Объект.ТелефонКонтактногоЛица=<<?>>Объект.ОсновноеКонтактноеЛицо.КонтактныеСведения; (Проверка: Сервер)
{Справочник.Контрагенты.Форма.ФормаСписка.Форма(6,41)}: Переменная не определена (Объект)
 Сообщить("Выбранное контактное лицо, "+<<?>>Объект.ОсновноеКонтактноеЛицо+",не работает у контрагента."); (Проверка: Тонкий клиент)

 

работаю на версии 1С:Предприятие 8.3 (8.3.10.2650)

максим матасов
максим матасов
Леонид Альбрехт
Леонид Альбрехт
Россия, Екатеринбург, 10, 2004
Оксана Максимова
Оксана Максимова
Россия, Екатеринбург, Уральский государственный университет им. А. М. Горького, 2013