Что имею: 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: Если для уточнений нужны еще листинги - сообщите какие.