Имя: Пароль:
1C
1С v8
Смс Рассылка с 1с 8.1
,
0 Gadin_V
 
08.11.13
10:44
делаю смс рассылку по данному методу первый раз, раньше с этим не сталкивался,делаю как внешнюю обработку постоянно выдает ошибку на
СМСХмл.НачатьПодготовку("data"); или на  СМСХмл.ДобавитьНоду("login", Логин, "", "");
Перем СМСХмл;
Перем КаталогБазы Экспорт;

Функция КаталогБазы() Экспорт
    Стр=СтрокаСоединенияИнформационнойБазы();
    Возврат(Сред(Стр,7,СтрДлина(Стр)-8)+"\");
КонецФункции

//Блок работы с СМС

Процедура ПодготовитьСМСХмл()
    Логин="aaa";
    Пароль="sss";
    СМСХмл.НачатьПодготовку("data");
    СМСХмл.ДобавитьНоду("login", Логин, "", "");
    СМСХмл.ДобавитьНоду("password", Пароль, "", "");
    СМСХмл.ДобавитьНоду("app", "1C", "", "");
КонецПроцедуры

Функция СоздатьСМСХмл() Экспорт
    Файл=Новый Файл(ЭтотОбъект.ИспользуемоеИмяФайла);
    Попытка
        ЗагрузитьВнешнююКомпоненту(КаталогБазы+"SMSXml.dll");
        СМСХмл = Новый("Addin.SMSXml");
    Исключение
        Сообщить("Внешняя компонента SMSXml.dll не загружена. "+ОписаниеОшибки());
        СМСХмл="";
        Возврат (Неопределено);
    КонецПопытки;

    ПодготовитьСМСХмл();
    Возврат(СМСХмл);
КонецФункции

Функция ЗапросБалансаСМС() Экспорт
    ПодготовитьСМСХмл();
    Рез=СМСХмл.Пост("https://transport.sms-pager.com:7214/balance.xml";);

    Если Рез<>"1" тогда
    //Если СМСХмл.Пост("https://transport.sms-pager.com:7214/balance.xml")<>"1"; тогда

        Сообщить("Ошибка при передаче запроса");
        Возврат("");
    КонецЕсли;    
        
    Если СМСХмл.ПолучитьНоду("code","")="1" тогда
        Возврат(СМСХмл.ПолучитьНоду("account",""));
    КонецЕсли;
    Сообщить(СМСХмл.ПолучитьНоду("descr",""));
    Возврат("");
КонецФункции

Функция ОтчетСМС(НачПериода='00010101000000', КонПериода='00010101000000') Экспорт
    Если НачПериода > КонПериода тогда
        Сообщить("Ошибка. Начало периода больше конца периода");
        Возврат(Неопределено);
    КонецЕсли;    
    
    ПодготовитьСМСХмл();
    
    Если ЗначениеЗаполнено(НачПериода) или ЗначениеЗаполнено(КонПериода) тогда
        СМСХмл.ДобавитьНоду("start",Формат(НачПериода,"ДФ='yyyy-MM-dd'"),"","");
        СМСХмл.ДобавитьНоду("stop",Формат(КонПериода,"ДФ='yyyy-MM-dd'"),"","");
    КонецЕсли;    
            
    Если СМСХмл.Пост("https://transport.sms-pager.com:7214/report.xml")<>"1"; тогда

        Сообщить("Ошибка при передаче");
        Возврат(Неопределено);
    КонецЕсли;    
        
    Если СМСХмл.ПолучитьНоду("code","")<>"1" тогда
        Сообщить(СМСХмл.ПолучитьНоду("descr",""));
        Возврат(Неопределено);
    КонецЕсли;
        
    Если СМСХмл.ЗадатьРодительскуюНоду("data")<>"1" тогда
        Сообщить("Пришел не тот ответ, родительская нода не найдена");
        Возврат(Неопределено);
    КонецЕсли;
    
    //Готовим список рассылок

    ТЗ = новый ТаблицаЗначений;
    ТЗ.Колонки.Добавить("ДатаВремя",,"Дата / Время",15);
    ТЗ.Колонки.Добавить("Всего",,"Всего СМС",6);
    ТЗ.Колонки.Добавить("Доставлено",,"Доставлено",6);
    ТЗ.Колонки.Добавить("НЕДоставлено",,"Не Доставлено",6);
    ТЗ.Колонки.Добавить("ВОжидании",,"Ожидание",6);
    ТЗ.Колонки.Добавить("Вочереди",,"Очередь",6);
    ТЗ.Колонки.Добавить("Текст",,"Текст СМС",100);
    ТЗ.Колонки.Добавить("ИД",,,1);
    Для Сч=0 по СМСХмл.КоличествоДетей-1 цикл
        ИмяН = СМСХмл.ЗадатьДочернююНоду(Сч,"");
        Если ИмяН="sms" тогда
            СтрТЗ = тз.Добавить();
            СтрТЗ.ДатаВремя = СМСХмл.ПолучитьДочернююНоду("datetime","",-1);
            СтрТЗ.ИД = СМСХмл.ПолучитьДочернююНоду("smsid","",-1);
            СтрТЗ.Текст = СМСХмл.ПолучитьДочернююНоду("text","",-1);
            СтрТЗ.Всего = СМСХмл.ПолучитьДочернююНоду("allCol","",-1);
            СтрТЗ.Доставлено = СМСХмл.ПолучитьДочернююНоду("deliveredCol","",-1);
            СтрТЗ.НЕДоставлено = СМСХмл.ПолучитьДочернююНоду("notDeliveredCol","",-1);
            СтрТЗ.ВОжидании = СМСХмл.ПолучитьДочернююНоду("waitingCol","",-1);
            СтрТЗ.Вочереди = СМСХмл.ПолучитьДочернююНоду("enqueuedCol","",-1);
        КонецЕсли;
    КонецЦикла;
    СтрТЗ=ТЗ.ВыбратьСтроку("Для получения подробной информации - выберите рассылку");
    Если СтрТЗ=Неопределено Тогда
        Возврат(ТЗ);
    КонецЕсли;    
    
    //Готовим детали по выбранной рассылке

    //тут нужна повторная инициализация

    ПодготовитьСМСХмл();
    
    Рез=СМСХмл.ДобавитьНоду("smsid", СтрТЗ.ИД,"","");    
    Рез = СМСХмл.Пост("https://transport.sms-pager.com:7214/report.xml";);

    
    Если Рез<>"1" тогда
        Сообщить("Произошла ошибка при передаче");
        Возврат(Неопределено);
    КонецЕсли;    
        
    Если СМСХмл.ПолучитьНоду("code","")<>"1" тогда
        Сообщить("Ошибка="+СМСХмл.ПолучитьНоду("descr",""));
        Возврат(Неопределено);
    КонецЕсли;    
        
    //Переводы

    СЗРус = Новый СписокЗначений;
    СЗРус.Добавить("delivered","Доставлено:");
    СЗРус.Добавить("notDelivered","Не доставлено:");
    СЗРус.Добавить("waiting","В ожидании:");
    СЗРус.Добавить("enqueued","В очереди:");
    СЗРус.Добавить("cancel","Прекращено:");
    СЗРус.Добавить("onModer","На модерации:");
    
    СЗ = Новый СписокЗначений;
    
    СМСХмл.ЗадатьРодительскуюНоду("data");
    Для К=0 По СМСХмл.КоличествоДетей-1 Цикл
        Если СМСХмл.ЗадатьДочернююНоду(К,"")<>"detail" тогда Продолжить; КонецЕсли;
        
        Для Л=0 по СМСХмл.КоличествоДетей1-1 цикл
            Рез = СМСХмл.ЗадатьДочернююНоду1(Л,"");
            Представление=СЗРус.НайтиПоЗначению(Рез);
            Если Представление=Неопределено тогда Представление=Рез; КонецЕсли;
            СтрСЗ = СЗ.Добавить(Представление);
            Для М=0 По СМСХмл.КоличествоДетей2-1 Цикл
                СтрСЗ = СЗ.Добавить(СМСХмл.ПолучитьДочернююНоду1(М,""));
            КонецЦикла;    
        КонецЦикла;    
    КонецЦикла;
    СЗ.ВыбратьЭлемент();
КонецФункции

Функция ОтослатьСМС(СЗ, ДатаОтправки='00010101000000', ОплатаТолькоЗаДоставленные=Ложь, Спрашивать=Ложь) Экспорт
    Подпись="ddd";

    ПодготовитьСМСХмл();

    СМСХмл.ДобавитьНоду("source",Подпись,"","");
    СМСХмл.ДобавитьНоду("onlydelivery",?(ОплатаТолькоЗаДоставленные,"1","0"),"","");
    Если ЗначениеЗаполнено(ДатаОтправки) тогда
        СМСХмл.ДобавитьНоду("datetime",Формат(ДатаОтправки,"ДФ='yyyy-MM-dd HH:mm:ss'"),"","");
    КонецЕсли;

    //Формируем телефоны и текст

    Для Каждого СтрСЗ Из СЗ Цикл
        Для Каждого Тел Из СтрСЗ.Значение Цикл
            СМСХмл.ДобавитьНоду("to",СтрСЗ.Представление,"number",Тел.Значение);
        КонецЦикла;    
    КонецЦикла;    

    //Если нужно спрашивать, то выводим инфу по количеству и цене рассылки

    Если Спрашивать тогда
        Если Не Отсылать(СМСХмл) тогда
            Сообщить("Оператор отказался от рассылки");
            Возврат (Ложь);
        КонецЕсли;    
    КонецЕсли;

    //Отсылаем

    СМСХмл.ДобавитьНоду("action","send","","");
    Результат = СМСХмл.Пост("https://transport.sms-pager.com:7214/send.xml";);

    Если Результат<>"1" тогда
        Возврат(Ложь);
    КонецЕсли;
    Возврат(Истина);
КонецФункции

Функция Отсылать(СМСХмл)
    СМСХмл.ДобавитьНоду("action","check","","");
    Результат = СМСХмл.Пост("https://transport.sms-pager.com:7214/send.xml";);

    Если Результат<>"1" тогда
        Сообщить("Произошла ошибка при передаче Результат="+Результат);
        Возврат(Результат);
    КонецЕсли;
    Если СМСХмл.ПолучитьНоду("code","")<>"1" тогда
        Сообщить("Ошибка в ответе="+СМСХмл.ПолучитьНоду("descr",""));
        Возврат(Ложь);
    КонецЕсли;    
    ВсегоПолучателей=СокрЛП(СМСХмл.ПолучитьНоду("allRecivers",""));
    ЦенаРассылки=СокрЛП(СМСХмл.ПолучитьНоду("priceOfSending",""));
    ТекстОтвета = "Всего получателей=" + ВсегоПолучателей+"  Цена рассылки="+ЦенаРассылки+" Вы действительно хотите отправить?";
    Если Вопрос(ТекстОтвета,РежимДиалогаВопрос.ДаНет)=КодВозвратаДиалога.Нет тогда
        Возврат(Ложь);
    КонецЕсли;
    Возврат(Истина);
КонецФункции

//Блок работы с Емайл

Функция ПодключитсяКПочте() Экспорт
    Логин="qqq";
    Пар="eeee";    
    ИПП = Новый ИнтернетПочтовыйПрофиль;
    ИПП.АдресСервераSMTP = "smtp.yandex.ru";
    ИПП.ВремяОжидания = 20;
    ИПП.Пользователь = Логин;
    ИПП.Пароль = Пар;
    ИПП.ПользовательSMTP=Логин;
    ИПП.ПарольSMTP = Пар;
    ИПП.ПортSMTP = "25";
    ИПП.АутентификацияSMTP=СпособSMTPАутентификации.ПоУмолчанию;
    
    Почта = Новый ИнтернетПочта;
    Почта.Подключиться(ИПП);
    Возврат(Почта);
КонецФункции

Функция СоздатьСообщение(Получатели,Тема, Текст, Файлы) Экспорт
    ЕмайлОтправителя="[email protected]";
    Сообщение = Новый ИнтернетПочтовоеСообщение;
    Для Каждого Получатель из Получатели Цикл
        Если Получатель.Значение="" тогда Продолжить;КонецЕсли;
        Сообщение.Получатели.Добавить(Получатель.Значение);
    КонецЦикла;
    Сообщение.Отправитель.Адрес = ЕмайлОтправителя;
    Сообщение.Тема = Тема;
    //Сообщение.Тексты.Добавить(Текст);

    Сообщение.Тексты.Добавить(Текст);
    Для Каждого Файл из Файлы Цикл
        //Вложение = Новый ДвоичныеДанные(Файл);

        //Сообщение.Вложения.Добавить(Вложение,"attach.txt");

        Сообщение.Вложения.Добавить(Файл);
    КонецЦикла;    
    Возврат(Сообщение);
КонецФункции    
    
Вызовы в форме

//Блок работы с СМС


Процедура РазослатьСМС()
    СЗ=Новый СписокЗначений;
    Для Каждого СтрТЗ из ТЗДолжники Цикл
        СЗТел=Новый СписокЗначений;
        ЗаполнитьСпискиКонтактов(СтрТЗ);
        Для Каждого СтрСМС из СМС ЦИкл
            СЗТел.Добавить(СтрСМС.Значение);
        КонецЦикла;    
        СЗ.Добавить(СЗТел,"Погасите задолженность.Сумма(руб)"+СтрТЗ.ТекущийДолг+".Срок долга(дни)"+
        Вычислить(НачалоДня(ТекущаяДата())-НачалоДня(Мин(СтрТЗ.Долг30,СтрТЗ.Долг60, СтрТЗ.Долг90))/86400)+".Тел.:53813");
    КонецЦикла;        
    //ОтослатьСМС(СЗ, ДатаОтправки='00010101000000', ОплатаТолькоЗаДоставленные=Ложь, Спрашивать=Ложь)    

    ОтослатьСМС(СЗ);
КонецПроцедуры

Процедура БалансСМС()
    Сообщить(ЗапросБалансаСМС());
КонецПроцедуры

Процедура ПолучитьОтчетСМС()
    ТЗ=ОтчетСМС();
КонецПроцедуры
2 BuHu
 
08.11.13
10:46
(0)что в ошибке предлагаешь угадать?
3 Gadin_V
 
08.11.13
10:47
Значение не является значением объектного типа (НачатьПодготовку)
    СМСХмл.НачатьПодготовку("data");
4 Wobland
 
08.11.13
10:48
(3) так и должно быть, не пугайся
5 Gadin_V
 
08.11.13
10:48
тот же самый алгорит реализован через регламентные задание...там все ок.. а через внешнюю обработку error
6 BuHu
 
08.11.13
10:52
(5) а где Функция СоздатьСМСХмл() вызываешь?
7 Wobland
 
08.11.13
10:55
(6) до объявления переменной
8 BuHu
 
08.11.13
10:57
(7) он по моему вобще ее нигде не вызывает
9 Wobland
 
08.11.13
10:57
(8) да пофих. мож, его и так устраивает, и он просто хвастается
10 Gadin_V
 
08.11.13
11:00
вызывал при отправки смс, сначала  СоздатьСМСХмл() но и тут у меня ступор возник!т.е. отдельно где то хранится этот файл на компе куда записывается номер телефона текст и т.д.?
11 BuHu
 
08.11.13
11:03
(10)Чё?
12 Gadin_V
 
08.11.13
11:04
ладно допру сам!
13 Gadin_V
 
18.11.13
13:05
кто может подсказать в чем проблема? делаю отправку смс через sms-uslugi.ru все вроде работает проверки все проходит пишет смс отправлено а до телефона не доходит и на сайте бесплатные смс не уменьшаются, хотя баланс проверяет!

Функция СоздатьСМС() Экспорт
    
    Файл=Новый Файл("SMS.dll");
    Попытка
        ЗагрузитьВнешнююКомпоненту("SMS.dll");
    Исключение
        Сообщить("Внешняя компонента SMS.dll не загружена. "+ОписаниеОшибки());
        Возврат Неопределено;
    КонецПопытки;
    СМС = Новый("Addin.SMSXml");
    ПодготовитьСМС();
    Возврат(СМС);
КонецФункции



Функция ОтправитьСМС(Знач НомерСМС, ТекстСМС,СлучайноеЧисло) Экспорт
    СоздатьСМС();
    ЕстьОшибка = Ложь;
    Если СМС = -1 Тогда
        СоздатьСМС();
        Если СМС = -1 Тогда
            Сообщить("Не получилось подключить компоненту");
            ЕстьОшибка = Истина;
        КонецЕсли;
    КонецЕсли;    
    
    ПолучитьСлучайноеЧисло(СлучайноеЧисло);
    Константы.ПарольСМС.Установить(СлучайноеЧисло);
    
    ТекстСМС = СлучайноеЧисло;
    НомерСМС = НомерТел1;
    
    Константы.ПользовательСМС.Установить(ПользовательСМС1);
    Константы.НомерТел.Установить(НомерТел1);
    Константы.ПарольСМС.Установить(ПарольСМС1);
    
    ЕстьОшибка = Ложь;
    Если СМС = -1 Тогда
        Сообщить("Не получилось подключить компоненту");
        ЕстьОшибка = Истина;
    КонецЕсли;
    
    Если (СтрДлина(СокрЛП(НомерСМС)) <> 11) И СтрДлина(СокрЛП(НомерСМС)) <> 12 Тогда
        Сообщить("Не верный формат номера " + НомерСМС);
        ЕстьОшибка = Истина;
    КонецЕсли;
    
    Если Константы.НомерТел.Получить() = "" Тогда
        Сообщить("В настройках не указан пользователь для отправки СМС");
        ЕстьОшибка = Истина;
    КонецЕсли;

    
    Если Константы.ПользовательСМС.Получить() = "" Тогда
        Сообщить("В настройках не указан пользователь для отправки СМС");
        ЕстьОшибка = Истина;
    КонецЕсли;
    
    Если ЕстьОшибка Тогда
        Возврат Ложь;
    КонецЕсли;
    
    ПодготовитьСМС();
    
    //СМС.НачатьПодготовку("data");
    //СМС.ДобавитьНоду("login", Логин,"","");
    //СМС.ДобавитьНоду("password", Пароль,"","");
    //СМС.ДобавитьНоду("app", "1C","","");
    
//    рез = СМС.Пост("https://transport.sms-pager.com:7214/balance.xml";);
//    рез = СМС.Пост("https://transport.sms-pager.com:7214/report.xml";);
//    рез = СМС.Пост("https://transport.sms-pager.com:7214/payment.xml";);
//    рез = СМС.Пост("https://transport.sms-pager.com:7214/source.xml";);

    рез = СМС.Пост("https://transport.sms-pager.com:7214/send.xml";);

Если рез = "1" Тогда
    Сообщить("СМС с кодом отправленно на номер " + НомерСМС);
Иначе
    Сообщить("Смс на номер "+ НомерСМС +" Не отправленно");
КонецЕсли;
    
    Возврат Истина;    

КонецФункции

Процедура ПодготовитьСМС()
    
    Логин="testerzoloto";
    Пароль="tester";
    СМС.НачатьПодготовку("data");
    СМС.ДобавитьНоду("login", Логин, "", "");
    СМС.ДобавитьНоду("password", Пароль, "", "");
    СМС.ДобавитьНоду("app", "1C", "", "");
конецпроцедуры    



Процедура Баланс(Кнопка)
    // Вставить содержимое обработчика.
    Если СМС=-1 тогда
        цв = новый Цвет(255,0,0);
        ЭлементыФормы.СтатусСтрока.ЦветТекста = цв;
        СтатусСтрока = "Компонента не подключена, работа не возможна";
        возврат;
    конецесли;        
    
    СоздатьСМС();
    рез = СМС.Пост("https://transport.sms-pager.com:7214/balance.xml";);
    Если рез="1" тогда      
        ТекстОтвета = СМС.ПолучитьНоду("code","");
        Если ТекстОтвета="1" тогда
            Сообщить("Ваш баланс = " + СМС.ПолучитьНоду("account",""));
        иначе
            Предупреждение(СМС.ПолучитьНоду("descr",""));
        КонецЕсли;
    иначе
        Сообщить("Произошла ошибка при передаче, проверьте наличие интернета либо настройки прокси-сервера");
    КонецЕсли;    
        
КонецПроцедуры
14 Wobland
 
18.11.13
13:08
(13) пароль сменить или сам?
15 Wobland
 
18.11.13
13:10
Режим премодерации

Это означает что Ваши СМС будут отправляться немного медленнее, чем обычно - сначала они будут проверяться нашими менеджерами.
16 Gadin_V
 
18.11.13
13:12
на счет пароля не понял, а на счет проверки так они вообще не доходят сколько бы я не ждал...
17 Bumer
 
18.11.13
13:13
(16) Логин="testerzoloto";
    Пароль="tester";
18 Wobland
 
18.11.13
13:13
(16) сижу и думаю, какой бы новый пароль тебе изобрести ;)
19 Wobland
 
18.11.13
13:14
там в интеграции даже обработка есть

https://lcab.sms-uslugi.ru/1C_files/standart_1C_module.zip
20 Gadin_V
 
18.11.13
13:15
))) новый пароль уже изобрел))
но проблема не исчезла))
21 Gadin_V
 
18.11.13
13:15
спасибо щас посмотрю)
22 Gadin_V
 
18.11.13
15:05
нашлась проблема, косяк оказывается в мегафоне, после его ново введений по поводу коротких номеров!
23 Bumer
 
18.11.13
15:10
(22) Мегафон блокирует "буквенных" отправителей... теперь только цифры...
24 Bumer
 
18.11.13
15:11
Закон Брукера: Даже маленькая практика стоит большой теории.