Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

1C-DevGuide83

.pdf
Скачиваний:
362
Добавлен:
14.05.2015
Размер:
46.69 Mб
Скачать

Занятие 24 711

Вследствие обратного преобразования производится «сборка» объекта при условии, что существует подходящий тип данных «1С:Предприятия».

Запись/чтение документов XML

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

В частности, они позволяют открывать файлы XML для чтения, читать данные из файлов, создавать новые файлы XML и записывать в них данные.

Универсальный механизм обмена данными

Итак, наше ООО «На все руки мастер» открыло свой филиал в  городе  N и установило в нем такую же конфигурацию для учета работы филиала.

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

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

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

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

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

Теперь, когда создание новых элементов справочников и новых документов будет происходить в двух базах одновременно и независимо друг от друга, нам снова необходимо обеспечить уникальность

712 1С:Предприятие 8.3. Практическое пособие разработчика

номеров кодов элементов справочников и номеров документов теперь уже «в пространстве» двух баз.

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

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

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

Для хранения префикса номеров мы используем объект конфигу-

рации Константа.

Константа для обмена данных

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

ВНИМАНИЕ!

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

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

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

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

Откроем конфигуратор и добавим новый объект конфигурации

Константа с именем ПрефиксНумерации.

Определим тип значения константы – Строка с фиксированной длиной 2 символа.

Занятие 24 713

Доработка объектов конфигурации, участвующих в обмене

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

Первое, что нам следует сделать, – внести изменения в модули всех объектов, участвующих в обмене (в нашем случае это будут документы, справочники и планы видов характеристик).

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

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

Добавим общий модуль Обмен.

В модуль поместим следующую функцию (листинг 24.1).

Листинг 24.1. Функция формирования префикса номера

Функция ПолучитьПрефиксНомера() Экспорт Возврат Константы.ПрефиксНумерации.Получить();

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

Как вы видите, эта функция просто возвращает значение константы

ПрефиксНумерации.

Теперь доработаем справочник Клиенты.

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

Добавим в него обработчик события ПриУстановкеНовогоКода

(листинг 24.2).

Листинг 24.2. Обработчик события «ПриУстановкеНовогоКода»

Процедура ПриУстановкеНовогоКода(СтандартнаяОбработка, Префикс) Префикс = Обмен.ПолучитьПрефиксНомера();

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

Событие ПриУстановкеНовогоКода возникает в момент, когда выполняется установка нового кода элемента справочника. Обратите внимание, что мы пишем этот код не в модуле формы, а в модуле

714 1С:Предприятие 8.3. Практическое пособие разработчика

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

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

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

ПрефиксНумерации.

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

В нашем случае это:справочники:

□□Сотрудники,

□□Склады,

□□Номенклатура,

□□ВариантыНоменклатуры,

□□ДополнительныеСвойстваНоменклатуры,

план видов характеристик: СвойстваНоменклатуры.

После этого у всех этих объектов и у справочника Клиенты нужно (в  палитре свойств объекта конфигурации) увеличить длину кода до 11 символов.

Теперь займемся доработкой документов.

В модуль документа ПриходнаяНакладная добавим обработчик события ПриУстановкеНовогоНомера (листинг 24.3).

Листинг 24.3. Обработчик события «ПриУстановкеНовогоНомера»

Процедура ПриУстановкеНовогоНомера(СтандартнаяОбработка, Префикс) Префикс = Обмен.ПолучитьПрефиксНомера();

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

Такие же обработчики нужно будет добавить во все документы, участвующие в обмене.

В нашем случае это единственный документ – ОказаниеУслуги.

После этого для обоих документов нужно (в палитре свойств объекта конфигурации) увеличить длину номера до 11 символов.

Занятие 24 715

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

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

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

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

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

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

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

716 1С:Предприятие 8.3. Практическое пособие разработчика

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

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

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

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

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

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

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

(рис. 24.3).

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

Занятие 24 717

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

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

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

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

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

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

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

КонецЕсли;

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

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

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

718 1С:Предприятие 8.3. Практическое пособие разработчика

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

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

менения.

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

Действие.

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

(выберем вариант Создать на клиенте и процедуру на сервере без контекста).

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

которая вызывается из клиентской процедуры.

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

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

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

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

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

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

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

// Вставить содержимое обработчика. КонецПроцедуры

Занятие 24 719

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

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

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

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

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

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

роватьИзменения().

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

Филиалы.

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

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

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

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

720 1С:Предприятие 8.3. Практическое пособие разработчика

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

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

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

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

&НаСервереБезКонтекста Функция ПредопределенныйУзел(Узел)

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

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

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

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

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

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

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

КонецЕсли;

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