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

В 1C:EDT

страница

В 1C:EDT

В конфигурации центральной базы добавьте объект конфигурации – обработку с именем ОбменСОтделениями.

Создайте основную форму обработки. Добавьте в форму реквизит Отделение с типом ПланОбменаСсылка.Отделения и перетащите его в окно элементов формы.

Затем поочередно создайте команды формы: СоздатьНачальныйОбраз, ЗаписатьИзмененияи ПрочитатьИзменения. Создайте клиентские обработчики этих команд в модуле формы, затем перейдите на закладку Форма и поочередно перетащите эти команды в окно элементов формы.

В результате форма обработки примет следующий вид (рис. 25.29).

**Рис. 25.**29. Форма обработки

В свойствах кнопки СоздатьНачальныйОбраз снимите флажок Доступность.

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

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

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

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

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

 

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

 

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

Затем создайте клиентский обработчик события ОбработкаВыбора для элемента формы Отделениеи заполните его следующим образом (листинг 25.26).

Листинг 25.26. Процедура «ПолеВводаОтделениеОбработкаВыбора()»

&НаКлиенте

Процедура ОтделениеОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)

 

Если ПредопределенныйУзел(ВыбранноеЗначение)Тогда

Элементы.СоздатьНачальныйОбраз.Доступность = Ложь;

 

Иначе

Элементы.СоздатьНачальныйОбраз.Доступность = Истина;

 

КонецЕсли;

 

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

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

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

Листинг 25.27. Обработчик нажатия кнопки «Создать начальный образ»

&НаКлиенте

Асинх Процедура СоздатьНачальныйОбраз(Команда)

 

Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.ВыборКаталога);

Диалог.Заголовок = "Укажите каталог информационной базы:";

 

Если Ждать Диалог.ВыбратьАсинх() <> Неопределено Тогда

СоздатьНачальныйОбразНаСервере(Отделение, Диалог.Каталог);

 

Сообщить("Создание начального образа узла завершено.");

 

КонецЕсли;

 

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

После этого добавьте в модуль процедуру СоздатьНачальныйОбразНаСервере() (листинг 25.28).

Листинг 25.28. Процедура «СоздатьНачальныйОбразНаСервере»

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

Процедура СоздатьНачальныйОбразНаСервере(Узел, КаталогСоединения)

 

ПланыОбмена.СоздатьНачальныйОбраз(Узел, "File =""" + КаталогСоединения + """");

 

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

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

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

Теперь заполните обработчик команды ЗаписатьИзменения.

Текст обработчика будет выглядеть следующим образом (листинг 25.29). Здесь также обратите внимание на то, что перед ключевым словом Процедура нужно добавить модификатор Асинх.

Листинг 25.29. Обработчик нажатия кнопки «Записать изменения»

&НаКлиенте

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

 

Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);

Диалог.Заголовок = "Укажите файл обмена:";

Если Ждать Диалог.ВыбратьАсинх() <> Неопределено Тогда

ЗаписатьИзмененияНаСервере(Отделение, Диалог.ПолноеИмяФайла);

 

Сообщить("Запись изменений завершена.");

 

КонецЕсли;

 

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

После этого добавьте в модуль процедуру ЗаписатьИзмененияНаСервере () (листинг 25. 30).

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

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

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

 

// Создать и проинициализировать объект ЗаписьXML.

ЗаписьXML = Новый ЗаписьXML;

ЗаписьXML.ОткрытьФайл(ИмяФайла);

 

// Создать объект ЗаписьСообщенияОбмена и начать запись сообщения.

ЗаписьСообщения = ПланыОбмена.СоздатьЗаписьСообщения();

ЗаписьСообщения.НачатьЗапись(ЗаписьXML, Узел);

 

// Записать содержимое тела сообщения обмена данными распределенной ИБ.

ПланыОбмена.ЗаписатьИзменения(ЗаписьСообщения);

 

// Закончить запись сообщения и запись XML.

ЗаписьСообщения.ЗакончитьЗапись();

ЗаписьXML.Закрыть();

 

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

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

В этой процедуре вы создаете объект ЗаписьXML для работы с этим файлом.

Затем вы создаете объект ЗаписьСообщенияОбмена, с помощью которого будете формировать сообщение обмена. В методе НачатьЗапись(), во втором параметре, вы указываете, для какого узла обмена будет создаваться это сообщение.

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

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

Узнай больше!

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

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

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

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

И последним вы заполните обработчик команды ПрочитатьИзменения.

Текст обработчика будет выглядеть следующим образом (листинг 25.31). Здесь также обратите внимание на то, что перед ключевым словом Процедура нужно добавить модификатор Асинх.

Листинг 25.31. Обработчик нажатия кнопки «Прочитать изменения»

&НаКлиенте

Асинх Процедура ПрочитатьИзменения(Команда)

 

Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);

Диалог.Заголовок = "Укажите файл обмена:";

Если Ждать Диалог.ВыбратьАсинх() <> Неопределено Тогда

ПрочитатьИзмененияНаСервере(Диалог.ПолноеИмяФайла);

 

Сообщить("Чтение изменений завершено.");

 

КонецЕсли;

 

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

После этого добавьте в модуль процедуру ПрочитатьИзмененияНаСервере () (листинг 25. 32).

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

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

Процедура ПрочитатьИзмененияНаСервере(ИмяФайла)

 

// Создать и проинициализировать объект ЧтениеXML.

ЧтениеXML = Новый ЧтениеXML;

ЧтениеXML.ОткрытьФайл(ИмяФайла);

 

// Создать объект ЧтениеСообщенияОбмена и начать чтение сообщения.

ЧтениеСообщения = ПланыОбмена.СоздатьЧтениеСообщения();

ЧтениеСообщения.НачатьЧтение(ЧтениеXML);

 

// Прочитать содержимое тела сообщения.

ПланыОбмена.ПрочитатьИзменения(ЧтениеСообщения);

 

// Закончить чтение сообщения и чтение XML.

ЧтениеСообщения.ЗакончитьЧтение();

ЧтениеXML.Закрыть();

 

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

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

В этой процедуре вы создаете объект ЧтениеXML для работы с этим файлом. Затем создаете объект ЧтениеСообщенияОбмена для чтения сообщения, содержащегося в указанном файле.

Затем методом ПрочитатьИзменения() объекта ПланыОбменаМенеджер вы читаете полученное сообщение.

В конце процедуры вы завершаете чтение сообщения обмена и закрываете файл.

Теперь настройте интерфейс прикладного решения.

Сначала включите обработку ОбменСОтделениями в подсистему Предприятие.

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

В конце настройте командный интерфейс основного раздела для администратора. Добавьте команды для открытия форм Общие настройки, Обмен данными и Обмен с отделениями в список команд основного раздела и задайте видимость этих форм только для роли Администратор(рис. 25.30).

**Рис. 25.**30. Настройка командного интерфейса основного раздела для администратора

Теперь расположите формы списков планов обмена Филиалы и Отделения на начальной странице администратора.

Для этого сначала создайте форму списка плана обмена Отделения. После этого добавьте формы списка планов обмена Филиалы и Отделения в левую часть начальной страницы и задайте видимость этих форм только для роли Администратор(рис. 25.31).

**Рис. 25.**31. Настройка начальной страницы для администратора