Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Горячая тема (более 10 ответов) Хранимые процедуры MySQL из 1С (число прочтений - 7409 )
simply
God Member
*****
Отсутствует


Мечта: избавиться от 1С

Сообщений: 573
Местоположение: Киев
Зарегистрирован: 31. Декабря 2008
Пол: Мужской
Хранимые процедуры MySQL из 1С
17. Ноября 2009 :: 14:16
Печать  
Всем привет!
Ни кто не пользует хранимые процедуры и функции MySQL из 1С?
Как их вызвать? Поделитесь опытом, кто может!

Заранее признателен!
  
Наверх
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Хранимые процедуры MySQL из 1С
Ответ #1 - 17. Ноября 2009 :: 16:46
Печать  
Если речь об MS SQL
то exec имя процедуры <параметры через запятую>
например
Код
Выбрать все
	rc = СоздатьОбъект("ODBCRecordSet");
	Стр1 = "EXEC dbo.get_plategi 1,2,3";
	Попытка
		ТЗ = rc.ВыполнитьИнструкцию(Стр1);
	Исключение
		Сообщить("Ошибка  get_plategi !!!");
	КонецПопытки;
	rc.Закрыть();
 



Если все же речь об MySQL то не знаю.
  
Наверх
 
IP записан
 
simply
God Member
*****
Отсутствует


Мечта: избавиться от 1С

Сообщений: 573
Местоположение: Киев
Зарегистрирован: 31. Декабря 2008
Пол: Мужской
Re: Хранимые процедуры MySQL из 1С
Ответ #2 - 18. Ноября 2009 :: 08:12
Печать  
Спасибо за попытку.
Но работа с MySQL отличается от 1С+MSSQL.
  
Наверх
IP записан
 
simply
God Member
*****
Отсутствует


Мечта: избавиться от 1С

Сообщений: 573
Местоположение: Киев
Зарегистрирован: 31. Декабря 2008
Пол: Мужской
Re: Хранимые процедуры MySQL из 1С
Ответ #3 - 18. Ноября 2009 :: 08:28
Печать  
Вопрос снимается. Всем спасибо!
Решение как всегда простое, после того как лбом настучишься Улыбка.

Если кому интересно, обращайтесь.
  
Наверх
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Хранимые процедуры MySQL из 1С
Ответ #4 - 18. Ноября 2009 :: 08:58
Печать  
simply писал(а) 18. Ноября 2009 :: 08:12:
Спасибо за попытку.
Но работа с MySQL отличается от 1С+MSSQL.

Да  но помоему в MySQL нет хранимых процедур.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Хранимые процедуры MySQL из 1С
Ответ #5 - 18. Ноября 2009 :: 09:00
Печать  
simply писал(а) 18. Ноября 2009 :: 08:28:
Вопрос снимается. Всем спасибо!
Решение как всегда простое, после того как лбом настучишься Улыбка.

Если кому интересно, обращайтесь.

Раз уж разобрался с чем-то то выкладывай сюда в ветку
и задачу и решение - может кому и пригодится.
  
Наверх
 
IP записан
 
simply
God Member
*****
Отсутствует


Мечта: избавиться от 1С

Сообщений: 573
Местоположение: Киев
Зарегистрирован: 31. Декабря 2008
Пол: Мужской
Re: Хранимые процедуры MySQL из 1С
Ответ #6 - 18. Ноября 2009 :: 09:01
Печать  
Z1 писал(а) 18. Ноября 2009 :: 08:58:
Да  но помоему в MySQL нет хранимых процедур.

Начиная с 5.0.3 по стандарту SQL 2003.
  
Наверх
IP записан
 
simply
God Member
*****
Отсутствует


Мечта: избавиться от 1С

Сообщений: 573
Местоположение: Киев
Зарегистрирован: 31. Декабря 2008
Пол: Мужской
Re: Хранимые процедуры MySQL из 1С
Ответ #7 - 18. Ноября 2009 :: 09:03
Печать  
Z1 писал(а) 18. Ноября 2009 :: 09:00:
Раз уж разобрался с чем-то то выкладывай сюда в ветку
и задачу и решение - может кому и пригодится.

Улыбка хорошо, только подробно прийдется. Ведь в своем вопросе я даже проблему не конкретизировал.
Приступаю ...
  
Наверх
IP записан
 
simply
God Member
*****
Отсутствует


Мечта: избавиться от 1С

Сообщений: 573
Местоположение: Киев
Зарегистрирован: 31. Декабря 2008
Пол: Мужской
Re: Хранимые процедуры MySQL из 1С
Ответ #8 - 18. Ноября 2009 :: 10:11
Печать  
Что имею:
   1. MySQL сервер 5.1.40 в офисе и во всех магазинах (с реплицируюемыми глобальными базами)
   2. 1С-Рарус:Магазин 7.7 во всех магазинах
   3. MySQL ODBC 5.1 Driver на каждом ПК (не 3.51)
   4. В MySQL имеется глобальная таблица с перечнем используемых мною внешних обработок. Ее стурктура: <Имя ERT>, <актуальный MD5>, <Сам файл>.
   5. В глобальном модуле 1С - предопределенную процедуру "ПриЗагрузкеВнешнегоОтчета(ИмяФайлаОбработки)" и
Код
Выбрать все
Перем Conn Экспорт;
Перем Rst Экспорт;
...
Conn=CreateObject("ADODB.Connection"); // для записи и выполнения
Rst=CreateObject("ADODB.Recordset"); // для быстрого получения 



Задача:
 Проверить имя внешней обработки и ее МД5 в MySQL, и если не совпадает (старая, битая, прочее) - получить из MySQL, сохранить и запустить на выполнение.
 Все проверки необходимо сделать на MySQL-сервере, а в 1С использовать минимальное количество обращений к MySQL. Идеально - только одно.

Решение, вариант 1:
   1. В MySQL хранимая процедура имеет два входящих параметра: <ИмяОбработки>, <ее МД5>, и два исходящих параметра: <Результат (ok, no)>, и <сам файл, если не 'ок'>.
   2. В 1С:
Код
Выбрать все
Процедура ПриЗагрузкеВнешнегоОтчета(ИмяФайлаОтчета)
	МдФайла=глСервис.ПолучитьХэшМД5(ИмяФайлаОтчета,1);
	Conn.Execute("CALL <base>.<procedure>('"+ИмяФайлаОтчета+"','"+МдФайла+"',@result,@file);");
	Rst.Open("SELECT @result,@file;",Conn,0,1);
        // дальше идет получение из Rst
        ...
КонецПроцедуры // ПриЗагрузкеВнешнегоОтчета(ИмяФайлаОтчета) 


Недостатки: два обращения к MySQL, плюс - переменные сессии ...

Решение, вариант 2:
   1. В MySQL хранимая процедура имеет только два входящих параметра: <ИмяОбработки>, <ее МД5>. <Результат> и <файл> создаются как внутренние переменные процедуры.
   2. В конце хранимой процедуры для возврата результатов дописываю простой SELECT с именами внутренних переменных
Код
Выбрать все
...
SELECT result_, file_; 


   3. В 1С получается только одно обращение к MySQL:
Код
Выбрать все
Процедура ПриЗагрузкеВнешнегоОтчета(ИмяФайлаОтчета)
	МдФайла=глСервис.ПолучитьХэшМД5(ИмяФайлаОтчета,1);
	Rst.Open("CALL <base>.<procedure>('"+ИмяФайлаОтчета+"','"+МдФайла+"');",Conn,0,1);
        // дальше идет получение из Rst
        ...
КонецПроцедуры // ПриЗагрузкеВнешнегоОтчета(ИмяФайлаОтчета) 



Моя проблема заключалась в том, что не получалось сделать 2-й вариант.

P.S.: Конечно же все ".Execute" и ".Open" выполняются в глобальных функциях с проверками и получением ошибок, при необходимости. Но я их не указываю, т.к. всю работу с MySQL буду переносить в отдельный класс.
P.S.2: Если для уточнений нужны еще листинги - сообщите какие.
« Последняя редакция: 18. Ноября 2009 :: 11:18 - simply »  
Наверх
IP записан
 
leov-001
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 150
Зарегистрирован: 05. Марта 2009
Re: Хранимые процедуры MySQL из 1С
Ответ #9 - 18. Ноября 2009 :: 11:21
Печать  
Дык без КОННЕКТА ты ничего и не получишь.
  
Наверх
 
IP записан
 
simply
God Member
*****
Отсутствует


Мечта: избавиться от 1С

Сообщений: 573
Местоположение: Киев
Зарегистрирован: 31. Декабря 2008
Пол: Мужской
Re: Хранимые процедуры MySQL из 1С
Ответ #10 - 18. Ноября 2009 :: 11:30
Печать  
leov-001 писал(а) 18. Ноября 2009 :: 11:21:
Дык без КОННЕКТА ты ничего и не получишь.

дык я и не собирался Улыбка

Когда обращался за помощью, создавая эту тему, то не знал КАК организовать хранимую процедуру и обращение к ней из 1С, чтобы за один раз все отдать и все получить.
  
Наверх
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Хранимые процедуры MySQL из 1С
Ответ #11 - 18. Ноября 2009 :: 11:40
Печать  
кстати есть внешняя компонента 1c  для подключения к mysql-серверам.
может с ее помощью будет удобней  ( или быстрей )работать с mysql.
http://serguey.hotbox.ru/    ( она также есть на  инфостарт и клубе профессионалов )
  
Наверх
 
IP записан
 
simply
God Member
*****
Отсутствует


Мечта: избавиться от 1С

Сообщений: 573
Местоположение: Киев
Зарегистрирован: 31. Декабря 2008
Пол: Мужской
Re: Хранимые процедуры MySQL из 1С
Ответ #12 - 18. Ноября 2009 :: 12:03
Печать  
Z1 писал(а) 18. Ноября 2009 :: 11:40:
кстати есть внешняя компонента 1c  для подключения к mysql-серверам.
может с ее помощью будет удобней  ( или быстрей )работать с mysql.
http://serguey.hotbox.ru/    ( она также есть на  инфостарт и клубе профессионалов )

Спасибо!
Очень любопытно! Посмотрю обязательно!

P.S.: скоростю работы через ОДБС 5.1 я очень доволен. Самый худший результат обработки 5-и тыс. чеков - 19 сек. 0.17 сек. - на сам запрос, а все остальное - на формирование отчета в 1С.
  
Наверх
IP записан
 
simply
God Member
*****
Отсутствует


Мечта: избавиться от 1С

Сообщений: 573
Местоположение: Киев
Зарегистрирован: 31. Декабря 2008
Пол: Мужской
Re: Хранимые процедуры MySQL из 1С
Ответ #13 - 24. Ноября 2009 :: 13:58
Печать  
Все таки через ODBC драйвер мне больше по-сердцу. Возможностей больше, все что сам захочу. Решил сделать свой класс.

Вот последний вариант хранимой процедуры:
Код
Выбрать все
CREATE DEFINER = '<admin>'@'%' PROCEDURE <database>.<procedure>(IN nm_ VARCHAR(30), IN md_ VARCHAR(32))
  READS SQL DATA
BEGIN
  DECLARE result_ VARCHAR(2);
  DECLARE file_   MEDIUMBLOB;
  DECLARE _md5    VARCHAR(32);
  DECLARE _name   VARCHAR(30);

  SELECT name, md5, file INTO _name, _md5, file_ FROM FILES.ert WHERE name = nm_;
  IF _name IS NULL THEN
    SET result_ := 'nf'; SET file_ := NULL;   /* нет такого файла */
  ELSE
    IF _md5 = md_ THEN
      SET result_ := 'ok'; SET file_ := NULL; /* все в порядке */
    ELSE
      SET result_ := 'no';
    END IF;
  END IF;

  SELECT result_, file_;
END 

  
Наверх
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать