Как увеличить скорость обмена между базами через COM?

1. user973528 13.11.20 14:52 Сейчас в теме
Добрый день, Подскажите пожалуйста, COM обмен между двумя клиент-серверными базами, достаточно долго занимает времени чтобы отправить документ, можно ли увеличить скорость обмена и как это сделать? Заранее спасибо

Если ЭтотОбъект.АТ_ВидДокумента = Перечисления.АТ_ВидыПоступленияВКассу.ТОРГ12 И ЭтотОбъект.Проведен Тогда
		
		Соединение = ВыполнитьПодключениеЧерезCOM();
		 
	Если Соединение <> 0 Тогда
			 
		 Док = Соединение.Документы.ПриходныйКассовыйОрдер.НайтиПоНомеру(ЭтотОбъект.Номер, ЭтотОбъект.Дата).ПолучитьОбъект();
		 
		 Если Док.Дата > Дата('00010101') Тогда
			 
		 Док.Дата  = ЭтотОбъект.Дата;
		 
		 Если ЭтотОбъект.ВидОперации = Перечисления.ВидыОперацийПоступлениеВКассу.ОтПокупателя Тогда
			  Док.ВидОперации = Соединение.Перечисления.ВидыОперацийПКО.ОплатаПокупателя;
		 ИначеЕсли ЭтотОбъект.ВидОперации = Перечисления.ВидыОперацийПоступлениеВКассу.РозничнаяВыручка Тогда	  
			  Док.ВидОперации = Соединение.Перечисления.ВидыОперацийПКО.РозничнаяВыручка;
		 ИначеЕсли ЭтотОбъект.ВидОперации = Перечисления.ВидыОперацийПоступлениеВКассу.ВозвратЗаймаСотрудником Тогда	  
			  Док.ВидОперации = Соединение.Перечисления.ВидыОперацийПКО.ВозвратЗаймаРаботником;
		 ИначеЕсли ЭтотОбъект.ВидОперации = Перечисления.ВидыОперацийПоступлениеВКассу.Прочее Тогда
			  Док.ВидОперации = Соединение.Перечисления.ВидыОперацийПКО.РасчетыПоКредитам;
		 ИначеЕсли ЭтотОбъект.ВидОперации = Перечисления.ВидыОперацийПоступлениеВКассу.ПолучениеЗайма Тогда
			  Док.ВидОперации = Соединение.Перечисления.ВидыОперацийПКО.ПолучениеЗайма;
		 ИначеЕсли ЭтотОбъект.ВидОперации = Перечисления.ВидыОперацийПоступлениеВКассу.ОтПоставщика Тогда
			  Док.ВидОперации = Соединение.Перечисления.ВидыОперацийПКО.ВозвратОтПоставщика;
		 КонецЕсли;
		  
		 Док.СуммаДокумента = ЭтотОбъект.СуммаДокумента;
		 Док.ПринятоОт      = ЭтотОбъект.ПринятоОт;
		 Док.Приложение     = ЭтотОбъект.Приложение;
		 
		 Док.Организация = Соединение.Справочники.Организации.НайтиПоКоду("БП-000001");
		 Док.Комментарий = ЭтотОбъект.Комментарий;
		 Док.НомерЧекаККМ = ЭтотОбъект.НомерЧекаККМ;
		 Док.СтатьяДвиженияДенежныхСредств = Соединение.Справочники.СтатьиДвиженияДенежныхСредств.НайтиПоКоду("00-000013");
		 Док.СчетКасса = Соединение.ПланыСчетов.Хозрасчетный.НайтиПоКоду("50.01");
		 Док.Контрагент = Соединение.Справочники.Контрагенты.НайтиПоНаименованию(ЭтотОбъект.Контрагент.Наименование);
		 Док.Основание = ЭтотОбъект.Основание;
		 
		 Если ЭтотОбъект.РасшифровкаПлатежа.Количество() > 0 Тогда
			 
			 Док.РасшифровкаПлатежа.Очистить();  
			 
			 Для Каждого Стр ИЗ ЭтотОбъект.РасшифровкаПлатежа Цикл
				 
				 А = Док.РасшифровкаПлатежа.Добавить();
				 А.ДоговорКонтрагента = Соединение.Справочники.ДоговорыКонтрагентов.НайтиПоНаименованию(Стр.Договор.Наименование);
				 А.СпособПогашенияЗадолженности  = Соединение.Перечисления.СпособыПогашенияЗадолженности.Автоматически;
				 А.СтатьяДвиженияДенежныхСредств = Соединение.Справочники.СтатьиДвиженияДенежныхСредств.НайтиПоКоду("00-000013");
				 А.СуммаПлатежа = Стр.СуммаРасчетов;
				 
				 Если Стр.СтавкаНДС = Справочники.СтавкиНДС.НайтиПоНаименованию("20%") ИЛИ Стр.СтавкаНДС = Справочники.СтавкиНДС.НайтиПоНаименованию("20% / 120%") Тогда				 
					  А.СтавкаНДС = Соединение.Перечисления.СтавкиНДС.НДС20;			  
				 Иначе
					   А.СтавкаНДС = Соединение.Перечисления.СтавкиНДС.БезНДС;
				 КонецЕсли;
				   
				 А.СуммаНДС = Стр.СуммаНДС;
				 А.СчетУчетаРасчетовСКонтрагентом = Соединение.ПланыСчетов.Хозрасчетный.НайтиПоКоду("62.01");
				 А.СчетУчетаРасчетовПоАвансам = Соединение.ПланыСчетов.Хозрасчетный.НайтиПоКоду("62.02");
				 А.КратностьВзаиморасчетов    = Стр.Кратность;
				 А.КурсВзаиморасчетов         = Стр.Курс;
				 
			 КонецЦикла;
			 
		 КонецЕсли;
		 
		 Док.ВалютаДокумента = Соединение.Справочники.Валюты.НайтиПоКоду("643");
			 
		 
		 Док.Записать(Соединение.РежимЗаписиДокумента.Проведение);
			 
		 
	Иначе
		 
		 СсылкаНаОбъект = Соединение.Документы.ПриходныйКассовыйОрдер.СоздатьДокумент();
		 СсылкаНаОбъект.Дата   = ЭтотОбъект.Дата;
		 СсылкаНаОбъект.Номер  = ЭтотОбъект.Номер;
		 
		 Если ЭтотОбъект.ВидОперации = Перечисления.ВидыОперацийПоступлениеВКассу.ОтПокупателя Тогда
			  СсылкаНаОбъект.ВидОперации = Соединение.Перечисления.ВидыОперацийПКО.ОплатаПокупателя;
		 ИначеЕсли ЭтотОбъект.ВидОперации = Перечисления.ВидыОперацийПоступлениеВКассу.РозничнаяВыручка Тогда	  
			  СсылкаНаОбъект.ВидОперации = Соединение.Перечисления.ВидыОперацийПКО.РозничнаяВыручка;
		 ИначеЕсли ЭтотОбъект.ВидОперации = Перечисления.ВидыОперацийПоступлениеВКассу.ВозвратЗаймаСотрудником Тогда	  
			  СсылкаНаОбъект.ВидОперации = Соединение.Перечисления.ВидыОперацийПКО.ВозвратЗаймаРаботником;
		 ИначеЕсли ЭтотОбъект.ВидОперации = Перечисления.ВидыОперацийПоступлениеВКассу.Прочее Тогда
			  СсылкаНаОбъект.ВидОперации = Соединение.Перечисления.ВидыОперацийПКО.РасчетыПоКредитам;
		 ИначеЕсли ЭтотОбъект.ВидОперации = Перечисления.ВидыОперацийПоступлениеВКассу.ПолучениеЗайма Тогда
			  СсылкаНаОбъект.ВидОперации = Соединение.Перечисления.ВидыОперацийПКО.ПолучениеЗайма;
		 ИначеЕсли ЭтотОбъект.ВидОперации = Перечисления.ВидыОперацийПоступлениеВКассу.ОтПоставщика Тогда
			  СсылкаНаОбъект.ВидОперации = Соединение.Перечисления.ВидыОперацийПКО.ВозвратОтПоставщика;
		 КонецЕсли;
		  
		 СсылкаНаОбъект.СуммаДокумента = ЭтотОбъект.СуммаДокумента;
		 СсылкаНаОбъект.ПринятоОт      = ЭтотОбъект.ПринятоОт;
		 СсылкаНаОбъект.Приложение     = ЭтотОбъект.Приложение;
		 
		 СсылкаНаОбъект.Организация = Соединение.Справочники.Организации.НайтиПоКоду("БП-000001");
		 СсылкаНаОбъект.Комментарий = ЭтотОбъект.Комментарий;
		 СсылкаНаОбъект.НомерЧекаККМ = ЭтотОбъект.НомерЧекаККМ;
		 СсылкаНаОбъект.СтатьяДвиженияДенежныхСредств = Соединение.Справочники.СтатьиДвиженияДенежныхСредств.НайтиПоКоду("00-000013");
		 СсылкаНаОбъект.СчетКасса = Соединение.ПланыСчетов.Хозрасчетный.НайтиПоКоду("50.01");
		 СсылкаНаОбъект.Контрагент = Соединение.Справочники.Контрагенты.НайтиПоНаименованию(ЭтотОбъект.Контрагент.Наименование);
		 СсылкаНаОбъект.Основание = ЭтотОбъект.Основание;
		 
		 Если ЭтотОбъект.РасшифровкаПлатежа.Количество() > 0 Тогда
			 
			 Для Каждого Стр ИЗ ЭтотОбъект.РасшифровкаПлатежа Цикл
				 
				 А = СсылкаНаОбъект.РасшифровкаПлатежа.Добавить();
				 
				 А.ДоговорКонтрагента = Соединение.Справочники.ДоговорыКонтрагентов.НайтиПоНаименованию(Стр.Договор.Наименование);
				 А.СпособПогашенияЗадолженности  = Соединение.Перечисления.СпособыПогашенияЗадолженности.Автоматически;
				 А.СтатьяДвиженияДенежныхСредств = Соединение.Справочники.СтатьиДвиженияДенежныхСредств.НайтиПоКоду("00-000013");
				 А.СуммаПлатежа = Стр.СуммаРасчетов;
				 
				 Если Стр.СтавкаНДС = Справочники.СтавкиНДС.НайтиПоНаименованию("20%") ИЛИ Стр.СтавкаНДС = Справочники.СтавкиНДС.НайтиПоНаименованию("20% / 120%") Тогда				 
					  А.СтавкаНДС = Соединение.Перечисления.СтавкиНДС.НДС20;			  
				 Иначе
					   А.СтавкаНДС = Соединение.Перечисления.СтавкиНДС.БезНДС;
				 КонецЕсли;
				   
				 А.СуммаНДС = Стр.СуммаНДС;
				 А.СчетУчетаРасчетовСКонтрагентом = Соединение.ПланыСчетов.Хозрасчетный.НайтиПоКоду("62.01");
				 А.СчетУчетаРасчетовПоАвансам = Соединение.ПланыСчетов.Хозрасчетный.НайтиПоКоду("62.02");
				 А.КратностьВзаиморасчетов    = Стр.Кратность;
				 А.КурсВзаиморасчетов         = Стр.Курс;
				 
			 КонецЦикла;
			 
		 КонецЕсли;
		 
		 СсылкаНаОбъект.ВалютаДокумента = Соединение.Справочники.Валюты.НайтиПоКоду("643");
			 
		 
		 СсылкаНаОбъект.Записать(Соединение.РежимЗаписиДокумента.Проведение);
		 
		КонецЕсли; 
		КонецЕсли; 
	КонецЕсли;
Показать


Функция ВыполнитьПодключениеЧерезCOM()
    
   // Формируем строку подключения
   СтрокаПодключения =
       "srvr='srv:1641'; ref='buh_copy'; usr='1C_adm'; pwd='';";
   
   ИмяComОбъекта = "V83.COMConnector";
   COMConnector = Новый COMОбъект(ИмяComОбъекта);
   
   Попытка
      ComConnection = COMConnector.Connect(СтрокаПодключения);
	  Возврат ComConnection;
   Исключение
      Возврат 0;
   КонецПопытки;
     
КонецФункции
Показать
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Xershi 1519 13.11.20 15:14 Сейчас в теме
Под словом долго это сколько?
Базы где находятся? Какая нагрузка на оборудование?
3. soft_wind 13.11.20 15:17 Сейчас в теме
ну Г...код во всей красе!
в общем обмен между 1С базами и так не быстрый
попробуйте такую рекомендацию
формируете в базе источника структуру сразу со всеми данными документа (без ссылок, только простые типы, номер, дата, сумма и др)
передаете эту структуру (как строку) в базу приемник, какой-то модуль и создает/обновляет документ
получается по ком соединению одна команда

Соединение.СоздатьОбновитьДокумент(ВашиДанные) ;

и еще уберите все ваши НайтиПоКоду, НайтиПоИмени и тд.
поместите входящие данные в запрос и одним запросом получите все нужные ссылки!

если сделаете все правильно, будет побыстрее работать.
4. user973528 13.11.20 15:19 Сейчас в теме
(3) Скажите пожалуйста, а можно ли где нибудь хранить ком соединение всегда подключенное? Чтобы каждый раз его не вызывать
5. dmv78 205 13.11.20 15:32 Сейчас в теме
(4) В вашем случае нельзя. Так как V83.COMConnector закрывается автоматически после выполнения запроса, а если вы его поставите в зацикливание - то у вас упадет система. Используйте COMApplication
8. nomad_irk 76 13.11.20 15:36 Сейчас в теме
(5)Вот не нужно советовать еще большую чушь. V83.COMConnector в данном случае более чем оправдано.
В данном случае сам подход к обмену не совсем верный + реализация какая-то уж очень через Ж.
9. user973528 13.11.20 15:37 Сейчас в теме
(8) Сегодня первый раз познакомился с таким COM обменом
10. nomad_irk 76 13.11.20 15:38 Сейчас в теме
(9)Будет повод избавится от говнокода, если, конечно, есть желание это сделать ради прокачки своего опыта.
11. user973528 13.11.20 15:39 Сейчас в теме
(10) Можно где то посмотреть как делается заполнение через запрос?
14. nomad_irk 76 13.11.20 15:44 Сейчас в теме
(11)Я не вижу всего контекста вашего обмена, советовать что-либо в таких условиях просто не возможно.

Как правило запрос строится так, чтобы он содержал всю необходимую информацию для заполнения документа, а потом просто выполняется что-то типа такой конструкции:

ТаблицаЗаписей = Запрос.Выполнить().Выгрузить();
.......

Для Итератор Из НаборЗаписей Цикл

Если Итератор.НовыйДокумент тогда
Док = <создатьНовыйДокумент>;

ЗаполнитьЗначенияСвойств(Док, Итератор);
....
КонецЦикла;
Показать
13. dmv78 205 13.11.20 15:43 Сейчас в теме
(8) вы спросили про "держать коннект постоянно", получили ответ. Что именно он, не может держать ибо закрывается автоматом, апликэйшен не закрывается автоматом - я вам ничего не советовал - я просто предположил. Чушь тут только в том что вы на стороне уже соединения производите все операции, и соответственно это все идет через канал соединения, не проще ли передать просто (как вам оказывается уже советовали), на ту сторону уже массив с параметрами и там уже сформировать по входящим параметрам документ, средствами той базы.
15. user973528 13.11.20 15:45 Сейчас в теме
(13) Можете пожалуйста пример накидать как заполнять документ уже на стороне приемника а не во время соединения?
17. nomad_irk 76 13.11.20 15:47 Сейчас в теме
(13)Начнем с того, что я ничего не просил.
Передавать параметры по COM - такое себе, учитывая, что значения ссылочного типа все равно придется каким-то образом определять.

Лично я использовал бы УниверсальныйОбменДаннымиXML с транспортом через WS.
7. nomad_irk 76 13.11.20 15:33 Сейчас в теме
(4)Забудьте вы уже про COM, используйте WS для обмена.
dnikolaev; +1 Ответить
6. BotMan4 15 13.11.20 15:33 Сейчас в теме
А замер производительности что показывает, в каком моменте самое большое проседание?
И ком не получится хранить.
12. user973528 13.11.20 15:42 Сейчас в теме
(6) Во время подключения, ну и плюс еще вот эти мои "Найти по наименованию"
16. soft_wind 13.11.20 15:46 Сейчас в теме
(11) заполнение документа производится в коде программы, при этом можно использовать
ЗаполнитьЗначенияСвойств()
Одним запросом подготавливаем/ищем ссылочные данные, вместо сотни таких команд как НатиПо...
18. user633533_encantado 11 13.11.20 15:49 Сейчас в теме
Особенно забавно когда по коду ищутся счета из плана счетов. Ини же, блин, предопределенные, нафига их искать.
nomad_irk; +1 Ответить
19. nomad_irk 76 13.11.20 15:50 Сейчас в теме
(18)а завтра бухгалтеру не понравилось использовать какой-то счет, и он захотел использовать другой......
20. user633533_encantado 11 13.11.20 16:08 Сейчас в теме
(19) Вот тогда и нужно искать. Но эти то предопределенные.
21. SlavaKron 13.11.20 16:12 Сейчас в теме
Код обмена лучше выполнять на стороне приемника. Все данные должны браться запросом, никаких прикладных объектов на стороне источника получать не нужно. Исключите обращение к реквизитам через точку во встроенном языке. Ком-объект внешнего соединения можно кэшировать на сервере через конструкцию
ПоместитьВоВременноеХранилище(Новый Структура("Соединение", Соединение), Новый УникальныйИдентификатор)
На клиенте можно кэшировать в клиентскую переменную модуля формы.
22. user973528 13.11.20 17:25 Сейчас в теме
(21) Что даёт это кеширование?
23. SlavaKron 13.11.20 18:04 Сейчас в теме
(22) Соединение можно использовать повторно, не подключаясь снова.
24. user973528 13.11.20 18:08 Сейчас в теме
(23) У меня задача при проведении документа, отправлять, в общий модуль нужно лучше засунуть подключение по COM? Он же получается каждый раз будет в коде подключение выполнять
25. nomad_irk 76 13.11.20 18:14 Сейчас в теме
(24)
У меня задача при проведении документа, отправлять

Т.е. задача максимально затормозить работу БД?
27. user973528 13.11.20 18:49 Сейчас в теме
(25) а как сделать то тогда лучше? Отдельной кнопкой?
Думаете что если использовать допустим отдельной кнопкой, то нагрузки будет меньше?
28. nomad_irk 76 13.11.20 18:51 Сейчас в теме
(27)Лучше сделать регламентное задание, чтобы отправляло все, что накопилось с прошлой итерации.
26. SlavaKron 13.11.20 18:14 Сейчас в теме
(24) к сожалению, временное хранилище живет в рамках сеанса. Так как проведение может выполняться из любого сеанса невозможно закэшировать одно соединение для них всех. Советую обмен выполнять в базе приемнике регламентно, например раз в час. Это будет менее накладно по ресурсам сервера, чем вызывать соединение при каждом проведении. В этом случае проблема кэширования соединения отпадает, оно просто не нужно.
29. vetalk 15.11.20 17:13 Сейчас в теме
http или web сервис для доступа к данным из одной базы в другую.
Или же посредством выгрузки данных в файл. База - источник складывает куда-то файлы с нужными данными, а в приемнике регламентное задание мониторит наличие файлов и производит загрузку
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот