gifts2017

ОбменComXML

Опубликовал Алексей Захаров (almas) в раздел Обмен - Обмен через XML

Обработка позволяет выгружать информацию в конфигурации 1С версий 8.2.
Удобно использовать когда необходимо выгрузить информацию, а использование "ВыгрузкаЗагрузкаДанныхXML.epf" невозможно  из-за несовпадения структур выгружаемых объектов.  
Обработка не призвана заменить или конкурировать с Конвертацией, однако использование Конвертации зачастую бывает неоправданно долго.

 БУДУ РАД ВЫСЛАННЫМ ОШИБКАМ И ЗАМЕЧАНИЯМ, ОСОБЕННО С ИСПРАВЛЕННЫМ /ДОРАБОТАННЫМ КОДОМ.

Версия 4.1:

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

Версия 4.       

  •   Исправлены выявленные в процессе работы ошибки. Добавлено сохранение настроек в Файл.
  •   Выявлена   платформенная 1С ошибка - COM-соединение не работает, если у вас  на машине стоят две версии платформы. Почему-то не находит dll-ку.

Версия 3.       

  •   Переписана полностью на платформу 8.2. (8.2.14.519).
  • Оптимизировано быстродействие, переписано определение типов.  Убрал «невостребованный» с моей точки зрения функционал. Доработана возможность  подключения к файловой базе. Исправлены ошибки выявленные в версии 2.1.
  • Ограничения - недотестирована выгрузка объектов (отключена выгрузка через COM):
    • ПланВидовРасчета;
    • ПланСчетов;
    • Задачи;
    • БизнесПроцесс;
    • ПланОбмена;
    • РегистрРасчета;
    • РегистрБухгалтерии;

Версия 2.1   Проведено дополнительное тестирование. Устранены выявленные ошибки. Доработан интерфейс, внешний вид, добавлена маленькая справка. После проведенный доработок текущее описание обработки не переделывалось.

Версия 2.  Скомпонована более универсально, добавлен функционал регистрации в ПланОбмена, добавлено сравнение Данных, устранены замеченные ошибки. Из-за недостатка времени доработка ведется только  при крайней необходимости. Поставляется "Как Есть" - есть вероятность  потери данных при перегрузке через COM.  Тестировалась на 8.1.

Возможности обработки:

  • Регистрация объектов в узел  плана обмена.

  • Выгрузка объектов в другую базу посредством COM-соединения.

  • Формирование простых отчетов на базе построителя отчета по выбранному объекту /объектам.  Результат выводится  на  экран или  в таблицу значений.

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

вывести в таблицу – выводит данные в таблицу значений внизу формы.

результат в план обмена – регистрирует выбранные объекты в план обмена.
Режим доступен, если узел плана обмена заполнен.

Выгрузить через COM – выгружает  объекты в другую базу посредством COM- соединения.

 

Описание формы инструментария

 

При открытии обработки формируется дерево метаданных.

 

При заполненном поле «ПланОбмена», метаданные ограничиваются регистрируемыми  объектами  выбранного плана обмена.

 

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

 

Объекты МД с настроенными отборами отмечаются в дереве значком «*».

 

 

Кнопки панели управления позволяют:

  •   Действия с деревом метаданных: свернуть, развернуть, отметить, снять отметки.

  •   Открыть форму списка выбранного объекта метаданных.

  •   Распечатать дерево метаданных

  •   Полностью зарегистрировать или отменить регистрацию всего объекта в плане обмена.

  •   Сохранить/восстановить настройку  на диск.

 

       Открывает/скрывает таблицу значений  (Предварительный анализ результатов в таблице значений)

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

Форма тонкой настройки открывается по двойному клику на строке дерева объектов.

 Возможны настройки:

  • Настройка отборов
  • Настройка соответствий реквизитов с COM-объектом
  • Настройка замен.

 

 

Настройка соответствий реквизитов с COM-объектом:

Настройка требуется, если  объекты в базах имеют различную структуру.

Пример 1: требуется перегрузить  справочник Клиенты в справочник Контрагенты.

Необходимо  ввести наименование справочника в Сom-базе. В дальнейшем  при выгрузке объектов для реквизитов данного типа будет устанавливаться соответствующий тип автоматически.

Пример2:  Различаются наименования реквизитов.

Пример 3: требуется перегрузить только несколько реквизитов.

 

 

Настройка замен:

Настройка замен возможна  для справочников. При настроенной замене будет происходить подмена элементов.

Пример 1:  В новой базе создан новый предопределенный элемент.

Описание приемов работы с обработкой.

Выгрузка данных через com-соединение.

Для простой выгрузки данных через com-соединение достаточно установить режим “Выгрузить через COM”. Если настройка отборов не требуется, то дополнительных действий более не требуется. В момент  подключения будут заполнены соответствия объектов и реквизитов и т.д.

Соответствие реквизитов будет устанавливаться по Com-имени, если оно было  заполнено в форме тонкой настройки.

 

В окне сообщений будет выведены сообщения об «несовпадающих» объектах.

 

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

 

Запись всех объектов в Com-базе  происходит в режиме: ОбменДанными.Загрузка=Истина.

Применение COM-технологии

Ограничения на применение  COM – технологии в 1С, из личного опыта (рецензии приветствуются только с примером реализации).

 

  • Сверка может производится только по простым типам: дата, число, строка. (ограничение на строки для SQL 2000 не более 25 символов, SQL 2005 не более 256 символов)

В SQL 2000 ограничение 25 символов срабатывает на больших объемах, на маленьких проходит без проблем и с большим количеством записей -- наблюдал лично.

  • Нет возможности использовать в COM-base механизм транзакций.
  • В случаях размещения в процедурах ПередЗаписью(), ПриЗаписи() дополнительных действий с объектом может появляться ошибка записи.  Для исключения ошибки в COM-base необходимо вставить блок кода:

                        Если ОбменДанными.Загрузка Тогда Возврат; КонецЕсли; 


Ошибка

Возможная Причина

{ВнешняяОбработка.ОбменCOM_XML(1108)}: Ошибка при вызове метода контекста (Записать): Произошла исключительная ситуация: Ошибка при выполнении обработчика –

Получение элемента по индексу для значения не определено'  ComЭлемент.Записать();


В COM-базе. В случаях размещения в процедурах ПередЗаписью(), ПриЗаписи()  дополнительных действий – возникает ошибка записи. Для использования технологии необходимо вставить блок кода:

Если ОбменДанными.Загрузка  Тогда Возврат; КонецЕсли;

{ВнешняяОбработка.ОбменCOM_XML(1725)}: Ошибка при вызове метода контекста (ЗарегистрироватьИзменения): Недопустимое значение параметра (параметр номер '1')
    ПланыОбмена.ЗарегистрироватьИзменения(ПланОбмена,ТКСТР[ИмяКолонки]);
по причине:
Недопустимое значение параметра (параметр номер '1')

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

 Недостаточно памяти

Ограничьте выгрузку объектов с помощью отборов.


Скачать файлы

Наименование Файл Версия Размер
ОбменComXML Версия 4 397
.epf 182,47Kb
15.02.12
397
.epf 182,47Kb Скачать
ОбменComXML(версия 2.1 под 8.1)(Старая не сопровождается) 415
.epf 73,09Kb
15.02.12
415
.epf 73,09Kb Скачать

См. также

Подписаться Добавить вознаграждение
Комментарии
1. mastakw (mastakw) 13.12.09 22:19
Всеже, чем неустраивает стандартная Конвертация Данных ??
2. sbv2005 (sbv2005) 07.01.10 16:44
Я думаю, COM-обмен тем и интересен, что это - возможность online обмена. Многие пытаются подобраться к этой теме.
А XML-обмен, который используется в Конвертации, это все же offline.
Спасибо автору за предложенное решение.
3. dushelov (Душелов) 07.01.10 17:24
(2) Для нормально онлайн обмена лучше использовать вебсервисы, тогда и территориально не зависимо будет, и не важно какая платформа и где территориально находится.
4. sbv2005 (sbv2005) 07.01.10 18:08
5. dushelov (Душелов) 07.01.10 18:20
(4) 1. Данная разработка для 8
2. Вебсервисы в 7.7 тоже можно использовать, используя соответствующие ВК.
6. Алексей Захаров (almas) 10.01.10 09:28
Что хотелось сделать-посмотреть насколько 1с корректно реализовала технологию прямого подключения. Как выдите на альфа версии все пока и остановилось. - 1с решила развивать XML. К сожалению получение напрямую через запрос текстового представления ссылки не было реализовано. из-за этого гемор так и остался.
7. Алексей (Alav) 17.01.10 10:25
Так КД давно для 8-ки прямое COM-соединение поддерживает. Плюс к примеру, интеграция с планом обмена
8. Роман (combatxp) 05.10.10 09:06
Добрый день, Алексей. У меня не открывается обработка.
{ВнешняяОбработка.ОбменCOM_XML(61,9)}: Процедура или функция с указанным именем не определена (ЗаполнениеСправочникаСотрудники)
Справ=<<?>>ЗаполнениеСправочникаСотрудники(ФизЛицо,Приказ);
9. PlatonovStepan (Jogeedae) 29.10.10 12:17
а почему застрял в хранилище?
разве нельзя выгружать файл на диск и затем загружать в другую базу?
10. Алексей Захаров (almas) 30.10.10 06:56
9 Приведи пример, буду рад внести изменения.
11. PlatonovStepan (Jogeedae) 01.11.10 04:55
(10)
ок. вот пример:
Вводные: в справочнике "допВнешФайлы" есть реквизит "Данные" типа хранилищеЗначения.
Задача: Через COM-соединение перенести эти данные в другую базу.

Код:
//Этот код перенесёт данные элемента1 из одной базы в данные элемент2 другой базы.
//ВнешняяБД - ком-соединение с другой базой
ИмяВремФайла = ПолучитьИмяВременногоФайла();
ВнешняяБД.Справочники.допВнешФайлы.НайтиПоНаименованию("элемент1").Данные.Получить().Записать(ИмяВремФайла);
объектЭлементаСправочникаТут = Справочники.допВнешФайлы.НайтиПоНаименованию("элемент2").ПолучитьОбъект();
объектЭлементаСправочникаТут.Данные = Новый ХранилищеЗначения(Новый ДвоичныеДанные(ИмяВремФайла));
объектЭлементаСправочникаТут.Записать();
УдалитьФайлы(ИмяВремФайла);//подчистим
12. PlatonovStepan (Jogeedae) 01.11.10 05:00
(10)
пример 2, тут те же вводные, но база-источник и база-приемник - внешние.
Код:

//Этот код перенесёт данные элемента1 из одной базы в данные элемент2 другой базы.
//ВнешняяБД1, ВнешняяБД2 - ком-соединения с другими базами
ИмяВремФайла = ПолучитьИмяВременногоФайла();
ВнешняяБД1.Справочники.допВнешФайлы.НайтиПоНаименованию("элемент1").Данные.Получить().Записать(ИмяВремФайла);
объектЭлементаСправочникаТам = ВнешняяБД2.Справочники.допВнешФайлы.НайтиПоНаименованию("элемент2").ПолучитьОбъект();
объектЭлементаСправочникаТам.Данные = ВнешняяБД2.NewObject("ХранилищеЗначения", ВнешняяБД2.NewObject("ДвоичныеДанные", ИмяВремФайла));
объектЭлементаСправочникаТам.Записать();
УдалитьФайлы(ИмяВремФайла);//подчистим
13. Андрей Григорьев (Borisych) 11.12.11 00:38
вообще не понимаю упорное нежелание многих попробовать сделать хоть что то в КД
15. Алексей Захаров (almas) 14.12.11 08:14
(13) Borisych, На это можно ответить: каждому - свое. И это прекрасно!
Если вы считаете, что КД для вас удобнее - я рад за вас. Только мне реально пришлось заниматься переносом данных
и мне КД не подошло. Вскоре выложу достаточно наглядный пример описанием.

Для кого-то такая разработка может служить наглядным пособием для организации com-обменов данными.
16. Андрей Григорьев (Borisych) 14.12.11 23:51
я через com тоже делал/ю переносы, после освоения КД на должном уровне в зависимости от своего субъективного мнения выбираешь свободно и обоснованно каким инструментом пользоваться
Согласен. Кесарю - кесарево
17. Игорь Осетров (igo-osetro) 27.12.11 14:53
Перенос через Com данной обработкой получился спасибо автору! Все что мне было нужно перенеслось! Хорошая обрабока :)
18. Алекс Ю (AlexO) 16.05.12 18:12
(13) Borisych,
вообще не понимаю упорное нежелание многих попробовать сделать хоть что то в КД

да достали уже ошибки при переносе через КД. И совсем неясно - что править, если "невозможно выгрузить. Реквизит такой-то не найден".
Что за реквизит, откуда он? базы идентичные, а вот поди ж ты.
19. Андрей Григорьев (Borisych) 17.05.12 06:44
(18) AlexO, это уходит когда приходит опыт
20. Алекс Ю (AlexO) 24.05.12 14:08
(19) Borisych,
да-да, расскажите мне про опыт после десятка произведенных мной переносов через КД :))))
21. Алекс Ю (AlexO) 24.05.12 14:10
(18) AlexO,
кстати, разобрался - косяк КД в том, что при обновлении конфигурации КД не удаляет из своего списка конфы те элементы, которые были в ранних релизах, но удалены в действующем.
Это дает великолепную картину удаленных в новом релизе объектов, но просит каждый раз проходить этапы создания правил и выгрузки :)))
22. lees lees (lees) 13.06.12 13:14
23. Александр Удалов (higs) 27.07.12 16:11
Согласен, КД - отличный мощный механизм, который с лихвой покрывает огромное количество возможных вариантов. Жаль, что для освоения и легкого использования для любого случая требуется очень немалый опыт, которго иногда просто не хватает. Так что и тянущиеся еще с 7.7 обмены по ОЛЕ и появившиеся по КОМ - вполне имеют право на жизнь, а иногда и способ наиболее быстро осуществить обмен
24. Алексей Ларин (roofless) 12.11.15 09:15
Нет возможности использовать в COM-base механизм транзакций

я успешно использую

создание сом-соединения
Функция ПодключитьсяКБазе1С() Экспорт
	
	Попытка
		
		#Если Клиент Тогда
			Состояние("Выполняется подключение к 1С...");
		#КонецЕсли
		
		cntr	= Новый COMObject("V83.COMConnector");

		Usr		= СокрЛП(Константы.ИмяПользователя.Получить());
		Pwd		= СокрЛП(Константы.Пароль.Получить());
		cntr.PoolTimeout = 60;
		
		СоединениеС1С = cntr.Connect(СокрЛП(Константы.СтрокаСоединения.Получить())
									+ ?(ПустаяСтрока(Usr), "", "Usr = """ + Usr + """;")
									+ ?(ПустаяСтрока(Pwd), "", "Pwd = """ + Pwd + """;"));
									
		Сообщить("Подключение к базе: " + СоединениеС1С.Метаданные.ПодробнаяИнформация + " версия: "
			+ СоединениеС1С.Метаданные.Версия + " " + ТекущаяДата() + " прошло успешно", СтатусСообщения.Информация);
			
			//сохраняем ком-соединение во временное хранилище
			СохранитьСоединение(СоединениеС1С);
		
	Исключение
		СоединениеС1С = Неопределено;
		Сообщить("Не удалось подключиться к базе данных 1С по причине: "
						+ Символы.ПС + ОписаниеОшибки());


	КонецПопытки;
	
	Возврат СоединениеС1С;
	
КонецФункции
...Показать Скрыть


и вызов для очистки регистра в источнике
	//если регистр не пустой
	Если Выборка.Count() > 0 Тогда
		//действия по очистке регистра выполняем в рамках одной транзакции
		Попытка
			СоединениеС1С.НачатьТранзакцию();
			текБлокировка = СоединениеС1С.NewObject("БлокировкаДанных");
			//на время выполнения блокирем регистр для записи
			тбдЖурнал = текБлокировка.Add("РегистрСведений.НакладныеРозницаКРегистрации");
			тбдЖурнал.Mode = СоединениеС1С.РежимБлокировкиДанных.Исключительный;
			текБлокировка.Заблокировать();
			
			Если Выборка.Следующий() Тогда
				Попытка
					РегистрОчистка = СоединениеС1С.РегистрыСведений.НакладныеРозницаКРегистрации.CreateRecordSet();
					РегистрОчистка.Записать();
				Исключение
				КонецПопытки;
			КонецЕсли;
			
			//фиксируем транзакцию, снимаем блокировку
			СоединениеС1С.ЗафиксироватьТранзакцию();		
		Исключение
			//отмена транзакции в случае ошибки
			СоединениеС1С.ОтменитьТранзакцию();
		КонецПопытки;
		
	КонецЕсли;
...Показать Скрыть
25. Константин Куликов (Светлый ум) 07.01.16 19:06
Пора уже 8.3 Comconnector использовать:

Если Соединение = Неопределено Тогда   
		Попытка
			Если СтрПодк.ВерсияПлатформы="V81" Тогда 
				Com = Новый COMОбъект("V81.COMConnector");
			Иначе
				//Com = Новый COMОбъект("V82.COMConnector");
				Com = Новый COMОбъект("V83.COMConnector");
			КонецЕсли;
			Соединение = com.connect(СтрокаПодключения); 
		Исключение
			Соединение = Неопределено;
			РезПодкл.Вставить("ОписаниеОшибки",ОписаниеОшибки());
			РезПодкл.Вставить("Ошибка",Истина);
		КонецПопытки;
...Показать Скрыть
26. Константин Куликов (Светлый ум) 07.01.16 19:32
не взлетело - видимо устарел механизм.
27. Игорь Богданов (avz_1C) 28.03.16 18:27
Очень красивое решение.
Спасибо.
Скачал.
"Плюсанул".