Интеграция 1С:Предприятие 7.7 с внешними сервисами через SQL-шлюз — это классическая задача, которая часто сопровождается техническими сложностями, особенно при работе на современных 64-битных операционных системах. В этой статье мы разберем процесс подключения к шлюзу TurboSMS через MySQL ODBC драйвер, проанализируем типичные ошибки соединения и выясним, как правильно передавать кириллический текст, чтобы избежать появления «кракозябров».
Первое и самое важное правило при работе с 1С 7.7 на 64-битной ОС: 1С 7.7 является 32-битным приложением. Это означает, что для работы любых внешних компонент или драйверов баз данных (ODBC) вам необходимо использовать исключительно 32-битные версии программного обеспечения. Даже если ваша Windows 10 или Server 2019 имеет разрядность x64, для 1С нужно скачивать и устанавливать MySQL ODBC Driver 32-bit (x86).
Рассмотрим важный нюанс настройки: если вы планируете создавать системный источник данных (DSN), стандартный «Администратор источников данных ODBC» из панели управления может вам не подойти, так как он по умолчанию открывает 64-битную версию. Для настройки 32-битных драйверов запустите утилиту вручную по адресу: C:\Windows\SysWOW64\odbcad32.exe.
Если при попытке открыть соединение Соединение.Open(СтрокаСоединение) вы получаете ошибку 10060, это сигнализирует о невозможности установить сетевой контакт с сервером. Проанализируем основные причины:
94.249.146.189 или доменное имя sql.turbosms.ua.3306. Убедитесь, что ваш брандмауэр и офисный роутер разрешают исходящие соединения на этот порт.После того как связь с сервером установлена, может возникнуть ошибка Access denied for user.... Важно понимать, что TurboSMS ограничивает доступ к своей базе данных не только логином и паролем, но и белым списком IP-адресов. Разберем шаги для исправления:
Зайдите в личный кабинет TurboSMS в раздел настроек SQL-подключения. Там обязательно нужно добавить ваш внешний IP-адрес в список разрешенных. Без этой манипуляции сервер будет сбрасывать авторизацию, даже если логин и пароль в коде указаны верно.
Одной из самых сложных задач в 1С 7.7 является работа с кодировкой UTF-8, которую ожидает сервер MySQL. По умолчанию 1С работает в кодировке Windows-1251. Если просто отправить текст, получатель увидит нечитаемые символы. Проанализируем два способа решения.
Способ 1: Использование функции преобразования. Мы можем вручную перекодировать каждый символ строки в формат UTF-8 перед вставкой в SQL-запрос. Посмотрим на пример такой функции:
Функция ПреобразоватьСтрокуВУТФ8(Стр) Экспорт
Длина=СтрДлина(Стр);
Итог="";
Для Н=1 По Длина Цикл
Знак=Сред(Стр,Н,1);
Код=КодСимв(Знак);
Если Код < 128 Тогда
Итог=Итог+Знак;
Иначе
Если (Код >= КодСимв("А")) И (Код <= КодСимв("п")) Тогда
Итог=Итог+Симв(208)+Симв(144+Код-КодСимв("А"));
ИначеЕсли (Код >= КодСимв("р")) И (Код <= КодСимв("я")) Тогда
Итог=Итог+Симв(209)+Симв(128+Код-КодСимв("р"));
ИначеЕсли (Знак="ё") Тогда
Итог=Итог+Симв(209)+Симв(145);
ИначеЕсли (Знак="Ё") Тогда
Итог=Итог+Симв(208)+Симв(129);
КонецЕсли;
КонецЕсли;
КонецЦикла;
Возврат Итог;
КонецФункции
Способ 2: Настройка драйвера ODBC (рекомендуемый). Вместо сложных функций перекодирования в 1С, мы можем заставить сам драйвер MySQL выполнять конвертацию. Для этого в строку соединения необходимо добавить специальный параметр инициализации stmt=SET NAMES 'utf8';.
Сведем все полученные знания в единую функцию, которую можно разместить в Глобальном модуле вашей конфигурации. Проанализируем структуру строки соединения и метод выполнения запроса.
Функция ОтправитьТурбоСМС(Номер, ТекстСМС, Подпись = "MAGAZIN") Экспорт
// Создаем объект подключения через ADO
Соединение = СоздатьОбъект("ADODB.Connection");
// Формируем строку соединения с учетом актуального IP и кодировки
// Используем драйвер версии 3.51 (наиболее стабильный для 7.7)
Сервер = "94.249.146.189";
База = "users";
Логин = "ВашЛогин";
Пароль = "ВашПароль";
СтрокаСоединения = "DRIVER={MySQL ODBC 3.51 Driver};SERVER=" + Сервер +
";DataBase=" + База + ";UID=" + Логин +
";PWD=" + Пароль + ";stmt=SET NAMES 'utf8';";
// Устанавливаем таймауты, чтобы 1С не зависала при сбоях связи
Соединение.ConnectionTimeout = 15;
Соединение.CommandTimeout = 30;
Попытка
Соединение.Open(СтрокаСоединения);
Исключение
Сообщить("Ошибка подключения к шлюзу TurboSMS: " + ОписаниеОшибки());
Возврат 0;
КонецПопытки;
// Формируем SQL запрос на вставку записи в таблицу сообщений
// Имя таблицы обычно совпадает с логином пользователя
ТекстЗапроса = "INSERT INTO " + Логин + " (number, sign, message)
|VALUES ('" + СокрЛП(Номер) + "', '" + СокрЛП(Подпись) + "', '" + СокрЛП(ТекстСМС) + "')";
Попытка
Соединение.Execute(ТекстЗапроса);
Соединение.Close();
Возврат 1; // Успешно отправлено в очередь
Исключение
Сообщить("Ошибка выполнения SQL-запроса: " + ОписаниеОшибки());
Соединение.Close();
Возврат 0;
КонецПопытки;
КонецФункции
При эксплуатации данной системы обратите внимание на следующие моменты:
sign должно содержать только ту подпись, которая прошла модерацию в вашем кабинете TurboSMS. Если указать произвольное имя, сообщение может быть принято базой, но не будет отправлено абоненту.Таким образом, мы выяснили, что для успешной работы достаточно правильно выбрать разрядность драйвера, разрешить доступ по IP и корректно инициализировать сессию UTF-8 в строке подключения ADODB.Connection.