Имя: Пароль:
   
1C
1С v8
Формирование запроса в mySQL, из 1С не работает, а в консоли phpMyAdmin работает
0 PQT
 
12.04.18
06:08
ОписаниеОшибки():
Ошибка при вызове метода контекста (Execute): Произошла исключительная ситуация (Microsoft OLE DB Provider for ODBC Drivers): [MySQL][ODBC 5.1 Driver][mysqld-5.5.52-38.3]You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'INSERT INTO `repairs_statuses` SET `id` = "ccceac7b-3de4-11e8-8131-94de80bc398' at line 1


Причем формировании запроса двумя способами, эффект один: с 1С не работает, в консоле работает.
Вариант запроса 1:
INSERT INTO `repairs_statuses` SET `id` = "ccceac7b-3de4-11e8-8131-94de80bc398d", `number` = "CМ0000593", `date` = "12.04.2018 10:35:28", `fault` = "перегревается, шуметь начинает, выключает сам, или сильнее шумит. без пароля", `fio` = "Вербило Ольга Николаевна";
INSERT INTO `repairs_statuses` SET `id` = "ccceac7e-3de4-11e8-8131-94de80bc398d", `number` = "CМ0000594", `date` = "12.04.2018 10:40:04", `fault` = "посмотреть батарею под заказ. без пароля. сильно шумит кулер. диагностика HDD, почистить ОС или переустановка", `fio` = "Козырев Сергей Георгиевич";
Вариант запроса 2:
INSERT INTO `repairs_statuses`(`id`,`number`,`date`,`fault`,`fio`) VALUES ("ccceac7b-3de4-11e8-8131-94de80bc398d","CМ0000593","12.04.2018 10:35:28","перегревается, шуметь начинает, выключает сам, или сильнее шумит. без пароля","Вербило Ольга Николаевна");
INSERT INTO `repairs_statuses`(`id`,`number`,`date`,`fault`,`fio`) VALUES ("ccceac7e-3de4-11e8-8131-94de80bc398d","CМ0000594","12.04.2018 10:40:04","посмотреть батарею под заказ. без пароля. сильно шумит кулер. диагностика HDD, почистить ОС и ли переустановка, как мастер посчитает нужным. данные сохранить","Козырев Сергей Георгиевич");

Для проверки запросы копировал напрямую из отладчика в phpMyAdmin.

Исполнение запускал тоже двумя способами:
ActiveSQL.Open(Стр) и mySQL.Execute(Стр), - эффект один
1 PQT
 
12.04.18
06:10
Через ODBC не пробовал, если не получится победить, придется
2 Туц
 
12.04.18
06:11
(0) "ccceac7b-3de4-11e8-8131-94de80bc398d"
кавычки поставь двойные везде
3 PQT
 
12.04.18
06:23
(2)
в 1С код верно формирует запрос.
Вот первая версия:

    ДокРем = Запрос.Выполнить().Выбрать();
    Пока ДокРем.Следующий() Цикл
        ИдентификаторыПолей = "`id`,"; ЗначенияПолей = """"+ДокРем.Ссылка.УникальныйИдентификатор()+""",";
        Для каждого Рекв Из Реквизиты Цикл
            Если СокрЛП(ДокРем[Рекв]) <> "" Тогда
                ИдентификаторыПолей = ИдентификаторыПолей + "`"+Рекв+"`,";
                ЗначенияПолей = ЗначенияПолей + """"+СтрЗаменить(ДокРем[Рекв],"""","'")+""",";
            КонецЕсли;
        КонецЦикла;
        ИдентификаторыПолей = Лев(ИдентификаторыПолей,СтрДлина(ИдентификаторыПолей)-1);
        ЗначенияПолей = Лев(ЗначенияПолей,СтрДлина(ЗначенияПолей)-1);
        Стр = Стр + "INSERT INTO `repairs_statuses`("+ИдентификаторыПолей+") VALUES ("+ЗначенияПолей+");
        |";
        
        ОбработкаПрерыванияПользователя();
        Сообщить("Обновиляю на сайте документ "+ДокРем.date+" "+ДокРем.fio,СтатусСообщения.Обычное);
    КонецЦикла;

И вторая версия:

    Пока ДокРем.Следующий() Цикл
        Стр = Стр + "; INSERT INTO `repairs_statuses` SET `id` = """+ДокРем.Ссылка.УникальныйИдентификатор()+ """";
        Для каждого Рекв Из Реквизиты Цикл
            Если СокрЛП(ДокРем[Рекв]) <> "" Тогда
                Стр = Стр + ", `"+Рекв+"` = """+СтрЗаменить(ДокРем[Рекв],"""","`")+"""";
            КонецЕсли;
        КонецЦикла;
        Стр = Стр+"
        |";
        ОбработкаПрерыванияПользователя();
        Сообщить("Обновиляю на сайте документ "+ДокРем.date+" "+ДокРем.fio,СтатусСообщения.Обычное);
    КонецЦикла;
4 PQT
 
12.04.18
06:25
(2) То что формирует 1С копирую из отладчика в буфер, вставляю в консоль phpMyAdmin, и он успешно его выполняет.
Но из 1С выдает ошибку, несмотря на то, что запрос идентичен
5 PQT
 
12.04.18
06:26
Чтобы понятен был контекст этого фрагмента вот начало процедуры:

    Запрос = Новый Запрос;
    Реквизиты = Новый Массив;
    //Реквизиты.Добавить("id");
    Реквизиты.Добавить("number");
    Реквизиты.Добавить("date");
    Реквизиты.Добавить("fault");
    Реквизиты.Добавить("repairing");
    Реквизиты.Добавить("repairer");
    Реквизиты.Добавить("fio");
    //Реквизиты.Добавить("status");
    Запрос.Текст = "ВЫБРАТЬ
        |    РемонтОборудования.Номер КАК number,
        |    РемонтОборудования.Дата КАК date,
        |    РемонтОборудования.Ссылка КАК Ссылка,
        |    РемонтОборудования.Неисправность КАК fault,
        |    РемонтОборудования.ТехническоеЗаключение КАК repairing,
        |    РемонтОборудования.Исполнитель.Наименование КАК repairer,
        |    РемонтОборудования.Контрагент.ПолноеНаименование КАК fio,
        |    РемонтОборудования.СтатусРемонта КАК status
        |ИЗ
        |    Документ.РемонтОборудования КАК РемонтОборудования
        |ГДЕ
        |    РемонтОборудования.ИзмененияВыгруженыНаСайт = ЛОЖЬ
        |    И РемонтОборудования.Дата > &Дата";
    Запрос.УстановитьПараметр("Дата", Дата);
    Стр = "";
    ДокРем = Запрос.Выполнить().Выбрать();
... (далее то что выше указал)
6 PQT
 
12.04.18
06:50
о, сработало запрос отдельно по каждой строчке...хм, но так некрасиво както))...
Другой тогда вопрос: Есть ли преимущество у соединения через ODBC кроме того что пароль к sql не в коде 1С?