Здравствуйте делаю импорт на сайт !
Через драйвер ODBC соединение COM есть что нить быстрее соединения COM ?? а то скорость импорта мне вообще не нравиться !Очень долго я как то краем ухом слышал через web приложение без COM очень быстро можно проводить импорт но вот как точно не знаю !
Из того что иметься
Windows server 2008 r2 1C 8.2 Ут 10.3 !
---
Тебе это не надо, если ты со стороны 1С хочешь на сайт запихивать. Это надо, если ты хочешь со стороны сайта из 1С забирать. Но тогда тебе надо на стороне 1С их публиковать (выставлять в интернет) и на сайте писать блок "забора". Можно на сайте реализовать http-сервис, по которому сайт должен уметь принять номенклатуру и записать ее в базу. А уж 1С умеет слать по http и так.
---
Если сервер mysql в локальной сети с базой 1С, то ничего быстрее работы через драйвер быть не может.
Если что-то не так со скоростью импорта, то внимательно смотрите сначала на код, потом на руки.
---
он не в локальной сети !
---
Да без разницы, на самом деле. Не знаю, зачем я локальную сеть приплел.
Но теперь мне просто интересно по безопасности стало - сиквел у вас голой жопой в интернет торчит или через какой-нить VPN или stunnel доступен, раз ты к нему напрямую доступаешься?
---
голой жопой )
---
Безумству храбрых поем мы песню :)
---
Все равно тормозит плачу и пишу
---
Что, (13) не дало никакого ускорения? Второй вопрос - какая скорость будет считаться приемлемой?
(27) Ессно будет быстрее. Потому что со стороны клиента накладные расходы будут только на загрузку файла. Особенно если у тебя большое latency.
Если дело в latency, то попробуй увеличить размер порции в (13). Поставь 500, например.
---
а может в csv файл отправлять и там php его перебирать ?
---
Самый тупой, печальный и заскорузлый вариант, но при этом достаточно эффективный - загрузка файлика по ftp.
Со стороны сайта будет просто опрос и если появился файлик - загружать его и удалять.
Заодно и СУБД можно будет из интернета убрать.
---
Смотрели?
---
Да смотрел это не совсем то (
---
Ну, если так настроено, то потеря времени может быть только в самом СОМ - подключении.
Например, когда я настраиваю обмен между двумя базами 1С через COM, то подключение происходит 20 сек. примерно.
---
Хорошо, что я живу в альтернативной реальности, где ничего не тормозит.
---
Попробуйте тот же код но с компьютера где винда и 1с только что установлены, возможно мешают накопившиеся настройки...
---
Первым делом сделайте замер производительности (одинэсный построчный, а не общий), чтобы убедиться что тормоза именно на выполнении запроса mysql
Потом проанализируйте сам запрос и его результаты. Желательно понять, на чем именно тормозит - на выполнении запроса или из-за большого возвращаемого результата. Можно, к примеру, попробовать заменить SELECT "поля" на SELECT 1. Если производительность станет ожидаемой, значит вы возвращаете слишком большую выборку. Типичная ошибка - пытаться получить все данные, включая текстовые, одной большой ненормализованной таблицей.
Если тормозит само выполнение запроса, тогда запрос в студию.
---
У меня в базе 13500 товаров выгрузка 16 мин

```1c
    Процедура ВыгрузитьСейчасНажатие(Элемент)

    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 = '" + Цена + "'");

    конеццикла;

    КонецПроцедуры
```
---
Надо было сразу сказать, что ты пишешь, а не читаешь. С пакетной записью не сталкивался, но знаю что оптимизировать можно. Погодь...
---
С пакетной записью нет не сталкивался !
---
Ессно у тебя набегает куча накладных расходов на десятках тысяч отдельных транзакций. Первое, что приходит в голову - посылать за раз инсертов, скажем, 50. Но есть более эффективные способы, кажись. Щаз гляну...
---
Жду очень нужно решить данную проблему (
А как начет внешних компонентов ?
---
Попробуй так:

```1c
    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 перенести к выполнению запроса. Не уверен насчет этого момента.
---
хорошо попробую
А как начет внешних компонентов ?
---
Ты и так используешь внешние компоненты. Если хочешь без них - то я не знаю как. Для этого нужна какая-то приблуда, которая умеет по http обрабатывать запросы к mysql. Есть еще внешние наборы данных, но я в них не копенгаген.
Одинэсный запрос, кстати, у тебя тоже страшненький. Сколько он выполняется?
Попробуй так:

```1c
    ВЫБРАТЬ
    Остатки.Номенклатура КАК Номенклатура,
    Остатки.Номенклатура.Наименование КАК Наименование,
    Остатки.Номенклатура.Артикул КАК Артикул,
    Остатки.Номенклатура.Производитель КАК Производитель,
    Остатки.КоличествоОстаток КАК Остаток,
    Цены.Цена * 1.33 КАК Цена
    ИЗ
    РегистрНакопления.ТоварыНаСкладах.Остатки КАК Остатки
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, ТипЦен = &ТипЦенРозница) КАК Цены
    ПО Остатки.Номенклатура = Цены.Номенклатура
    ГДЕ
    Остатки.КоличествоОстаток > 0 И Цены.Цена > 0
```
---
Одно могу тебе сказать. Если ты ищешь спасения от тормозов, то оно совершенно точно не в альтернативном способе доступа к mysql.
---
просто когда я смотрел демо версию обработки там подключалась отдeльная лабуда mysql.dll и работала очень шустро и не какой ODBC
---
Как костыльный альтернативный вариант, который может быть гарантированно быстрее: возможно в mysql как-то можно произвести локальную загрузку таблички из текстового файлика. Может, какой-нить консольной утилитой или командой. Тогда можно из 1С просто выгружать текстовый файлик.
(17) Ты так говоришь, как будто ODBC это что-то плохое и тормозящее. Это не так. Ессно есть некоторые накладные расходы на единицу запроса. Но если с кодом все нормально, то это не может стать проблемой.
---
через web приложение тоже говорят что то есть (!
---
Что такое "web приложение"?
---
сам не знаю что то слышаш типо этого в гугле искал не нашел (
---
ну напрямую 99% не получите, придется прослойку писать на php или java, да хоть на delphi =)
MySQL <-> прослойка <-> 1С
да по идее быстрее будет =)
---
https://xn----1-bedvffifm4g.xn--p1ai/articles/2017-09-07-exchange-with-internet-services/
---
наверно web или http - сервис.
---
вот вот web сервис !
---
будет очень быстро
---
вот https://xn----1-bedvffifm4g.xn--p1ai/articles/2017-09-07-exchange-with-internet-services/
---
Тебе это не надо, если ты со стороны 1С хочешь на сайт запихивать. Это надо, если ты хочешь со стороны сайта из 1С забирать. Но тогда тебе надо на стороне 1С их публиковать (выставлять в интернет) и на сайте писать блок "забора". Можно на сайте реализовать http-сервис, по которому сайт должен уметь принять номенклатуру и записать ее в базу. А уж 1С умеет слать по http и так.