План обмена в 1С 8.3

Курс

План обмена

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

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

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

В пользовательском режиме создаются элементы плана обмена, которые называются узлами обмена:

План обмена

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

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

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

Состав плана обмена

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

Для настройки состава плана обмена на закладке Основные нужно нажать на кнопку Состав:

Состав плана обмена

Будет открыто окно, в котором можно флажками отметить те объекты, которыми можно будет обмениваться с помощью данного плана обмена:

Состав плана обмена

В состав плана обмена можно включить следующие объекты:

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

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

Обмен данными

При сохранении конфигурации базы данных для каждого из отмеченных объектов будет создана таблица с тремя колонками:

УзелСсылкаНомер сообщения

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

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

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

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

Отображать таблицы изменений

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

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

Служба регистрации изменений

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

Основное предназначение данной службы — это возможность выгружать только измененные объекты. Например, если в базе 10 000 элементов одного справочника, то достаточно один раз выгрузить его полностью, а в дальнейшем выгружать только измененные объекты.

Алгоритм работы данной службы:

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

Для того чтобы изменения объектов автоматически регистрировались в таблицах изменений нужно при настройке состава плана обмена разрешить автоматическую регистрацию (по умолчанию она разрешена):

Авторегистрация

Рассмотрим данный алгоритм на примере.

В базе-источнике есть 3 узла плана обмена, один из которых является текущей базой (Основная база):

Узлы плана обмена

В состав плана обмена включен только один справочник Номенклатура и для него разрешена автоматическая регистрация:

автоматическая регистрация

На данный момент таблица регистрации изменений пустая:

УзелСсылкаНомер сообщения

Создадим новую номенклатуру Стул. В результате в таблицу будет добавлено 2 новые строки, по одной для каждого узла плана обмена (кроме узла текущей базы):

УзелСсылкаНомер сообщения
База БухгалтерияСтулNULL
СайтСтулNULL

Так как выгрузка еще не выполнялась, то в колонке Номер сообщения NULL.

Создадим еще одну номенклатуру Шкаф:

УзелСсылкаНомер сообщения
База БухгалтерияСтулNULL
СайтСтулNULL
База БухгалтерияШкафNULL
СайтШкафNULL

В таблицу было добавлено 2 строки для шкафа.

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

УзелСсылкаНомер сообщения
База БухгалтерияСтул1
СайтСтулNULL
База БухгалтерияШкаф1
СайтШкафNULL

Создадим еще одну номенклатуру Стол:

УзелСсылкаНомер сообщения
База БухгалтерияСтул1
СайтСтулNULL
База БухгалтерияШкаф1
СайтШкафNULL
База БухгалтерияСтолNULL
СайтСтолNULL

Было добавлено еще 2 строки с NULL в колонке Номер сообщения.

После этого была выполнена выгрузка сразу в оба узла:

УзелСсылкаНомер сообщения
База БухгалтерияСтул1
СайтСтул1
База БухгалтерияШкаф1
СайтШкаф1
База БухгалтерияСтол2
СайтСтол1

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

Затем у стула был изменен артикул и он был перезаписан:

УзелСсылкаНомер сообщения
База БухгалтерияСтулNULL
СайтСтулNULL
База БухгалтерияШкаф1
СайтШкаф1
База БухгалтерияСтол2
СайтСтол1

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

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

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

УзелСсылкаНомер сообщения
База БухгалтерияСтулNULL
СайтСтулNULL
СайтШкаф1
База БухгалтерияСтол2
СайтСтол1

В результате была удалена строка со шкафом. Строка со стулом не была удалена, потому что там NULL, а у строки со столом Номер сообщения = 2. Строки с сайтом вообще не рассматривались, потому что там не совпадает узел.

Из данного примера можно сделать следующие выводы:

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

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

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

Основной отбор регистра сведений

У регистра сведений в свойствах измерения есть флаг Основной отбор:

Основной отбор

А если регистр сведений периодический, то на закладке Основные есть флаг Основной отбор по периоду:

Основной отбор по периоду

По умолчанию данные флаги установлены.

С помощью них определяется минимальная гранула для регистрации на узлах плана обмена.

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

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

Лучше всего объяснить на примере. Пусть есть регистр сведений со следующей структурой:

регистр сведений

И в нем содержатся следующие данные:

регистр сведений

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

ПериодНоменклатураВид ценУзелНомер сообщения
05.10.21ШкафОптоваяСсылка на узелNULL

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

ПериодНоменклатураУзелНомер сообщения
05.10.21ШкафСсылка на узелNULL

Тогда при выгрузке в файл, из регистра будут отобраны все записи, где Номенклатура = Шкаф и Период = 05.10.21, то есть сразу 2 записи: с оптовой и розничной ценой.

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

Удаление объекта

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

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

ЭтотУзел

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

Чтобы получить текущий узел можно воспользоваться методом ЭтотУзел. Данный метод вернет ссылку на узел плана обмена:

У плана обмена есть реквизит ЭтотУзел типа Булево. Только для текущего узла в данном реквизите будет Истина, у всех остальных узлов будет Ложь. Через запрос можно получить ссылку на текущий узел:

Реквизит ЭтотУзел не доступен для редактирования. Если попробовать сбросить его программно для текущего узла, то будет получена ошибка «Данные изменения приведут к отсутствию элемента с установленным признаком «ЭтотУзел»».

Но в режиме обмена его можно сбросить. Например, изменим текущий узел на другой:

Теперь другой узел будет выделен специальной пиктограммой и теперь его будет возвращать метод ЭтотУзел.

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

Если установить сразу у нескольких узлов реквизит ЭтотУзел в Истина, то при вызове метода ЭтотУзел будет получена ошибка «Найдено более одной записи для узла ЭтотУзел».


Подписывайтесь на группу ВКонтакте , где я публикую ссылки на новые статьи с данного сайта, а также интересные материалы с других ресурсов по программированию в 1С
Понравилась статья? Поделиться с друзьями:
Комментарии: 1
  1. Sht0ff

    Хорошая статья, спасибо.

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

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!:

Используя этот сайт, Вы даете согласие на использование cookies. На данном этапе Вы можете отказаться от использования cookies, настроив необходимые параметры в своем браузере.
ok