1C mysql без com соединения !

1. ArsenProg 21.09.18 12:51 Сейчас в теме
Здравствуйте делаю импорт на сайт !
Через драйвер ODBC соединение COM есть что нить быстрее соединения COM ?? а то скорость импорта мне вообще не нравиться !Очень долго я как то краем ухом слышал через web приложение без COM очень быстро можно проводить импорт но вот как точно не знаю !
Из того что иметься
Windows server 2008 r2 1C 8.2 Ут 10.3 !
+
По теме из базы знаний
Найденные решения
36. herfis 498 21.09.18 17:29 Сейчас в теме
(34) Тебе это не надо, если ты со стороны 1С хочешь на сайт запихивать. Это надо, если ты хочешь со стороны сайта из 1С забирать. Но тогда тебе надо на стороне 1С их публиковать (выставлять в интернет) и на сайте писать блок "забора". Можно на сайте реализовать http-сервис, по которому сайт должен уметь принять номенклатуру и записать ее в базу. А уж 1С умеет слать по http и так.
+
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. herfis 498 21.09.18 12:57 Сейчас в теме
Если сервер mysql в локальной сети с базой 1С, то ничего быстрее работы через драйвер быть не может.
Если что-то не так со скоростью импорта, то внимательно смотрите сначала на код, потом на руки.
user774630; ben19791010; +2
22. ArsenProg 21.09.18 15:55 Сейчас в теме
(2) он не в локальной сети !
+
23. herfis 498 21.09.18 16:09 Сейчас в теме
(22) Да без разницы, на самом деле. Не знаю, зачем я локальную сеть приплел.
Но теперь мне просто интересно по безопасности стало - сиквел у вас голой жопой в интернет торчит или через какой-нить VPN или stunnel доступен, раз ты к нему напрямую доступаешься?
+
24. ArsenProg 21.09.18 16:13 Сейчас в теме
25. herfis 498 21.09.18 16:13 Сейчас в теме
(24) Безумству храбрых поем мы песню :)
awp; +1
26. ArsenProg 21.09.18 16:14 Сейчас в теме
(25) Все равно тормозит плачу и пишу
+
29. herfis 498 21.09.18 16:21 Сейчас в теме
(26) Что, (13) не дало никакого ускорения? Второй вопрос - какая скорость будет считаться приемлемой?
(27) Ессно будет быстрее. Потому что со стороны клиента накладные расходы будут только на загрузку файла. Особенно если у тебя большое latency.
Если дело в latency, то попробуй увеличить размер порции в (13). Поставь 500, например.
+
27. ArsenProg 21.09.18 16:14 Сейчас в теме
(25) а может в csv файл отправлять и там php его перебирать ?
+
31. herfis 498 21.09.18 16:28 Сейчас в теме
(27) Самый тупой, печальный и заскорузлый вариант, но при этом достаточно эффективный - загрузка файлика по ftp.
Со стороны сайта будет просто опрос и если появился файлик - загружать его и удалять.
Заодно и СУБД можно будет из интернета убрать.
+
3. Timur.V 78 21.09.18 13:25 Сейчас в теме
4. ArsenProg 21.09.18 14:03 Сейчас в теме
(3) Да смотрел это не совсем то (
+
5. Timur.V 78 21.09.18 14:07 Сейчас в теме
(4)
Ну, если так настроено, то потеря времени может быть только в самом СОМ - подключении.
Например, когда я настраиваю обмен между двумя базами 1С через COM, то подключение происходит 20 сек. примерно.
+
7. herfis 498 21.09.18 14:16 Сейчас в теме
(5) Хорошо, что я живу в альтернативной реальности, где ничего не тормозит.
+
37. YanTsys 12 22.09.18 18:46 Сейчас в теме
(5) Попробуйте тот же код но с компьютера где винда и 1с только что установлены, возможно мешают накопившиеся настройки...
+
6. herfis 498 21.09.18 14:14 Сейчас в теме
Первым делом сделайте замер производительности (одинэсный построчный, а не общий), чтобы убедиться что тормоза именно на выполнении запроса mysql
Потом проанализируйте сам запрос и его результаты. Желательно понять, на чем именно тормозит - на выполнении запроса или из-за большого возвращаемого результата. Можно, к примеру, попробовать заменить SELECT "поля" на SELECT 1. Если производительность станет ожидаемой, значит вы возвращаете слишком большую выборку. Типичная ошибка - пытаться получить все данные, включая текстовые, одной большой ненормализованной таблицей.
Если тормозит само выполнение запроса, тогда запрос в студию.
+
8. ArsenProg 21.09.18 14:22 Сейчас в теме
(6) У меня в базе 13500 товаров выгрузка 16 мин
Процедура ВыгрузитьСейчасНажатие(Элемент)

 Connection = Новый COMОбъект("ADODB.Connection");
 Если Connection.State = 0 Тогда	
        SRV = ЭтаФорма.ЭлементыФормы.ДанныеАдрессБазыДанных.Значение;
        DB = ЭтаФорма.ЭлементыФормы.ДанныеИмяБазыДанных.Значение;
        UID = ЭтаФорма.ЭлементыФормы.ДанныеПользовательБазыДанных.Значение;
        PWD = ЭтаФорма.ЭлементыФормы.ДанныеПарольБазыДанных.Значение;      
        JointSrv = 
				"
				|DRIVER={MySQL ODBC 5.3 Unicode Driver};
                |SERVER=" + SRV + ";
				|UID=" + UID + ";
                |PASSWORD=" + PWD + ";
				|DATABASE=" + DB + ";
				|";
        Попытка
            Connection.Open(JointSrv);
			ЭтаФорма.ЭлементыФормы.СтатусВыгрузкиВБазуДанных.Значение = "Успешное подключение !" +Символы.ПС+ "Начало Выгрузки !";
        Исключение
            Connection = Неопределено;
			ЭтаФорма.ЭлементыФормы.СтатусВыгрузкиВБазуДанных.Значение = "Ошибка подключения !";
        КонецПопытки;	
КонецЕсли;		
		
		
		Запрос = Новый Запрос;
		Запрос.Текст =
		"ВЫБРАТЬ РАЗЛИЧНЫЕ
		|	ВложенныйЗапрос.Номенклатура,
		|	ВложенныйЗапрос.Наименование,
		|	ВложенныйЗапрос.Артикул,
		|	ВложенныйЗапрос.Производитель,
		|	СУММА(ВложенныйЗапрос.Остаток) КАК Остаток,
		|	СУММА(ВложенныйЗапрос.Цена) КАК Цена
		|ИЗ
		|	(ВЫБРАТЬ РАЗЛИЧНЫЕ
		|		ВложенныйЗапрос.Номенклатура КАК Номенклатура,
		|		СУММА(ВложенныйЗапрос.Остаток) КАК Остаток,
		|		ВложенныйЗапрос.Наименование КАК Наименование,
		|		ВложенныйЗапрос.Артикул КАК Артикул,
		|		ВложенныйЗапрос.Производитель КАК Производитель,
		|		СУММА(ВложенныйЗапрос1.Цена) КАК Цена
		|	ИЗ
		|		(ВЫБРАТЬ РАЗЛИЧНЫЕ
		|			ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура,
		|			СУММА(ТоварыНаСкладахОстатки.КоличествоОстаток) КАК Остаток,
		|			ТоварыНаСкладахОстатки.Номенклатура.Наименование КАК Наименование,
		|			ТоварыНаСкладахОстатки.Номенклатура.Артикул КАК Артикул,
		|			ТоварыНаСкладахОстатки.Номенклатура.Производитель КАК Производитель
		|		ИЗ
		|			РегистрНакопления.ТоварыНаСкладах.Остатки КАК ТоварыНаСкладахОстатки
		|		ГДЕ
		|			ТоварыНаСкладахОстатки.КоличествоОстаток > 0
		|		
		|		СГРУППИРОВАТЬ ПО
		|			ТоварыНаСкладахОстатки.Номенклатура,
		|			ТоварыНаСкладахОстатки.Номенклатура.Наименование,
		|			ТоварыНаСкладахОстатки.Номенклатура.Артикул,
		|			ТоварыНаСкладахОстатки.Номенклатура.Производитель) КАК ВложенныйЗапрос
		|			ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ РАЗЛИЧНЫЕ
		|				ЦеныНоменклатурыСрезПоследних.Номенклатура КАК Номенклатура,
		|				СУММА(ЦеныНоменклатурыСрезПоследних.Цена * 1.33) КАК Цена
		|			ИЗ
		|				РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследних
		|			ГДЕ
		|				ЦеныНоменклатурыСрезПоследних.ТипЦен = &ТипЦенРозница
		|			
		|			СГРУППИРОВАТЬ ПО
		|				ЦеныНоменклатурыСрезПоследних.Номенклатура) КАК ВложенныйЗапрос1
		|			ПО ВложенныйЗапрос.Номенклатура = ВложенныйЗапрос1.Номенклатура
		|	
		|	СГРУППИРОВАТЬ ПО
		|		ВложенныйЗапрос.Номенклатура,
		|		ВложенныйЗапрос.Наименование,
		|		ВложенныйЗапрос.Артикул,
		|		ВложенныйЗапрос.Производитель) КАК ВложенныйЗапрос
		|ГДЕ
		|	ВложенныйЗапрос.Цена > 0
		|
		|СГРУППИРОВАТЬ ПО
		|	ВложенныйЗапрос.Номенклатура,
		|	ВложенныйЗапрос.Наименование,
		|	ВложенныйЗапрос.Артикул,
		|	ВложенныйЗапрос.Производитель";
		
		Запрос.Параметры.Вставить("ТипЦенРозница",справочники.ТипыЦенНоменклатуры.НайтиПоНаименованию("Закупочная продажа", Истина));
		
Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() цикл
	
	Наименование = Строка(Выборка.Номенклатура);
	Артикул = Строка(Выборка.Артикул);	
	Количество = Число(Выборка.Остаток);
	Цена = Строка(Формат(Выборка.Цена, "ЧГ="));
 
	Connection.Execute (                         
	"                                  
	|INS ERT INTO tested SE T 
	|name = '" + Наименование + "', 
	|article = '" + Артикул + "', 
	|quantity = '" + Количество + "',
	|price = '" + Цена + "'");
	                                                                                                        

конеццикла;
		
		
		
		
				   

КонецПроцедуры

Показать
+
9. herfis 498 21.09.18 14:26 Сейчас в теме
(8) Надо было сразу сказать, что ты пишешь, а не читаешь. С пакетной записью не сталкивался, но знаю что оптимизировать можно. Погодь...
+
11. ArsenProg 21.09.18 14:45 Сейчас в теме
(9)С пакетной записью нет не сталкивался !
+
10. herfis 498 21.09.18 14:28 Сейчас в теме
Ессно у тебя набегает куча накладных расходов на десятках тысяч отдельных транзакций. Первое, что приходит в голову - посылать за раз инсертов, скажем, 50. Но есть более эффективные способы, кажись. Щаз гляну...
+
12. ArsenProg 21.09.18 14:48 Сейчас в теме
(10) Жду очень нужно решить данную проблему (
А как начет внешних компонентов ?
+
13. herfis 498 21.09.18 15:07 Сейчас в теме
(12) Попробуй так:
CommandSQL = New COMObject("ADODB.Command");
CommandSQL.ActiveConnection = Connection;
		
РазмерПорции = 50;

ШапкаЗапроса = "ins ert in to tested(name,article,quantity,price) values";
ШаблонСтрокиЗапроса = "('%1','%2','%3','%4'),";

НомерСтроки = 1;
РазмерВыборки = Выборка.Количество();
ТекстЗапроса = ШапкаЗапроса;
Пока Выборка.Следующий() Цикл
    
    Наименование = Строка(Выборка.Номенклатура);
    Артикул = Строка(Выборка.Артикул);    
    Количество = Число(Выборка.Остаток);
    Цена = Строка(Формат(Выборка.Цена, "ЧГ="));
	
	ТекстЗапроса = ТекстЗапроса + "
	|" + СтрШаблон(ШаблонСтрокиЗапроса, Наименование, Артикул, Количество, Цена);
	
	Если (НомерСтроки % РазмерПорции = 0) ИЛИ (НомерСтроки >= РазмерВыборки) Тогда
		ТекстЗапроса = Лев(ТекстЗапроса, СтрДлина(ТекстЗапроса) - 1) + ";"; // замена хвостовой запятой на точку с запятой
		CommandSQL.CommandText = ТекстЗапроса;
		CommandSQL.Execute();
		ТекстЗапроса = ШапкаЗапроса;
	КонецЕсли;
	
	НомерСтроки = НомерСтроки + 1;

КонецЦикла;
Показать

Писал на коленке не глядя, поэтому мог где-то и напортачить.
Для маскимальной производительности поэкспериментируй с размером порции.
ЗЫ. Возможно придется создание CommandSQL перенести к выполнению запроса. Не уверен насчет этого момента.
+
14. ArsenProg 21.09.18 15:20 Сейчас в теме
(13)хорошо попробую
А как начет внешних компонентов ?
+
15. herfis 498 21.09.18 15:29 Сейчас в теме
(14) Ты и так используешь внешние компоненты. Если хочешь без них - то я не знаю как. Для этого нужна какая-то приблуда, которая умеет по http обрабатывать запросы к mysql. Есть еще внешние наборы данных, но я в них не копенгаген.
Одинэсный запрос, кстати, у тебя тоже страшненький. Сколько он выполняется?
Попробуй так:
ВЫБРАТЬ 
	Остатки.Номенклатура КАК Номенклатура,
	Остатки.Номенклатура.Наименование КАК Наименование,
	Остатки.Номенклатура.Артикул КАК Артикул,
	Остатки.Номенклатура.Производитель КАК Производитель,
	Остатки.КоличествоОстаток КАК Остаток,
	Цены.Цена * 1.33 КАК Цена
ИЗ
	РегистрНакопления.ТоварыНаСкладах.Остатки КАК Остатки
	ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, ТипЦен = &ТипЦенРозница) КАК Цены
	ПО Остатки.Номенклатура = Цены.Номенклатура
ГДЕ
	Остатки.КоличествоОстаток > 0 И Цены.Цена > 0
Показать
+
16. herfis 498 21.09.18 15:39 Сейчас в теме
Одно могу тебе сказать. Если ты ищешь спасения от тормозов, то оно совершенно точно не в альтернативном способе доступа к mysql.
+
17. ArsenProg 21.09.18 15:41 Сейчас в теме
(16) просто когда я смотрел демо версию обработки там подключалась отдeльная лабуда mysql.dll и работала очень шустро и не какой ODBC
+
19. herfis 498 21.09.18 15:48 Сейчас в теме
Как костыльный альтернативный вариант, который может быть гарантированно быстрее: возможно в mysql как-то можно произвести локальную загрузку таблички из текстового файлика. Может, какой-нить консольной утилитой или командой. Тогда можно из 1С просто выгружать текстовый файлик.
(17) Ты так говоришь, как будто ODBC это что-то плохое и тормозящее. Это не так. Ессно есть некоторые накладные расходы на единицу запроса. Но если с кодом все нормально, то это не может стать проблемой.
+
18. ArsenProg 21.09.18 15:42 Сейчас в теме
(16)через web приложение тоже говорят что то есть (!
+
20. herfis 498 21.09.18 15:51 Сейчас в теме
(18) Что такое "web приложение"?
+
21. ArsenProg 21.09.18 15:55 Сейчас в теме
(20) сам не знаю что то слышаш типо этого в гугле искал не нашел (
+
30. succub1_5 89 21.09.18 16:23 Сейчас в теме
(21)ну напрямую 99% не получите, придется прослойку писать на php или java, да хоть на delphi =)
MySQL <-> прослойка <-> 1С
да по идее быстрее будет =)
+
28. succub1_5 89 21.09.18 16:21 Сейчас в теме
(20)наверно web или http - сервис.
+
32. ArsenProg 21.09.18 16:48 Сейчас в теме
(28) вот вот web сервис !
+
33. ArsenProg 21.09.18 16:48 Сейчас в теме
(28) будет очень быстро
+
36. herfis 498 21.09.18 17:29 Сейчас в теме
(34) Тебе это не надо, если ты со стороны 1С хочешь на сайт запихивать. Это надо, если ты хочешь со стороны сайта из 1С забирать. Но тогда тебе надо на стороне 1С их публиковать (выставлять в интернет) и на сайте писать блок "забора". Можно на сайте реализовать http-сервис, по которому сайт должен уметь принять номенклатуру и записать ее в базу. А уж 1С умеет слать по http и так.
+
Внимание! Тема сдана в архив

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