644 документа
← К списку

Добавление плана обмена

страница

Добавление плана обмена

В режиме «Конфигуратор»

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

Раскроем ветвь Общие дерева объектов конфигурации и добавим новый объект конфигурации План обмена с именем Филиалы, представление объекта - Филиал.

На закладке Данные создадим реквизит плана обмена Главный, имеющий тип Булево (рис. 24.2).

Рис. 24.2. Реквизит плана обмена

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

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

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

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

Состав данных обмена должен выглядеть следующим образом (рис. 24.3).

Рис. 24.3. Состав данных обмена

Теперь на закладке Формы окна редактирования объекта конфигурации нажмем кнопку открытия и с помощью конструктора создадим основную форму узла (рис. 24.4).

Рис. 24.4. Создание формы узла обмена

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

Этот обработчик понадобится нам для того, чтобы запретить установку реквизита Главный для предопределенного узла, соответствующего данной информационной базе (листинг 24.4).

Листинг 24.4. Обработчик события формы «ПриСозданииНаСервере»

&НаСервере

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

 

Если Объект.Ссылка = ПланыОбмена.Филиалы.ЭтотУзел() Тогда

Элементы.Главный.Доступность = Ложь;

 

КонецЕсли;

 

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

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

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

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

Для этого на закладке Команды создадим команду ЗарегистрироватьИзменения.

В открывшейся палитре свойств нажмем кнопку открытия в строке Действие.

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

В модуле формы будут созданы шаблоны двух процедур: клиентской процедуры ЗарегистрироватьИзменения() и серверной внеконтекстной процедуры ЗарегистрироватьИзмененияНаСервере(), которая вызывается из клиентской процедуры.

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

В процедуру ЗарегистрироватьИзмененияНаСервере() нам нужно передать в качестве параметра ссылку на объект ПланОбмена.Филиалы, используя свойство ТекущаяСтрока для таблицы Список (источником данных этой таблицы является динамический список узлов плана обмена Филиалы).

Поэтому изменим текст модуля следующим образом (листинг 24.5).

Листинг 24.5. Текст обработчика команды «ЗарегистрироватьИзменения»

&НаКлиенте

Процедура ЗарегистрироватьИзменения(Команда)

 

ЗарегистрироватьИзмененияНаСервере(Элементы.Список.ТекущаяСтрока);

 

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

 

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

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

// Вставить содержимое обработчика.

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

В процедуру ЗарегистрироватьИзмененияНаСервере() мы поместим следующий текст (листинг 24.6).

Листинг 24.6. Процедура «ЗарегистрироватьИзмененияНаСервере»

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

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

 

// Регистрация изменений всех данных для узла.

ПланыОбмена.ЗарегистрироватьИзменения(Узел);

 

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

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

В этот метод передается ссылка на текущий узел плана обмена Филиалы.

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

В заключение перейдем на закладку Форма и перетащим команду ЗарегистрироватьИзменения из окна команд в командную панель формы.

В результате форма списка примет вид (рис. 24.5).

Рис. 24.5. Форма списка плана обмена

Заметьте, что при перетаскивании команды в дерево элементов формы имя кнопки может не совпадать с именем команды, с которой она связана. В частности, при перетаскивании команды в командную панель формы к имени команды автоматически добавляется префикс «Форма». Поэтому кнопке присваивается имя ФормаЗарегистрироватьИзменения. Именно по этому имени мы будем обращаться к кнопке из встроенного языка (см. листинг 24.8).

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

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

Листинг 24.7. Функция «ПредопределенныйУзел()»

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

Функция ПредопределенныйУзел(Узел)

 

Возврат Узел = ПланыОбмена.Филиалы.ЭтотУзел();

 

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

Затем в окне элементов формы выделим элемент Список, вызовем его палитру свойств и создадим обработчик события ПриАктивизацииСтроки. Укажем, что событие будет обрабатываться только на клиенте.

Заполним обработчик следующим образом (листинг 24.8).

Листинг 24.8. Обработчик события «ПриАктивизацииСтроки()» элемента формы «Список»

&НаКлиенте

Процедура СписокПриАктивизацииСтроки(Элемент)

 

Если ПредопределенныйУзел(Элемент.ТекущаяСтрока) Тогда

Элементы.ФормаЗарегистрироватьИзменения.Доступность = Ложь;

 

Иначе

Элементы.ФормаЗарегистрироватьИзменения.Доступность = Истина;

 

КонецЕсли;

 

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

В этой процедуре доступность кнопки Зарегистрировать изменения определяется в зависимости от значения функции ПредопределенныйУзел(), в которую передается ссылка на текущий узел (Элемент.ТекущаяСтрока).

На этом создание плана обмена завершено, и мы можем перейти непосредственно к созданию процедур обмена данными.