Top.Mail.Ru

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

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

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

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

Настройка и структура плана обмена 1С

Рассмотрим подробнее структуру плана обмена:

Объект метаданных план обмена расположен в ветке «Общие» конфигуратора.

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

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

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

В таблице «Выбранные объекты» отображается текущий состав плана обмена.

Регистрация изменений в плане обмена 1С

В колонке «Авторегистрация» можно выбрать значения «Разрешить» и «Запретить». Если для объекта включенного в состав плана обмена авторегистрация установлена в значение «Разрешить», то при записи/проведении такой объект автоматически будет регистрироваться во всех узлах данного плана обмена. Если же авторегистрация установлена в значение «Запретить», то регистрировать такой объект нужно либо программно, либо через стандартную обработку «Регистрация изменений для обмена данными».

Зарегистрировать изменения в плане обмена 1С программно в конкретном узле

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

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

Также зарегистрировать изменения в плане обмена 1С можно в пользовательском режиме при помощи обработки «Регистрация изменений для обмена данными».

зарегистрировать изменения в плане обмена 1с программно

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

Чтение зарегистрированных изменений из узла плана обмена

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

УзелОбмена = ПланыОбмена.prosto_ПланОбмена.НайтиПоКоду("001"); //ищем узел плана обмена по коду, из данного узла будем считывать изменения
Если УзелОбмена <> ПланыОбмена.prosto_ПланОбмена.ПустаяСсылка() Тогда //если узел обмена найден тогда считываем изменения
          ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xml"); //получаем имя временного файла
	  Попытка //чтение производим в блоке Попытка, в случае возникновения ошибки, она будет выведена через метод Сообщить в исключении			
	       ЗаписьСообщения = ПланыОбмена.СоздатьЗаписьСообщения(); //создаём запись сообщения, это необходимо для того чтобы в дальнейшем создать выборку изменений плана обмена
	       ХМЛЗаписьВыгрузки = Новый ЗаписьXML; //создаем XML запись
	       ХМЛЗаписьВыгрузки.ОткрытьФайл(ИмяВременногоФайла, "windows-1251"); // пишем XML запись в файл
	       ЗаписьСообщения.НачатьЗапись(ХМЛЗаписьВыгрузки, УзелОбмена); //начинаем запись
	       МассивВыгружаемыхЭлементов = Новый Массив;
               ВыборкаПлан = ПланыОбмена.ВыбратьИзменения(ЗаписьСообщения.Получатель, 0, Метаданные.Справочники.Номенклатура); //создаём выборку изменений, будут выбраны измененные элементы справочника Номенклатура из узла обмена указанного выше
	        Пока ВыборкаПлан.Следующий() Цикл //цикл по выборке
	            ОбъектВыгрузки = ВыборкаПлан.Получить(); //получаем изменённый объект из выборки
		    Если ТипЗнч(ОбъектВыгрузки) = Тип("СправочникОбъект.Номенклатура") И НЕ ОбъектВыгрузки.ПометкаУдаления Тогда //проверяем соответствует ли объект условиям выгрузки
		         МассивВыгружаемыхЭлементов.Добавить(ОбъектВыгрузки); //заполняем массив элементов для выгрузки					
		    КонецЕсли;	
	        КонецЦикла;
	       ЗаписьСообщения.ЗакончитьЗапись(); //закончим запись 
	       ХМЛЗаписьВыгрузки.Закрыть(); //закроем файл в который читали изменения
				
	  Исключение
	       Сообщить(ОписаниеОшибки()); //в случае неудачного чтения изменений вывалится ошибка с текстом   			
	  КонецПопытки;	
			
	  УдалитьФайлы(ИмяВременногоФайла); //удалим временный файл в который читали изменения		
КонецЕсли;

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

УзелОбмена = ПланыОбмена.prosto_ПланОбмена.НайтиПоКоду("001"); //ищем узел плана обмена по коду, из данного узла будем считывать изменения
Если УзелОбмена <> ПланыОбмена.prosto_ПланОбмена.ПустаяСсылка() Тогда //если узел обмена найден тогда считываем изменения
     МассивВыгружаемыхЭлементов = Новый Массив;

     ЗапросПланОбмена = Новый Запрос; //запросом выберем изменения справочника Номенклатура
     ЗапросПланОбмена.Текст =
     "ВЫБРАТЬ
     |	НоменклатураИзменения.Узел,
     |	НоменклатураИзменения.НомерСообщения,
     |	НоменклатураИзменения.Ссылка КАК ЭлементВыгрузки
     |ИЗ
     |	Справочник.Номенклатура.Изменения КАК НоменклатураИзменения
     |ГДЕ
     |	НоменклатураИзменения.Узел = &УзелОбмена";
     ЗапросПланОбмена.УстановитьПараметр("УзелОбмена", УзелОбмена);
     РезультатПланОбмена = ЗапросПланОбмена.Выполнить();
     Если НЕ РезультатПланОбмена.Пустой() Тогда
	ВыборкаПланОбмена = РезультатПланОбмена.Выбрать(); //создаём выборку изменений, будут выбраны измененные элементы справочника Номенклатура из узла обмена указанного выше
	Пока ВыборкаПланОбмена.Следующий() Цикл //цикл по выборке
		МассивВыгружаемыхЭлементов.Добавить(ВыборкаПланОбмена.ЭлементВыгрузки); //заполняем массив элементов для выгрузки 		
	КонецЦикла;	
     КонецЕсли;	

КонецЕсли;

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

Удаление зарегистрированных изменений из узла плана обмена

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

     ПланыОбмена.УдалитьРегистрациюИзменений(УзелОбмена, Элемент); //удаляем изменения, УзелОбмена - узел из которого удаляем изменения, Элемент - это объект, который снимаем с регистрации в узле

Comments

So empty here ... leave a comment!

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

Sidebar