INFOSTART EVENT 2018 EDUCATION

Второй тур голосования за доклады.
Окончание 5 сентября.

Федотов Виталий | Ведущий специалист | ГК Невада

«Повышение эффективности работы отдела разработки»

Основные слагаемые успеха: - Архитектура - Грамотный код - Ориентация на повторное использование кода - Управление ошибками Методы: - Обучение линейного и руководящего состава - Внимание на архитектуру - Итерационный подход к разработке API - Профилирование Результат: Повышение производительности труда отдела разработки в 2-3 раза. Особенность доклада заключается в изложении личного опыта построения работы отдела, где описанные методы были с успехом применены и повысили производительность труда отдела разработки.

ОбменComXML

Обмен - Обмен через XML

45
Обработка позволяет выгружать информацию в конфигурации 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')

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

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

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


45

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

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

См. также

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

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

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

Для кого-то такая разработка может служить наглядным пособием для организации com-обменов данными.
18. AlexO 125 16.05.12 18:12 Сейчас в теме
(13) Borisych,
вообще не понимаю упорное нежелание многих попробовать сделать хоть что то в КД

да достали уже ошибки при переносе через КД. И совсем неясно - что править, если "невозможно выгрузить. Реквизит такой-то не найден".
Что за реквизит, откуда он? базы идентичные, а вот поди ж ты.
19. Borisych 524 17.05.12 06:44 Сейчас в теме
(18) AlexO, это уходит когда приходит опыт
20. AlexO 125 24.05.12 14:08 Сейчас в теме
(19) Borisych,
да-да, расскажите мне про опыт после десятка произведенных мной переносов через КД :))))
21. AlexO 125 24.05.12 14:10 Сейчас в теме
(18) AlexO,
кстати, разобрался - косяк КД в том, что при обновлении конфигурации КД не удаляет из своего списка конфы те элементы, которые были в ранних релизах, но удалены в действующем.
Это дает великолепную картину удаленных в новом релизе объектов, но просит каждый раз проходить этапы создания правил и выгрузки :)))
16. Borisych 524 14.12.11 23:51 Сейчас в теме
я через com тоже делал/ю переносы, после освоения КД на должном уровне в зависимости от своего субъективного мнения выбираешь свободно и обоснованно каким инструментом пользоваться
Согласен. Кесарю - кесарево
17. igo-osetro 27.12.11 14:53 Сейчас в теме
Перенос через Com данной обработкой получился спасибо автору! Все что мне было нужно перенеслось! Хорошая обрабока :)
22. lees 13.06.12 13:14 Сейчас в теме
23. higs 27.07.12 16:11 Сейчас в теме
Согласен, КД - отличный мощный механизм, который с лихвой покрывает огромное количество возможных вариантов. Жаль, что для освоения и легкого использования для любого случая требуется очень немалый опыт, которго иногда просто не хватает. Так что и тянущиеся еще с 7.7 обмены по ОЛЕ и появившиеся по КОМ - вполне имеют право на жизнь, а иногда и способ наиболее быстро осуществить обмен
24. roofless 21 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. Светлый ум 233 07.01.16 19:06 Сейчас в теме
Пора уже 8.3 Comconnector использовать:

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