Как увеличить скорость обмена между базами через COM?
Добрый день, Подскажите пожалуйста, 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;
КонецПопытки;
КонецФункции
ПоказатьПо теме из базы знаний
- Выгрузка-загрузка любых данных из 1С (и измененных) в XML между похожими конфигурациями (ФАЙЛ, HTTP, COM) ЛЮБЫХ баз 1С 8.1-8.3 с обработкой и поиском данных по произвольным полям поиска
- Загрузка номенклатуры c картинками (несколько потоков одновременно) и сопутствующими данными в базу и любые документы из yml, xls, xlsx, xlsm, ods, ots, csv для УТ 10.3, УТ 11 (все), БП 3, КА 2, ERP 2, УНФ 1.6/3.0, Розница 2
- 10 шагов для создания стартапа на основе 1С: Предприятие и Asp.Net MVC
- Как из 1С отдать миллионы строк в BI и успеть это сделать быстро
- Эффективное управление фоновыми заданиями и коммуникация сеансов сервера с Фоном с помощью Структуры обмена (ноу-хау) + Бонус: Альтернативный вариант через Хранилище настроек
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
ну Г...код во всей красе!
в общем обмен между 1С базами и так не быстрый
попробуйте такую рекомендацию
формируете в базе источника структуру сразу со всеми данными документа (без ссылок, только простые типы, номер, дата, сумма и др)
передаете эту структуру (как строку) в базу приемник, какой-то модуль и создает/обновляет документ
получается по ком соединению одна команда
Соединение.СоздатьОбновитьДокумент(ВашиДанные) ;
и еще уберите все ваши НайтиПоКоду, НайтиПоИмени и тд.
поместите входящие данные в запрос и одним запросом получите все нужные ссылки!
если сделаете все правильно, будет побыстрее работать.
в общем обмен между 1С базами и так не быстрый
попробуйте такую рекомендацию
формируете в базе источника структуру сразу со всеми данными документа (без ссылок, только простые типы, номер, дата, сумма и др)
передаете эту структуру (как строку) в базу приемник, какой-то модуль и создает/обновляет документ
получается по ком соединению одна команда
Соединение.СоздатьОбновитьДокумент(ВашиДанные) ;
и еще уберите все ваши НайтиПоКоду, НайтиПоИмени и тд.
поместите входящие данные в запрос и одним запросом получите все нужные ссылки!
если сделаете все правильно, будет побыстрее работать.
(11)Я не вижу всего контекста вашего обмена, советовать что-либо в таких условиях просто не возможно.
Как правило запрос строится так, чтобы он содержал всю необходимую информацию для заполнения документа, а потом просто выполняется что-то типа такой конструкции:
Как правило запрос строится так, чтобы он содержал всю необходимую информацию для заполнения документа, а потом просто выполняется что-то типа такой конструкции:
ТаблицаЗаписей = Запрос.Выполнить().Выгрузить();
.......
Для Итератор Из НаборЗаписей Цикл
Если Итератор.НовыйДокумент тогда
Док = <создатьНовыйДокумент>;
ЗаполнитьЗначенияСвойств(Док, Итератор);
....
КонецЦикла;
Показать
(8) вы спросили про "держать коннект постоянно", получили ответ. Что именно он, не может держать ибо закрывается автоматом, апликэйшен не закрывается автоматом - я вам ничего не советовал - я просто предположил. Чушь тут только в том что вы на стороне уже соединения производите все операции, и соответственно это все идет через канал соединения, не проще ли передать просто (как вам оказывается уже советовали), на ту сторону уже массив с параметрами и там уже сформировать по входящим параметрам документ, средствами той базы.
Код обмена лучше выполнять на стороне приемника. Все данные должны браться запросом, никаких прикладных объектов на стороне источника получать не нужно. Исключите обращение к реквизитам через точку во встроенном языке. Ком-объект внешнего соединения можно кэшировать на сервере через конструкцию На клиенте можно кэшировать в клиентскую переменную модуля формы.
ПоместитьВоВременноеХранилище(Новый Структура("Соединение", Соединение), Новый УникальныйИдентификатор)
(24) к сожалению, временное хранилище живет в рамках сеанса. Так как проведение может выполняться из любого сеанса невозможно закэшировать одно соединение для них всех. Советую обмен выполнять в базе приемнике регламентно, например раз в час. Это будет менее накладно по ресурсам сервера, чем вызывать соединение при каждом проведении. В этом случае проблема кэширования соединения отпадает, оно просто не нужно.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот