1с план обмена как работает
Перейти к содержимому

1с план обмена как работает

  • автор:

План обмена

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

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

В одном прикладном решении может существовать несколько планов обмена, каждый из которых может описывать свой порядок обмена данными. Например, если выполняется обмен данными с удаленными складами и удаленными офисами, то, скорее всего, будет существовать два плана обмена (один для обмена со складами, другой — для офисов), поскольку состав данных, которыми производится обмен со складами, будет значительно «уже», чем состав данных, предназначенных для обмена с офисами.

Назначение

В плане обмена хранится список узлов, — участников обмена в распределенной информационной системе. В качестве узлов могут выступать информационные базы 1С:Предприятия 8, информационные базы 1С:Предприятия 7.7 или другие информационные системы, не основанные на 1С:Предприятии.

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

План обмена

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

Также в плане обмена указывается состав данных, которыми предполагается вести обмен:

План обмена

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

Механизмы, реализуемые планом обмена

  • Механизм распределенных информационных баз
    Позволяет создавать в рамках конкретного плана обмена распределенную информационную базу. Распределенная информационная база представляет собой иерархическую структуру, состоящую из отдельных информационных баз 1С:Предприятия — узлов распределенной информационной базы, между которыми организован обмен данными с целью синхронизации конфигурации и данных. Подробнее…

Планы обмена и их использование

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

Подобно тому, как элементами данных справочника являются элементы справочника, элементами данных плана обмена являются узлы плана обмена. Каждый узел идентифицирует участника обмена по данному плану обмена. Кроме этого в каждом плане обмена всегда существует один предопределенный узел, идентифицирующий данную информационную базу.
В состав данных, которыми может производиться обмен, входят элементы информационных структур базы данных, которые описываются следующими объектами встроенного языка:
Константа.МенеджерЗначения.;
СправочникОбъект.;
ДокументОбъект.;
ПоследовательностьНаборЗаписей.;
ПланВидовХарактеристикОбъект.;
ПланСчетовОбъект.;
ПланВидовРасчетаОбъект.;
РегистрСведенийНаборЗаписей.;
РегистрНакопленияНаборЗаписей.;
РегистрБухгалтерииНаборЗаписей.;
РегистрРасчетаНаборЗаписей.;
ПерерасчетНаборЗаписей.;
БизнесПроцессОбъект.;
ЗадачаОбъект.;
УдалениеОбъекта.

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

Создание плана обмена Филиалы

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

Теперь с помощью конструктора создадим основную форму узла, чтобы описать в ней некоторые действия, которые должны выполняться при создании нового узла обмена.
Суть этих действий будет заключаться в том, что при создании нового узла обмена мы должны будем сформировать для него все необходимые записи регистрации изменений для всех объектов конфигурации, входящих в данный план обмена. Это будет своего рода начальная синхронизация узла обмена всеми данными обмена.
Прежде всего, опишем в модуле формы узла служебную переменную, которая будет хранить признак того, является ли записываемый узел новым или нет.
Перем РегистрацияВНовыйУзел;
Затем создадим обработчик события формы ПередЗаписью.
Код 1C v 8.х

 Процедура ПередЗаписью(Отказ) 
РегистрацияВНовыйУзел = ЭтоНовый();
КонецПроцедуры

Этот обработчик и будет устанавливать значение нашей служебной переменной в Истина в случае записи нового узла плана обмена.
После этого создадим обработчик события формы ПриЗаписи.
Код 1C v 8.х

 Процедура ПриЗаписи(Отказ) 
Если РегистрацияВНовыйУзел Тогда
// Регистрация изменений всех данных для узла
ПланыОбмена.ЗарегистрироватьИзменения(Ссылка);
КонецЕсли;
КонецПроцедуры

Создание обработки Обмен данными

Откроем конфигуратор и создадим новый объект конфигурации Обработка с именем ОбменДанными. Перейдем на закладку Прочее и откроем модуль объекта.
Создадим в нем процедуру ОбменСФилиалами.
Код 1C v 8.х

 Процедура ОбменСФилиалами() Экспорт 
ВыборкаУзлов = ПланыОбмена.Филиалы.Выбрать();
Пока ВыборкаУзлов.Следующий() Цикл
// Произвести обмен данными со всеми узлами, кроме текущего (ЭтотУзел)
Если ВыборкаУзлов.Ссылка <> ПланыОбмена.Филиалы.ЭтотУзел() Тогда
УзелОбъект = ВыборкаУзлов.ПолучитьОбъект();
// Получить сообщение
УзелОбъект.ПрочитатьСообщениеСИзменениями();
// Сформировать сообщение
УзелОбъект.ЗаписатьСообщениеСИзменениями();
КонецЕсли;
КонецЦикла;
КонецПроцедуры

Теперь создадим основную форму обработки и в обработчик события нажатия кнопки Выполнить – КнопкаВыполнитьНажатие вставим вызов процедуры ОбменСФилиалами().
Код 1C v 8.х

Аренда 1С в облаке

 Процедура КнопкаВыполнитьНажатие(Элемент) 
ОбменСФилиалами();
КонецПроцедуры

Создание процедуры записи данных

Сами процедуры записи и чтения данных обмена мы разместим в модуле объекта План обмена Филиалы. Сначала создадим процедуру, которая используется нами при обмене данными, – ЗаписатьСообщениеСИзменениями.
Код 1C v 8.х

 Процедура ЗаписатьСообщениеСИзменениями() Экспорт 
Сообщить("-------- Выгрузка в узел " + Строка(ЭтотОбъект) + " ---------");
Каталог = КаталогВременныхФайлов();
// Сформировать имя временного файла
ИмяФайла = Каталог +?(Прав(Каталог, 1) = "\","", "\") + "Message"
+ СокрЛП(ПланыОбмена.Филиалы.ЭтотУзел().Код) + "_" +
СокрЛП(Ссылка.Код) + ".xml";
// Создать объект записи XML
// *** Запись XML-документов
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл(ИмяФайла);
ЗаписьXML.ЗаписатьОбъявлениеXML();
// *** Инфраструктура сообщений
ЗаписьСообщения = ПланыОбмена.СоздатьЗаписьСообщения();
ЗаписьСообщения.НачатьЗапись(ЗаписьXML, Ссылка);
Сообщить("Номер сообщения: " + ЗаписьСообщения.НомерСообщения);
// Получить выборку измененных данных
// *** Механизм регистрации изменений
ВыборкаИзменений =ПланыОбмена.ВыбратьИзменения(ЗаписьСообщения.Получатель,
ЗаписьСообщения.НомерСообщения);
Пока ВыборкаИзменений.Следующий() Цикл
// Записать данные в сообщение
// *** XML-сериализация
ЗаписатьXML(ЗаписьXML, ВыборкаИзменений.Получить());
КонецЦикла;
ЗаписьСообщения.ЗакончитьЗапись();
ЗаписьXML.Закрыть();
Сообщить("-------- Конец выгрузки------------");
КонецПроцедуры

На этом создание процедуры записи данных обмена закончено.

Создание процедуры чтения данных

Код 1C v 8.х

 Процедура ПрочитатьСообщениеСИзменениями() Экспорт 
Каталог = КаталогВременныхФайлов();
// Сформировать имя файла
ИмяФайла = Каталог +?(Прав(Каталог, 1) = "\", "", "\") + "Message"
+ СокрЛП(Ссылка.Код) + "_" +
СокрЛП(ПланыОбмена.Филиалы.ЭтотУзел().Код) + ".xml";
Файл = Новый Файл(ИмяФайла);
Если Не Файл.Существует() Тогда
Возврат;
КонецЕсли;
// *** Чтение документов XML
// Попытаться открыть файл
ЧтениеXML = Новый ЧтениеXML;
Попытка
ЧтениеXML.ОткрытьФайл(ИмяФайла);
Исключение
Сообщить("Невозможно открыть файл обмена данными.");
Возврат;
КонецПопытки;
Сообщить("-------- Загрузка из " + Строка(ЭтотОбъект) + "------------");
Сообщить(" - Считывается файл " + ИмяФайла);
// Загрузить из найденного файла
// *** Инфраструктура сообщений
ЧтениеСообщения = ПланыОбмена.СоздатьЧтениеСообщения();
// Читать заголовок сообщения обмена данными - файла XML
ЧтениеСообщения.НачатьЧтение(ЧтениеXML);
// Сообщение предназначено не для этого узла
Если ЧтениеСообщения.Отправитель <> Ссылка Тогда
ВызватьИсключение "Неверный узел";
КонецЕсли;
// Удаляем регистрацию изменений
// для узла отправителя сообщения
// *** Служба регистрации изменений
ПланыОбмена.УдалитьРегистрациюИзменений(ЧтениеСообщения.Отправитель,ЧтениеСообщения.НомерПринятого);
// Читаем данные из сообщения
// *** XML-сериализация
Пока ВозможностьЧтенияXML(ЧтениеXML) Цикл
// Читаем очередное значение
Данные = ПрочитатьXML(ЧтениеXML);
// Записать полученные данные
Данные.ОбменДанными.Отправитель = ЧтениеСообщения.Отправитель;
Данные.ОбменДанными.Загрузка = Истина;
Данные.Записать();
КонецЦикла;
ЧтениеСообщения.ЗакончитьЧтение();
ЧтениеXML.Закрыть();
УдалитьФайлы(ИмяФайла);
Сообщить("-------- Конец загрузки------------");
КонецПроцедуры

Настройка обмена в 1С 8.3

image002.png

Конфигураций 1С достаточно много, каждая из которых имеет свою функциональность и назначение. Для внедрения конфигураций 1С на предприятия необходимо определить круг задач, которые необходимо решить, а затем выбрать подходящую конфигурацию, максимально отвечающую поставленным требованиям. В некоторых случаях требуется внедрение несколько программных продуктов. Также нередко использование двух и более конфигураций 1С обуславливается желанием разделить работу отделов. Например, вместо прикладного решения 1С:Комплексная автоматизация, в которой можно вести управленческий, бухгалтерский и налоговый учет организации одновременно, используют 2 конфигурации: в одной ведется управленческий учет, а во второй бухгалтерский. При такой схеме работы менеджеры и бухгалтер работают в отдельной программе и не мешают работе друг друга. Конфигурации 1С содержат несколько встроенных планов обмена, представляющие собой свод правил, согласно которым объекты из одной базы будут загружаться в другую. Есть ситуации, когда типовой обмен не будет работать корректно. Например, если база давно не обновлялась или объекты которые необходимо перегружать из одной базы в другую являются доработанными. В таких случаях можно внести изменения в план обмена. При этом в дальнейшем при обновлениях конфигураций необходимо следить за сохранением работоспособности не типового обмена. Процесс синхронизации данных можно условно разделить на следующие этапы: 1. Включение функциональной возможности. 2. Настройка правил подключения. 3. Настройка правил отправки и получения данных в прикладных решениях. 4. Отправка данных из одного прикладного решения и получение данных в другом прикладном решении с сопоставлением данных. Будем рассматривать настройку типового обмена между конфигурациями 1С:Управление торговлей, редакция 11 (УТ) и 1С:Бухгалтерия предприятия, редакция 3.0 (БП). 1 шаг. Включение функциональной возможности. В программе «УТ» переходим в раздел «НСИ и администрирование» — «Настройка интеграции» — «Синхронизация данных».

Ставим галочку «Синхронизация данных», указываем префикс информационной базы. При создании нового элемента справочника или документа к номеру автоматически добавится префикс, что позволит определить место создания элемента. image004.png
2 шаг. Настройка правил подключения. Открываем настройки синхронизации данных и добавляем новую синхронизацию данных, выбрав конфигурацию, с которой настраивается обмен. Переходим к настройкам параметров подключения. image006.png
Выбираем один из трех вариантов подключения к другой программе. image008.png
При выборе первого способа далее в форме настройки указываем данные для подключения к базе. image010.png
В случаях когда доступ к базе предоставляется через интернет, то необходимо выбрать второй способ, указав ссылку на базу и данные для входа в нее (логин и пароль пользователя с правами администратора). При выборе синхронизации через каталог необходимо указать его расположение. image014.png
После установки параметров подключения к другой базе указываются имена синхронизации. image016.png
В случае использования синхронизации через каталог, прежде чем перейти к третьему шагу, необходимо в программе-корреспонденте выполнить аналогичные настройки, описанные ранее в первом и втором шаге. 3 шаг. Настройка правил отправки и получения данных в прикладных решениях. image018.png
На этом шаге указываем правила отправки и получения данных. Выбираем режимы отправки нормативно-справочной информации и документов. Также есть возможность настроить синхронизацию только по выбранным организациям и указать с какой даты будут выгружаться данные. image020.png
В случае одностороннего обмена в программе-корреспонденте нужно в правилах отправки данных установить режим «Не отправлять». При двустороннем обмене указываем какие документы и нормативно-справочная информация будет передаваться в другую программу. 4 шаг. Отправка данных из одного прикладного решения и получение данных в другом прикладном решении с сопоставлением данных. image022.png
Запускаем выгрузку данных для сопоставления. image024.png
По окончанию выгрузки нажимаем «Готово» и переходим в другую программу. image026.png
Запускаем сопоставление данных. image028.png
Эта процедура позволит избежать дублирования элементов. image030.pngПри первой синхронизации элементы справочников сопоставляются по определенным полям, например по ИНН и КПП в справочнике «Организации». При последующих обменах сопоставление происходит по внутреннему идентификатору. image032.png
По окончанию сопоставления выполняем начальную выгрузку данных. image034.png
image036.png
По завершению выгрузки возвращаемся в программу «УТ» и нажимаем «Синхронизировать» для загрузки сопоставленных данных из «БП». image038.png
В случае отсутствия ошибок при обмене появится сообщение «Синхронизация завершена». image040.png
Если синхронизация выполняется впервые, то перед запуском этого процесса рекомендуется сделать архивные копии обоих баз. Консультацию для Вас составила специалист нашей Линии консультаций. Закажите тестовую консультацию по Вашей программе у нас по телефону: +7(343) 288-75-45. *Для оказания консультации необходимо сообщить ИНН вашей организации, регистрационный номер вашей программы ( для программ 1С:Предприятие версии ПРОФ необходим активный договор 1С:ИТС ПРОФ)

План обмена

Механизмы обмена данными «1С:Предприятия» позволяют организовывать обмен информацией, хранимой в базе данных, с другими программными системами. К механизмам обмена данными могут быть отнесены:

  • Планы обмена,
  • XML-сериализация,
  • Средства чтения и записи документов XML.

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

Что такое план обмена

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

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

В обмене данными могут участвовать:

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

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

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

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

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

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

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

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

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

Раскроем ветвь «Общие» дерева объектов конфигурации и добавим новый объект конфигурации План обмена с именем Филиалы , представление объекта – Филиал . На закладке «Данные» создадим реквизит плана обмена Главный , имеющий тип Булево .

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

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

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

&НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) Если Объект.Ссылка = ПланыОбмена.Филиалы.ЭтотУзел() Тогда Элементы.Главный.Доступность = Ложь; КонецЕсли; КонецПроцедуры

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

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

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

&НаСервереБезКонтекста Процедура ЗарегистрироватьИзмененияНаСервере(Узел) // Регистрация изменений всех данных для узла ПланыОбмена.ЗарегистрироватьИзменения(Узел); КонецПроцедуры &НаКлиенте Процедура ЗарегистрироватьИзменения(Команда) ЗарегистрироватьИзмененияНаСервере(Элементы.Список.ТекущаяСтрока); КонецПроцедуры

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

&НаСервереБезКонтекста Функция ПредопределенныйУзел(Узел) Возврат Узел = ПланыОбмена.Филиалы.ЭтотУзел(); КонецФункции

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

&НаКлиенте Процедура СписокПриАктивизацииСтроки(Элемент) Если ПредопределенныйУзел(Элемент.ТекущаяСтрока) Тогда Элементы.ФормаЗарегистрироватьИзменения.Доступность = Ложь; Иначе Элементы.ФормаЗарегистрироватьИзменения.Доступность = Истина; КонецЕсли; КонецПроцедуры

Процедуры обмена данными

Для инициализации обмена данными мы используем обработку. Добавим новый объект конфигурации Обработка с именем ОбменДанными . На закладке Формы создадим основную форму обработки. В окне редактора форм на закладке «Команды» создадим команду формы ВыполнитьОбмен .

&НаКлиенте Процедура ВыполнитьОбмен(Команда) ВыполнитьОбменНаСервере(); КонецПроцедуры &НаСервереБезКонтекста Процедура ВыполнитьОбменНаСервере() ВыборкаУзлов = ПланыОбмена.Филиалы.Выбрать(); Пока ВыборкаУзлов.Следующий() Цикл // Произвести обмен со всеми узлами, кроме этого Если ВыборкаУзлов.Ссылка = ПланыОбмена.Филиалы.ЭтотУзел() Тогда Продолжить; КонецЕсли; УзелОбъект = ВыборкаУзлов.Ссылка.ПолучитьОбъект(); // Получить сообщение УзелОбъект.ПрочитатьСообщениеСИзменениями(); // Сформировать сообщение УзелОбъект.ЗаписатьСообщениеСИзменениями(); КонецЦикла; КонецПроцедуры

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

Процедуры записи и чтения данных

Сами процедуры записи и чтения данных обмена мы разместим в модуле объекта План обмена Филиалы .

Процедура ЗаписатьСообщенияСИзменениями() Экспорт // ЭтотОбъект — это объект очередного узла, полученный в цикле // процедуры ВыполнитьОбменНаСервере() модуля формы обработки // ОбменДанными. А Ссылка — это ссылка на ЭтотОбъект. Например, // в ПланеОбмена есть два узла, кроме текущего: ПервыйФилиал // и ВторойФилиал. Мы в данный момент работаем с узлом // ПервыйФилиал. Из этой информационной базы нам надо получить // все зарегистрированные изменения объектов обмена для узла // ПервыйФилиал и записать их в XML-файл. Сообщение = Новый СообщениеПользователю(); Сообщение.Текст = "----- Выгрузка в узел " + Строка(ЭтотОбъект) + " -----"; Сообщение.Сообщить(); // Сформировать имя временного файла Каталог = КаталогВременныхФайлов(); ИмяФайла = Каталог + ?(Прав(Каталог, 1) = "\","", "\") + "Message-" + СокрЛП(ПланыОбмена.Филиалы.ЭтотУзел().Код) + "-" + СокрЛП(Ссылка.Код) + ".xml"; // Создать объект записи XML // *** ЗаписьXML-документов ЗаписьXML = Новый ЗаписьXML(); ЗаписьXML.ОткрытьФайл(ИмяФайла); ЗаписьXML.ЗаписатьОбъявлениеXML(); // *** Инфраструктура сообщений ЗаписьСообщения = ПланыОбмена.СоздатьЗаписьСообщения(); ЗаписьСообщения.НачатьЗапись(ЗаписьXML, Ссылка); Сообщение = Новый СообщениеПользователю(); Сообщение.Текст = " Номер сообщения: " + ЗаписьСообщения.НомерСообщения; Сообщение.Сообщить(); // Получить выборку измененных данных // *** Механизм регистрации изменений ВыборкаИзменений = ПланыОбмена.ВыбратьИзменения( ЗаписьСообщения.Получатель, ЗаписьСообщения.НомерСообщения ); // ВыбратьИзменения(, , ) // // Формирует выборку «измененные данные» для передачи их в тот или // иной узел плана обмена. При этом в процессе выборки изменений, // в записи регистрации изменений проставляется номер сообщения // обмена данными, в котором должны передаваться изменения. Номер // сообщения в записи регистрации проставляется для того, чтобы // при подтверждении приема сообщения, в котором передавались // изменения, соответствующие записи регистрации изменений были // удалены и в дальнейшем изменения больше не передавались. Пока ВыборкаИзменений.Следующий() Цикл // Записать данные в сообщение *** XML-сериализация ЗаписатьXML(ЗаписьXML, ВыборкаИзменений.Получить()); КонецЦикла; ЗаписьСообщения.ЗакончитьЗапись(); ЗаписьXML.Закрыть(); Сообщение = Новый СообщениеПользователю(); Сообщение.Текст = "----- Конец выгрузки -----"; Сообщение.Сообщить() КонецПроцедуры
Процедура ПрочитатьСообщениеСИзменениями() Экспорт Каталог = КаталогВременныхФайлов(); // Сформировать имя файла ИмяФайла = Каталог + ?(Прав(Каталог, 1) = "\", "", "\") + "Message-" + СокрЛП(Ссылка.Код) + "-" + СокрЛП(ПланыОбмена.Филиалы.ЭтотУзел().Код) + ".xml"; Файл = Новый Файл(ИмяФайла); Если Не Файл.Существует() Тогда Возврат; КонецЕсли; // *** Чтение документов XML // Попытаться открыть файл ЧтениеXML = Новый ЧтениеXML(); Попытка ЧтениеXML.ОткрытьФайл(ИмяФайла); Исключение Сообщение = Новый СообщениеПользователю(); Сообщение.Текст = "Невозможно открыть файл обмена данными."; Сообщение.Сообщить(); Возврат; КонецПопытки; Сообщение = Новый СообщениеПользователю(); Сообщение.Текст = "----- Загрузка из " + Строка(ЭтотОбъект) + " -----"; Сообщение.Сообщить(); Сообщение = Новый СообщениеПользователю(); Сообщение.Текст = " – Считывается файл " + ИмяФайла; Сообщение.Сообщить(); // Загрузить из найденного файла // *** Инфраструктура сообщений ЧтениеСообщения = ПланыОбмена.СоздатьЧтениеСообщения(); // Читать заголовок сообщения обмена данными – файла XML ЧтениеСообщения.НачатьЧтение(ЧтениеXML); // Сообщение предназначено не для этого узла Если ЧтениеСообщения.Отправитель > Ссылка Тогда ВызватьИсключение "Неверный узел"; КонецЕсли; // Допустим, ПланОбмена Филиалы включает три узла: // 1. ЦентральныйОфис, код 001 // 2. ПервыйФилиал, код 002 // 3. ВторойФилиал, код 003 // Имена XML-файлов обмена будут такими // 1. Message-001-002.xml, ЦентральныйОфис->ПервыйФилиал // 2. Message-001-003.xml, ЦентральныйОфис->ВторойФилиал // 3. Message-002-001.xml, ПервыйФилиал->ЦентральныйОфис // 4. Message-002-003.xml, ПервыйФилиал->ВторойФилиал // 5. Message-003-001.xml, ВторойФилиал->ЦентральныйОфис // 6. Message-003-002.xml, ВторойФилиал->ПервыйФилиал // И пусть мы сейчас работаем в информационной базе // ЦентральногоОфиса. А в каталоге врменнных файлов у // нас шесть файлов. Мы должны прочитать только файлы // Message-002-001.xml и Message-003-001.xml, каждый на // очередной итерации цикла в процедуре модуля формы // обработки ОбменДанными. И сейчас читаем Message-002-001.xml, // отправитель ПервыйФилиал. Если // ЧтениеСообщения.Отправитель <> СсылкаНаПервыйФилиал // мы должны такое сообщение игнорировать. Потому как // непонятно, почему в имени файла правильный отправитель, // а в самом XML Отправитель неправильный. // Удаляем регистрацию изменений для узла отправителя сообщения. // *** Служба регистрации изменений ПланыОбмена.УдалитьРегистрациюИзменений( ЧтениеСообщения.Отправитель, ЧтениеСообщения.НомерПринятого ); // Читаем данные из сообщения *** XML-сериализация Пока ВозможностьЧтенияXML(ЧтениеXML) Цикл // Читаем очередное значение Данные = ПрочитатьXML(ЧтениеXML); // Не переносим изменение, полученное в главный из неглавного, // если есть регистрация изменения // // Мы сейчас работает с конкретной информационной базой, в этой // базе зарегистрированы какие-то изменения каких-то объектов // обмена для каких-то узлов. Здесь мы проверяем, зарегистрированы // ли изменения для узла-отправителя объектов обмена, которые // получены при чтении очередной порции данных. Если это так, и // и отправитель не главный узел, мы отвергаем эти изменения. // Это логично — чем изменения одного не главного узла лучше // изменений другого не главного узла (т.е. изменения в нашей // базе)? И тем более отвергаем изменения, если наш узел — главный. Если ПланыОбмена.ИзменениеЗарегистрировано( ЧтениеСообщения.Отправитель, Данные ) И Не ЧтениеСообщения.Отправитель.Главный Тогда Сообщение = Новый СообщениеПользователю(); Сообщение.Текст = " – Изменения отклонены"; Сообщение.Сообщить(); Продолжить; КонецЕсли; // Записать полученные данные Данные.ОбменДанными.Отправитель = ЧтениеСообщения.Отправитель; Данные.ОбменДанными.Загрузка = Истина; Данные.Записать(); КонецЦикла; ЧтениеСообщения.ЗакончитьЧтение(); ЧтениеXML.Закрыть(); УдалитьФайлы(ИмяФайла); Сообщение = Новый СообщениеПользователю(); Сообщение.Текст = "----- Конец загрузки -----"; Сообщение.Сообщить(); КонецПроцедуры

Каталог оборудования

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *