<<

стр. 7
(всего 11)

СОДЕРЖАНИЕ

>>




380
381
Использование основных объектов конфигурации Интерфейс, роль, список пользователей


Если теперь установить фильтр объектов по подсистем В заключение нам с вами осталось создать две роли: «Бухгалтер» и
«УчетМатериаловИУслуг», то можно, при необходимости, внести «Расчетчик». Мы разделим права по расчету зарплаты и по ведению
уточнения в установленные права: бухгалтерского учета. Дело в том, что в OOO «На все руки мастер»
есть бухгалтер и помощник бухгалтера. Помощник бухгалтера занят, в
основном, расчетом зарплаты, но иногда это делает и главный
Установим фильтр по подсистеме...
бухгалтер. Поэтому ему необходимо будет назначить обе роли, в то
время как помощнику - только роль «Расчетчик».
Создадим новый объект конфигурации Роль с именем «Расчетчик».
В окне редактирования прав снимем все права и затем установим их по
подсистеме «РасчетЗарплаты» (и не забудем запретить интерактивное
удаление).
В заключение создадим объект конфигурации Роль с именем
«Бухгалтер». В окне редактирования прав снимем все права и затем
установим их по подсистеме «Бухгалтерия». После этого отфильтруем
список объектов по этой подсистеме и для справочника
«Номенклатура» запретим добавление, изменение и удаление. Также
запретим интерактивное удаление для всех объектов.
Список прав для каждой роли можно получить, выполнив в окне
редактирования прав команду Действия | Вывести список.
Теперь мы можем перейти к созданию интерфейсов.




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




382
383
Использование основных объектов конфигурации Интерфейс, роль, список пользователей


Создадим новый объект конфигурации Интерфейс, и на экране
Объект конфигурации Интерфейс появится конструктор главного меню:



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

Создание интерфейсов Он содержит два списка: список подменю и список команд


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



384 385
Интерфейс, роль, список пользователей
Использование основных объектов конфигурации

В данном случае нас все устраивает, за исключением пункта
Вместе с палитрой свойств на экране открылось окно редактст-
«Прочие», в котором для команды «Основной» мы дадим более
интерфейса - остановимся на нем подробнее: понягный текст - «План счетов Основной»:


Изменим текст пункта подменю




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



А при создании меню интерфейса «Администратор» мы не будем
выбирать никаких подсистем, а сразу построим меню. Обратите
внимание, что в этом случае система включила в меню пункты
стандартных действий: «Файл», «Операции», «Сервис», «Окна» и



387
386
Использование основных объектов конфигурации
Интерфейс, роль, список пользоват<

«Справка». Скорее всего, они понадобятся будущему администратору
Администрирование работы пользователей
информационной базы.


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




Имя пользователя - это идентификатор, который будет появляться в
окне выбора пользователей при запуске системы в режиме
1С:Предприятие.



388
389
Использование основных объектов конфигурации Интерфейс, роль, список пользователей

Полное имя - строка, которая может быть использована внутри Отметим роль «Администратор», основным интерфейсом укажем
«Администратор» и язык конфигурации выберем «Русский».
конфигурации при выводе различной справочной информации
Хорошим стилем администрирования считается указание в качестве После этого создадим остальных пользователей системы. Для всех
полного имени - фамилии, имени и отчества пользователя (без них мы будем использовать аутентификацию Windows и русский язык:
сокращений).
Следующие две области окна посвящены способам
аутентификации пользователя.
Аутентификация средствами 1С:Предприятия подразумевает,
что после запуска системы пользователю будет предложено выбрать
имя одного из пользователей системы и ввести пароль. Если
введенный пароль соответствует тому, который сохранен в системе
для этого идентификатора пользователя, система открывается с
правами и интерфейсом, которые указаны для этого пользователя.
Аутентификация Windows подразумевает, что при запуске системы
Обратите внимание, что главному бухгалтеру Назаровой
1С:Предприятие от пользователя не требуется никакой
поставлены в соответствие две роли: «Расчетчик» и «Бухгалтер»,
дополнительной информации. Система 1С:Предприятие определяет
поскольку она должна иметь возможность не только вести
под каким пользователем запущена операционная система Windows
бухгалтерский учет, но и рассчитывать зарплату.
(имеет смысл использовать для NT-подобных операционных систем:
Список пользователей, зарегистрированных в системе, можно
NT, 2000, XP), и затем обращается к своему списку пользователей.
получить, выполнив команду Действия | Вывести список.
Если она находит в нем пользователя, которому поставлен в
соответствие текущий пользователь Windows, система открывается с Теперь вы можете зайти в нашу информационную базу под
правами и интерфейсом, которые указаны для этого пользователя. различными пользователями и посмотреть, чем отличаются внешний
Зададим имя пользователя «Администратор», полное имя тоже вид интерфейса и возможности различных пользователей.
«Администратор». Перейдем на закладку «Прочие».




390 391
Использование основных объектов конфигурации


Глава 13. Обмен данными
Что нового мы узнали
В этой главе мы познакомимся с механизмами обмена данными,
которые содержит система 1С:Предприятие и добавим в нашу
конфигурацию возможность обмена данными с удаленными
филиалами и отделениями.
- для чего предназначен объект конфигурации Роль - как
создать роль, используя подсистемы конфигурации - для
чего предназначен объект конфигурации Интерфейс - как
создать интерфейс, используя подсистемы
конфигурации - как создать список пользователей
системы и определить
их права
- чем аутентификация средствами 1С:Предприятия
отличается от аутентификации Windows




393
392
Использование основных объектов конфигурации Обмен данными


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


С
XML-сериализация позволяет преобразовать объект
редства обмена данными, которые содержит система
1С:Предприятия в последовательность данных, представленных в
1С:Предприятие 8.0 позволяют организовывать обмен
формате XML. Кроме этого, XML-сериализация выполняет и обратное
информацией, хранимой в базе данных, с другими
преобразование - преобразует последовательность данных формата
программными системами. В качестве таких систем могут
XML в объект 1С:Предприятия, при условии, что имеется
выступать как другие информационные базы 1С:Предприятия 8.0
соответствующий тип 1С:Предприятия.
(имеющие аналогичную или отличающуюся конфигурацию), так и
программные системы, не основанные на 1С:Предприятии 8.0. Запись и чтение документов XML обеспечивают запись/чтение
Такая гибкость обмена данными достигается тем, что средства документов формата XML из встроенного языка.
обмена данными 1С:Предприятия 8.0 могут использоваться в При реализации алгоритма обмена данными перечисленные
различных комбинациях, и кроме этого, формат обмена данными механизмы могут быть использованы как все вместе, так и в различной
основан на языке XML, являющимся на сегодняшний день комбинации. В каждом конкретном случае разработчик решает эту
общепринятым средством представления данных. задачу самостоятельно.
К механизмам обмена данными могут быть отнесены: В примере, приведенном в этой книге, мы используем все три
механизма обмена данными, поэтому прежде чем перейти
• Планы обмена,
непосредственно к написанию кода, познакомимся с каждым из них
• XML-сериализация, более подробно.
• Средства чтения и записи документов XML.
Объект конфигурации ПланОбмена
В общем случае схема взаимодействия этих трех составляющих


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



394 395
Использование основных объектов конфигурации Обмен данными

потребоваться в случае, если с разными узлами ведется обмен разным в конечном итоге, к записи или удалению объекта обмена. Механизм
составом данных, или когда схема организации обмена с одними регистрации изменений анализирует события записи и удаления
узлами отличается от схемы организации обмена с другими узлами. объектов обмена и на основании параметров обмена данными,
В состав данных, которыми может производиться обмен, входят содержащихся в каждом из объектов обмена, формирует записи
элементы информационных структур базы данных, которые регистрации изменений. Следует отметить, что свойство
описываются следующими объектами встроенного языка: «ОбменДанными» не хранится в базе данных, а используется только во
время записи объекта обмена.
• Константа.МенеджерЗначения<имя>, Так вот, признак «Авторегистрация», устанавливаемый при
• СправочникОбъект.<имя>, указании состава данных плана обмена, позволяет указать, что
• ДокументОбъект.<имя>, параметры обмена данными будут формироваться каждый раз самим
• ПоследовательностьНаборЗаписей<имя>, механизмом регистрации изменений на основании информации,
• ПланВидовХарактеристикОбъект<имя>, содержащейся в плане обмена. После автоматического заполнения
• ПланСчетовОбъект.<имя>, параметров обмена, разработчик все же имеет возможность внести
• ПланВидовРасчетаОбъект<имя>, изменения в сформированные таким образом параметры. Для этого
следует использовать обработчики событий объектов, участвующих в
• РегистрСведенийНаборЗаписей.<имя>,
обмене - «ПередЗаписью» и «ПередУдалением», в которых можно
• РегистрНакопленияНаборЗаписей<имя>,
модифицировать список узлов-получателей (т.е. тех узлов, для
• РегистрБухгалтерииНаборЗаписей.<имя>,
которых регистрируются изменения). Кроме этого, существует
• РегистрРасчетаНаборЗаписей.<имя>,
возможность отключить авторегистрацию изменений, и тогда
• ПерерасчетНаборЗаписей.<имя>,
параметры обмена данными нужно будет формировать полностью
• БизнесПроцессОбъект.<имя>,
средствами встроенного языка. Гипотетически делать это можно в
• ЗадачаОбъект.<имя>,
любом фрагменте кода, но для того, чтобы конфигурация была легко
• УдалениеОбъекта.
читаема, рекомендуется использовать для этих целей все те же
Для упрощения изложения, в дальнейшем будем называть эти обработчики событий «ПередЗаписью» и «ПередУдалением». В этом
случае код формирования параметров обмена данными будет
элементы информационных структур объектами обмена.
сосредоточен в логически понятных точках, а не разбросан по всей
Разработчик имеет возможность определить состав каждого плана
конфигурации.
обмена, указав, объекты конфигурации, данные которых должны
участвовать в обмене по данному плану. Итак, как мы теперь знаем, при записи и удалении объектов обмена
план обмена формирует записи регистрации изменений. Записи
При описании состава данных плана обмена разработчик имеет
регистрации изменений хранятся в таблицах регистрации изменений,
возможность указать для каждого типа объектов признак
причем для каждого объекта обмена ведется своя отдельная таблица
«Авторегистрация». Этот признак определяет, каким образом план
регистрации изменений. При изменении объекта обмена в таблице
обмена будет отслеживать изменения этих данных.
регистрации изменений создается столько записей, сколько узлов-
Возможность отслеживать изменения данных реализована в плане
получателей указано в параметрах обмена данными у объекта обмена.
обмена за счет использования механизма регистрации изменений.
Каждая запись при этом будет хранить ссылку на свой узел-
Работа этого механизма базируется на том, что каждый из объектов
получатель. Таблицы регистрации изменений создаются лишь в том
обмена имеет свойство «ОбменДанными», с помощью которого можно
случае, если соответствующий объект метаданных указан в составе
указать, для каких узлов необходимо производить регистрацию
хотя бы одного плана обмена.
изменений этого объекта. Любые изменения объекта обмена сводятся,



396 397
Обмен данными
Использование основных объектов конфигурации

частей, содержащих в свою очередь некоторое количество реквизитов
Кроме ссылки на узел обмена, для которого регистрируюТс
различного типа. В результате XML-сериализации вся эта
изменения, каждая запись таблицы регистрации изменений храцИт
совокупность данных представляется в виде последовательности
также номер сообщения, в котором изменение было передано в первый
соответствующих данных формата XML. B результате обратного
раз в этот узел. До тех пор, пока сообщение не будет передано в
преобразования производится «сборка» объекта, при условии, что
первый раз, это поле хранит Null.
существует подходящий тип данных 1С:Предприятия.
Сообщение, с точки зрения плана обмена, это единица обмена
Запись/чтение документов XML
информацией. Поэтому одной из важнейших составляющих плана



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

XML-сериализация


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


399
398
Использование основных объектов конфигурации Обмен данными


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


И
Константа.
так, наше OOO «На все руки мастер» открыло свой филиал в
городе Урюпинск и установило в нем такую ясе
Создание константы ПрефиксНомеров
конфигурацию для учета работы филиала. В результате


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



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


400 401
Использование основных объектов конфигурации Обмен данными

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


Т
«ПрефиксНумерации».
еперь займемся созданием «центра» любого алгоритма обмена
Теперь доработаем справочник «Клиенты». В модуль объекта
данными, вокруг которого группируются прочие механизмы -плана
добавим следующий обработчик события
обмена. Откроем конфигуратор и создадим новый объект
«ПриУстановкеНовогоКода»:
конфигурации ПланОбмена с именем «Филиалы». На закладке
«Данные» создадим реквизит плана обмена «Главный», имеющий тип
Процедура ПриУстановкеНовогоКодаССтандартнаяОбработка, Префикс)
Булево.
Префикс = ПолучитьПрефиксНомера();
Этот реквизит понадобится нам для того, чтобы разрешать
КонецПроцедуры _______________________________________________
коллизии при обмене данными. Под коллизией понимается ситуация,
Событие «При установке нового кода» возникает в момент, когда когда один и тот же объект обмена данными был изменен
выполняется установка нового кода элемента справочника. Вторым одновременно в двух узлах. В этом случае мы будем анализировать
параметром вызова обработчика передается префикс, который будет значение реквизита «Главный» и принимать изменения только в том
использоваться системой для генерации кода. В обработчике события случае, если они сделаны в главном узле. В случае коллизии,
мы устанавливаем его равным значению константы изменения, произведенные не в главном узле, мы будем отвергать.
«ПрефиксНумерации». Теперь перейдем на закладку «Прочее» и определим состав
объектов обмена данными (кнопка «Состав»).
Такие же обработчики нужно будет добавить во все справочники и
планы видов характеристик, участвующие в обмене. После этого у Установим отбор по подсистеме «УчетУслугИМатериалов» и
включим в обмен все объекты, относящиеся к этой подсистеме.
всех справочников и планов видов характеристик, участвующих в
Проверьте, что константа «ПрефиксНумерации» не участвует в
обмене, нужно будет изменить тип кода на Строка и увеличить длину
обмене, поскольку ее значение должно быть уникальным для каждой
кода до 7 символов.
базы, участвующей в обмене.
Теперь займемся доработкой документов. В модуль документа
«ПриходнаяНакладная» добавим обработчик события
«ПриУстановкеНовогоНомера»:
ПроцедураПриУстановкеНовогоНомераССтандартнаяОбработка,
Префикс)
Префикс = ПолучитьПрефиксНомера();
КонецПроцедуры___________________________________




402 403
Использование основных объектов конфигурации Обмен данными

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

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


Событие формы «ПриЗаписи» возникает после записи объекта
ПланОбменаОбъект.Филиалы, но до окончания транзакции.
Именно в этот момент мы обращаемся к механизму регистрации
изменений, вызывая метод менеджера планов обмена -
ЗарегистрироватьИзменения(). В данном случае будут созданы
записи регистрации изменений, предназначенные для пересылки в
созданный нами узел, для всех объектов обмена, указанных в составе
данного плана обмена.
В заключение, создадим обработчик события формы
Теперь создадим с помощью конструктора основную форму узла,
«ПередОткрытием» для того, чтобы запретить установку реквизита
для того, чтобы описать в ней некоторые действия, которые должны
«Главный» для предопределенного узла, соответствующего данной
выполняться при создании нового узла обмена.
информационной базе:
Суть этих действий будет заключаться в том, что при создании
нового узла обмена мы должны будем сформировать для него все
!роцедура ПередОткрытием(Отказ, СтандартнаяОбработка)
необходимые записи регистрации изменений для всех объектов
Если Ссылка = ПланыОбмена.Филиалы.ЭтотУзел() Тогда
конфигурации, входящих в данный план обмена. Это будет, своего ЭлементыФормы.Главный.Достуггаость = Ложь;
рода, начальная синхронизация узла обмена всеми данными обмена. КонецЕсли;
КонецПроцедуры
Прежде всего, опишем в модуле формы узла служебную
переменную, которая будет хранить признак того, является ли
В этой процедуре мы используем метод менеджера плана обмена
записываемый узел новым, или нет:
ЭтотУзел(), который возвращает ссылку на узел плана обмена,
соответствующий данной информационной базе.
Перем РегистрацияВНовыйУзел; На этом создание плана обмена завершено, и мы можем перейти
непосредственно к созданию процедур обмена данными.
Затем создадим обработчик события формы «ПередЗаписью»:

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




405
404
Обмен данными
Использование основных объектов конфигурации


«ПрочитатьСообщенияСИзменениями» мы создадим позднее), а затем
Создание процедур обмена данными формируем для них сообщения, предназначенные для передачи и

Д ля инициализации обмена данными мы используем объек содержащие измененные данные для этого узла (процедура
конфигурации Обработка. Этот объект раньше не встреча7С нам, «ЗаписатьСообщениеСИзменениями» также будет создана нами
поэтому следует сказать о нем несколько слов. С точки зрения позднее).
структуры и организации работы обработка ничем не отличается от
Теперь создадим основную форму обработки и в обработчик
отчета. Разница состоит лишь в том, что обработка обычно
события нажатия кнопки «Выполнить» - «КнопкаВыполнитьНажатие»
используется для того, чтобы выполнить какие-либо действия над вставим вызов процедуры ОбменСФилиалами():
информационной базой, а отчет - чтобы получить некоторое
визуальное представление данных.
ПроцедураКнопкаВыполнитьНажатие(Элемент)
Создание обработки ОбменДанными ОбменСФилиалами();




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



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

КонецЕсли; Для упрощения примера, мы будем обмениваться сообщениями
КонецДикла;
через каталог временных файлов. Имена сообщений стандартизованы
КонепПроцедуры
и имеют вид «Ме8$а§еКодУзлаОтправителя_КодУзлаПолучателя.хт1».
После этого обратимся к механизмам записи/чтения XML
Алгоритм работы этой процедуры заключается в следующем: i
документов и создадим новый объект ЗаписьХМЦ с помощью
цикле мы перебираем узлы, которые содержатся в плане обмена
которого откроем новый XML файл для записи, запишем в него
«Филиалы», и для всех узлов, кроме себя самого, производим сначала
чтение сообщений, поступивших из других узлов обмена (процеДУРУ


407
406
Использование основных объектов конфигурации Обмен данными

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

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



408 409
Обмен данными
Использование основных объектов конфигурации


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

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

//*** Чтение документов XML //
Попытаться открыть файл
На этом создание процедуры записи данных обмена закончено. ЧтениеXML = Новый ЧтениеXML;
Попытка
Создание процедуры чтения данных ЧтениеXML.ОткрытьФайл(ИмяФайла);



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

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

//*** Чтение документов XML // //*** Чтение документов XML //
Попытаться открыть файл Попытаться открыть файл
ЧтениеXML = Новый ЧтениеXML; ЧтениеXML = Новый ЧтениеXML;
Попытка Попытка
ЧтениеXML.ОткрытьФайл(ИмяФайла); ЧтениеXML.ОткрытьФайл(ИмяФайла);
Исключение Исключение
Сообщит("'Невозможно открыть файл обмена данными."); Сообщить("Невозможно открыть файл обмена данными.");
Возврат; Возврат;
КонецПопытки; КонецПопытки;
Сообщить("......... - Загрузка из " + Строка(ЭтотОбъект) + " ------------ "); Сообщить("---------Загрузка из " + Строка(ЭтотОбъект) + " ...............-");
Сообщить(" - Считывается файл " + ИмяФайла);




413
412
Использование основных объектов конфигурации Обмен данными


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

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



414 415
Использование основных объектов конфигурации Обмен данными


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

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



416 417
Обмен данными
Использование основных объектов конфигурации


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



419
418
Использование основных объектов конфигурации
Обмен данными

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


420
421
Обмен данными
Использование основных объектов конфигурации

Затем создадим новый узел, который будет соответствовать базе
Проверка работы обмена данными

П
филиала, присвоим ему код «Фил» и наименование «Филиал»:
режде всего создадим новый каталог, в котором будет
размещаться база нашего филиала и сохраним в этот каталог
нашу конфигурацию
(Конфигурация | Сохранить конфигурацию в файл...).
Запустим 1С:Предприятие в режиме отладки и установим
необходимые значения в нашей центральной базе. Прежде всего
зададим значение константы «ПрефиксНомеров» - «ЦБ»:




Теперь вызовем обработку «ОбменДанными» и нажмем
«Выполнить». В окне сообщений появится следующий текст:

После этого откроем план обмена «Филиалы» и зададим параметры
узла по умолчанию - т.е. параметры нашей базы. Код базы будет
«ЦБ», а наименование - «Центральная база».
Не забудьте, что именно код идентифицирует узлы обмена в
различных базах, поэтому в базе филиала мы будем создавать узлы с
Таким образом, в результате обмена данными центральная база
такими же кодами. сформировала файл обмена, содержащий изменения всех данных,
которыми она обменивается с филиалом.
Настало время перейти к базе филиала. Запустим систему в режиме
Конфигуратора и добавим в список баз новую базу с пустой
конфигурацией, которая будет расположена в созданном нами
каталоге базы филиала. В конфигураторе откроем конфигурацию и
загрузим конфигурацию из файла
(Конфигурация | Загрузить конфигурацию из файла...). Запустим
1С:Предприятие в режиме отладки.




423
d?.7
Обмен данными
Использование основных объектов конфигурации


Теперь, для большей наглядности откроем список справочника
Первым делом зададим значение константы «ПрефиксНомеров»
«Клиенты». Сейчас в этом справочнике нет ни одного элемента.
«ФЛ»:
Запустим обработку «ОбменДанными» и нажмем «Выполнить».
Справочник будет заполнен элементами, а в окне сообщений
появится текст:




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




После этого создадим новый узел плана обмена с кодом «ЦБ»,
наименованием «Центральная база» и признаком «Главный»:




425
424
Обмен данными
Использование основных объектов конфигурации


Основные сведения о распределенных
Механизм распределенных информационных базах


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


М
база должна иметь четко определенную древовидную
еханизм распределенных информационных баз является
структуру. Количество уровней в такой структуре не
развитием универсального обмена данными. Он реализует
ограничено, главное - между двумя связанными узлами всегда
привычную, по версии 7.7, модель распределенной
должно быть определено отношение «главный - подчиненный»:
информационной базы, которая подразумевает наличие
идентичных конфигураций во всех узлах, имеет древовидную
структуру и позволяет выполнять обмен как измененными данными
так и изменениями, внесенными в конфигурацию.
Механизм распределенных информационных баз реализуется
планами обмена. Для этого объект конфигурации План обмена
содержит свойство «Распределенная информационная база». Если это
свойство установлено, для данного плана обмена включается механизм
распределенных информационных баз и разработчик получает
возможность создать распределенную базу исключительно
интерактивными средствами, без написания кода. Такая возможность
не исключает программное управление обменом, которое также
доступно при работе с распределенными информационными базами и
в ходе создания примера мы рассмотрим оба варианта организации
обмена в распределенных информационных базах.
Таким образом, любой узел этой структуры может иметь
произвольное количество подчиненных узлов (в том числе и ни
одного). Кроме этого все узлы, кроме одного, должны иметь по
одному главному узлу, и один узел не будет иметь главного узла - это
корневой узел.
Такое жесткое задание структуры узлов необходимо для
определения порядка миграции изменений данных и изменений
конфигурации.
Конфигурация может быть изменена только в узле, не имеющем
главного узла (то есть в корневом узле). Изменения данных могут
выполняться в любом узле.
Изменения конфигурации будут передаваться от главного к
подчиненным узлам. Изменения данных могут передаваться между
любыми связанными узлами.




427
426
Использование основных объектов конфигурации Обмен данными

Разрешение коллизий также будет производиться исходя Из
Пример интерактивного обмена в распределенной
отношения «главный-подчиненный». Если изменения выполнены
информационной базе
одновременно и в главном, и в подчиненном узле, при обмене


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

Постановка задачи


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




428 429
Обмен данными
Использование основных объектов конфигурации

На следующем шаге укажем каталог информационной базы и
Откроем план обмена «Отделения» и зададим параметпк нажмем «Готово». Система создаст в указанном каталоге начальный
центрального узла (предопределенный элемент плана обмена): код образ информационной базы нашего отделения.
«ЦБ» и наименование «Центральная база». После этого создадим Запустим 1С:Предприятие, подключим новую базу нашего
новый узел с кодом «Отд» и наименованием «Отделение». Обратите отделения и откроем ее в конфигураторе. Обратите внимание на то,
внимание, что для созданного нами узла стали доступны три иконки в что конфигурация нашего отделения стала защищена от изменений
командной панели формы плана обмена: «Создать начальный образ» средствами управления распределенной информационной базой:
«Записать изменения» и «Прочитать изменения»:

Конфигурация подчиненного узла защищена от изменений
средствами управления распределенной информационной
базой...




Стали доступны команды работы с распределенной
информационной базой...



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




431
430
Использование основных объектов конфигурации
Обмен данными

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




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



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



432
433
т
Использование основных объектов конфигурации Обмен данными

Для этого в конфигураторе центральной базы создадим новь,й Начнем с создания обработчика нажатия кнопки «Создать
начальный образ». Текст обработчика будет выглядеть следующим
объект конфигурации Обработка с именем «ОбменСОтделениями».
образом:
Создадим основную форму обработки и расположим на неи поле ввода
с именем «ПолеВводаОтделение», подписью «Отделение:» и типом
ПланОбменаСсылка.Отделения: ПроиедураКнопкаСоздатьНачальныйОбразНажатие(Элемент)
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.ВыборКаталога);
Диалог.Заголовок = "Укажите каталог информационной базы:"; Если Диалог.Выбрать()
Тогда ПланыОбмена.СоздатьНачальныйОбраз(ПолеВводаОтделение,
"Filе="+Диалог.Каталог);
Предупреждение("Создание начального образа узла завершено.");
КонецЕсли; КонецПроцедуры


В начале процедуры мы вызываем диалог выбора каталога, в
который будет помещен образ информационной базы, и затем
выполняем метод СоздатьНачальныйОбраз() объекта
ПланыОбменаМенеджер. Именно этот метод и позволяет нам
создать образ подчиненного узла распределенной информационной
базы. В первом параметре метода передается ссылка на узел, для
которого мы хотим создать начальный образ, а во втором - строка
соединения, указывающая информационную базу.
Теперь создадим обработчик нажатия кнопки «Записать
изменения»:
После этого расположим в форме три кнопки: «Создать начальный
образ» с именем «КнопкаСоздатьНачальныйОбраз», «Записать ПроцедураКиопкаЗаписатьИзмененияНажатие(Элемент)
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
изменения» с именем «КнопкаЗаписатьИзменения» и «Прочитать Диалог.Заголовок = "Укажите файл обмена:"; Если Диалог.Выбрать() Тогда
изменения» с именем «КнопкаПрочитатьИзменения»:
// Создать и проинициализаровать объект ЗаписьХМL
ЗаписьХМL = Новый ЗаписьХМL;
ЗаписьХМL.ОткрыгьФайл(Диалог.ПолноеИмяФайла);
// Создать объект ЗаписьСообщенияОбмена и начать запись сообщения
ЗаписьСообщения = ПланыОбмена.СоздатьЗаписьСообщения();
ЗаписьСообщетм.НачатьЗапись(ЗагшсьХМL, ПолеВводаОтделение);
// Записать содержимое тела сообщения
//обмена данными распределенной ИБ
ПланыОбмена.ЗаписатьИзменения(ЗаписьСообщения);

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




435
434
Обмен данными
Использование основных объектов конфигурации

<<

стр. 7
(всего 11)

СОДЕРЖАНИЕ

>>