Работа с MySQL из 1С через ODBC В статье описан процесс работы с MySQL базой из 1С через ODBC.
Первое что следует обязательно учесть это версия драйвера, для того чтобы всё корректно работало вам потребуется драйвер версии 3.51 (с драйвером 5-ой версии я пробился пол дня пытаясь хоть чего нибудь добиться, безрезультатно & поменял на предыдущую версию и всё заработало!
Для подключения используем вот такую строчку:
Код 1C v 8.х Соединение = "DRIVER=MySQL ODBC 3.51 Driver;Database=inventar_sm;DataSource=roman-book;UID=root;PWD=240580;STMT=set character_set_results=cp1251;";
//Это если задаём кодировку соединения (лучше задать);
Соединение = "DRIVER=MySQL ODBC 3.51 Driver;Database=inventar_sm;DataSource=roman-book;UID=root;PWD=240580;";
//Это без задания кодировки.
то касается кодировки то лучше её конечно задать, но на вставку записей в БД MySQL оно почемуто не влияет, и чтобы корректно всё отрабатывало и не выглядело кракозябриками после отработки скриптов, перед выполнением самих скриптов лучше выполнить вот такой вот скрипт «set names cp1251» в рамках соединения он правильно установит кодировку (так надёжнее).
Для работы с самой базой объявляем объект ADODB.Connection & это соединение с базой.
Для работы с данными можем объявить: ADODB.Recordset & для чтения данных, и ADODB.Command для изменения.
(ADODB.Command & не имеет метода ExecuteScalar, поэтому вместо него придётся обходить ся Recordset-ом и с его помощью выбирать данные, хотя возможно я чегото не доглядел).
Итак пример. Выбираем данные из таблицы:
Код 1C v 8.х Попытка
Connection = Новый COMОбъект("ADODB.Connection");
Connection.Open("DRIVER=MySQL ODBC 3.51 Driver;Database=inventar_sm;DataSource=roman-book;UID=root;PWD=240580;STMT=set character_set_results=cp1251;");
RS = Новый COMОбъект("ADODB.Recordset");
RS.CursorType=3;
// Запрос к базе на языке SQL запросов.
RS.ActiveConnection=Connection;
RS.Open("select * from market_users");
//Перемещаем указатель на первую запись.
RS.MoveFirst();
Пока RS.EOF()=0 Цикл
// Обрабатываем значения полей выборки.
NAM = RS.Fields("NAME").Value;
Сообщить(NAM);
// Перемещаем указатель.
RS.MoveNext();
КонецЦикла;
//Закрываем соединения.
RS.Close();
Connection.Close();
Теперь изменяем данные:
Код 1C v 8.х Connection = Новый COMОбъект("ADODB.Connection");
Connection.Open("DRIVER=MySQL ODBC 3.51 Driver;Database=inventar_sm;DataSource=roman-book;UID=root;PWD=240580;STMT=set character_set_results=cp1251;");
//Устанавливаем кодировку для нашего подключения (дополнительно)...
Command= new COMObject("ADODB.Command");
Command.CommandText = "set names cp1251";
Command.ActiveConnection = Connection;
Command.CommandType = 1;
Command.Execute();
//Теперь выполняем скрипт
Command= new COMObject("ADODB.Command");
Command.CommandText = "update market_cards set name='Хлебушек бородинский' where articul='123'";
Command.ActiveConnection = Connection;
Command.CommandType = 1;
Command.Execute();
//Закрываем соединение.
Connection.Close();
Все
Категория:
COM-объекты, WMI, WSH Как программно Изменить Отбор в отчете СКД Эта тема тоже достаточна распространена. Нюанс программного изменения отбора заключается в том, что коллекция:
Код 1C v 8.х КомпоновщикНастроек.Настройки.Отбор.Элементы
в отличие от аналогичной коллекции параметров, не имеет метода Найти(). Можно конечно изменять отбор «в лоб», т.е. по индексу, но это не есть хорошо. Самый оптимальный вариант,
обходить все поля отбора в цикле.
Приведу пример универсальной функции для изменения отбор компоновки данных:
Код 1C v 8.х //Ищет отбор в компоновщике настроек по параметрам, заданным через
//"СоответствиеПоискаОтбора", и заменяет
//на отбор с параметрами, указанными в "СоответствиеНовогоОтбора"
Процедура ИзменитьОтбор(ЭлементСтруктуры,
СоответствиеПоискаОтбора = Неопределено, СоответствиеНовогоОтбора) Экспорт
Если ТипЗнч(ЭлементСтруктуры) = Тип("КомпоновщикНастроекКомпоновкиДанных") Тогда
Отбор = ЭлементСтруктуры.Настройки.Отбор;
Иначе
Отбор = ЭлементСтруктуры;
КонецЕсли;
Если ТипЗнч(СоответствиеНовогоОтбора["ЛевоеЗначение"]) = Тип("Строка") Тогда
нПоле = Новый ПолеКомпоновкиДанных(СоответствиеНовогоОтбора.ЛевоеЗначение);
Иначе
нПоле = СоответствиеНовогоОтбора["ЛевоеЗначение"];
КонецЕсли;
Если СоответствиеНовогоОтбора.Получить("ВидСравнения") = Неопределено Тогда
нВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
Иначе
нВидСравнения = СоответствиеНовогоОтбора["ВидСравнения"];
КонецЕсли;
Если СоответствиеНовогоОтбора.Получить("Использование") = Неопределено Тогда
нИспользование = Истина;
Иначе
нИспользование = СоответствиеНовогоОтбора["Использование"];
КонецЕсли;
нЗначение = СоответствиеНовогоОтбора["Значение"];
ТолькоПоЛевомуЗначению = Ложь;
Если СоответствиеПоискаОтбора = Неопределено Тогда
ТолькоПоЛевомуЗначению = Истина;
КонецЕсли;
сЛевоеЗначение = СоответствиеПоискаОтбора.Получить("ЛевоеЗначение");
Если сЛевоеЗначение = Неопределено Тогда
сЛевоеЗначение = нПоле;
КонецЕсли;
сВидСравнения = СоответствиеПоискаОтбора.Получить("ВидСравнения");
Если ВидСравнения = Неопределено Тогда
сВидСравнения = ВидСравнения;
КонецЕсли;
сИспользование = СоответствиеПоискаОтбора.Получить("Использование");
Если сИспользование = Неопределено Тогда
сИспользование = нИспользование;
КонецЕсли;
Для каждого ЭлементОтбора Из Отбор.Элементы Цикл
Если ТолькоПоЛевомуЗначению Тогда
НайденныйОтбор = ЭлементОтбора;
Прервать;
Иначе
Если (ЭлементОтбора.ЛевоеЗначение = сЛевоеЗначение)
И (ЭлементОтбора.ВидСравнения = сВидСравнения)
И (ЭлементОтбора.Использование = сИспользование) Тогда
НайденныйОтбор = ЭлементОтбора;
Прервать;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Если НайденныйОтбор <> Неопределено Тогда
НайденныйОтбор.ЛевоеЗначение = нПоле;
НайденныйОтбор.Использование = нИспользование;
НайденныйОтбор.ВидСравнения = нВидСравнения;
НайденныйОтбор.ПравоеЗначение = нЗначение;
КонецЕсли;
КонецПроцедуры
Пример вызова процедуры:
Код 1C v 8.х СоответствиеПоискаОтбора = Новый Соответствие;
СоответствиеПоискаОтбора.Вставить("ЛевоеЗначение",Новый ПолеКомпоновкиДанных("Наименование"));
СоответствиеПоискаОтбора.Вставить("ВидСравнения",ВидСравненияКомпоновкиДанных.Содержит);
СоответствиеПоискаОтбора.Вставить("Использование",Истина);
СоответствиеНовогоОтбора = Новый Соответствие;
СоответствиеНовогоОтбора.Вставить("ЛевоеЗначение",Новый ПолеКомпоновкиДанных("Наименование"));
СоответствиеНовогоОтбора.Вставить("ВидСравнения",ВидСравненияКомпоновкиДанных.Содержит);
СоответствиеНовогоОтбора.Вставить("Использование",Истина);
СоответствиеНовогоОтбора.Вставить("Значение","бла-бла-бла");
ИзменитьОтбор(КомпоновщикНастроек,СоответствиеПоискаОтбора,СоответствиеНовогоОтбора);
Автор:
also Категория:
Схема Компоновки Данных