Здравствуйте делаю импорт на сайт !
Через драйвер ODBC соединение COM есть что нить быстрее соединения COM ?? а то скорость импорта мне вообще не нравиться !Очень долго я как то краем ухом слышал через web приложение без COM очень быстро можно проводить импорт но вот как точно не знаю !
Из того что иметься
Windows server 2008 r2 1C 8.2 Ут 10.3 !
Через драйвер ODBC соединение COM есть что нить быстрее соединения COM ?? а то скорость импорта мне вообще не нравиться !Очень долго я как то краем ухом слышал через web приложение без COM очень быстро можно проводить импорт но вот как точно не знаю !
Из того что иметься
Windows server 2008 r2 1C 8.2 Ут 10.3 !
По теме из базы знаний
Найденные решения
(34) Тебе это не надо, если ты со стороны 1С хочешь на сайт запихивать. Это надо, если ты хочешь со стороны сайта из 1С забирать. Но тогда тебе надо на стороне 1С их публиковать (выставлять в интернет) и на сайте писать блок "забора". Можно на сайте реализовать http-сервис, по которому сайт должен уметь принять номенклатуру и записать ее в базу. А уж 1С умеет слать по http и так.
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
Если сервер mysql в локальной сети с базой 1С, то ничего быстрее работы через драйвер быть не может.
Если что-то не так со скоростью импорта, то внимательно смотрите сначала на код, потом на руки.
Если что-то не так со скоростью импорта, то внимательно смотрите сначала на код, потом на руки.
(26) Что, (13) не дало никакого ускорения? Второй вопрос - какая скорость будет считаться приемлемой?
(27) Ессно будет быстрее. Потому что со стороны клиента накладные расходы будут только на загрузку файла. Особенно если у тебя большое latency.
Если дело в latency, то попробуй увеличить размер порции в (13). Поставь 500, например.
(27) Ессно будет быстрее. Потому что со стороны клиента накладные расходы будут только на загрузку файла. Особенно если у тебя большое latency.
Если дело в latency, то попробуй увеличить размер порции в (13). Поставь 500, например.
Первым делом сделайте замер производительности (одинэсный построчный, а не общий), чтобы убедиться что тормоза именно на выполнении запроса mysql
Потом проанализируйте сам запрос и его результаты. Желательно понять, на чем именно тормозит - на выполнении запроса или из-за большого возвращаемого результата. Можно, к примеру, попробовать заменить SELECT "поля" на SELECT 1. Если производительность станет ожидаемой, значит вы возвращаете слишком большую выборку. Типичная ошибка - пытаться получить все данные, включая текстовые, одной большой ненормализованной таблицей.
Если тормозит само выполнение запроса, тогда запрос в студию.
Потом проанализируйте сам запрос и его результаты. Желательно понять, на чем именно тормозит - на выполнении запроса или из-за большого возвращаемого результата. Можно, к примеру, попробовать заменить SELECT "поля" на SELECT 1. Если производительность станет ожидаемой, значит вы возвращаете слишком большую выборку. Типичная ошибка - пытаться получить все данные, включая текстовые, одной большой ненормализованной таблицей.
Если тормозит само выполнение запроса, тогда запрос в студию.
(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 = '" + Цена + "'");
конеццикла;
КонецПроцедуры
Показать
(12) Попробуй так:
Писал на коленке не глядя, поэтому мог где-то и напортачить.
Для маскимальной производительности поэкспериментируй с размером порции.
ЗЫ. Возможно придется создание CommandSQL перенести к выполнению запроса. Не уверен насчет этого момента.
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) Ты и так используешь внешние компоненты. Если хочешь без них - то я не знаю как. Для этого нужна какая-то приблуда, которая умеет по http обрабатывать запросы к mysql. Есть еще внешние наборы данных, но я в них не копенгаген.
Одинэсный запрос, кстати, у тебя тоже страшненький. Сколько он выполняется?
Попробуй так:
Одинэсный запрос, кстати, у тебя тоже страшненький. Сколько он выполняется?
Попробуй так:
ВЫБРАТЬ
Остатки.Номенклатура КАК Номенклатура,
Остатки.Номенклатура.Наименование КАК Наименование,
Остатки.Номенклатура.Артикул КАК Артикул,
Остатки.Номенклатура.Производитель КАК Производитель,
Остатки.КоличествоОстаток КАК Остаток,
Цены.Цена * 1.33 КАК Цена
ИЗ
РегистрНакопления.ТоварыНаСкладах.Остатки КАК Остатки
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, ТипЦен = &ТипЦенРозница) КАК Цены
ПО Остатки.Номенклатура = Цены.Номенклатура
ГДЕ
Остатки.КоличествоОстаток > 0 И Цены.Цена > 0
Показать
Как костыльный альтернативный вариант, который может быть гарантированно быстрее: возможно в mysql как-то можно произвести локальную загрузку таблички из текстового файлика. Может, какой-нить консольной утилитой или командой. Тогда можно из 1С просто выгружать текстовый файлик.
(17) Ты так говоришь, как будто ODBC это что-то плохое и тормозящее. Это не так. Ессно есть некоторые накладные расходы на единицу запроса. Но если с кодом все нормально, то это не может стать проблемой.
(17) Ты так говоришь, как будто ODBC это что-то плохое и тормозящее. Это не так. Ессно есть некоторые накладные расходы на единицу запроса. Но если с кодом все нормально, то это не может стать проблемой.
(34) Тебе это не надо, если ты со стороны 1С хочешь на сайт запихивать. Это надо, если ты хочешь со стороны сайта из 1С забирать. Но тогда тебе надо на стороне 1С их публиковать (выставлять в интернет) и на сайте писать блок "забора". Можно на сайте реализовать http-сервис, по которому сайт должен уметь принять номенклатуру и записать ее в базу. А уж 1С умеет слать по http и так.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот