gifts2017

Пример получения остатков по складу по запросу по почте из программы 1С 7.7.

Опубликовал Сергей Смирнов (protexprotex) в раздел Программирование - Практика программирования

Пример получения остатков по складу по запросу по почте из программы 1С 7.7.  Для получения остатков необходимо пользователю с любого почтовика (с любого "мыла") отправить текст сообщения GiveMyStockBalance_ForAnalize на почтовый адрес определенный в Константа.СерверПолучения. Программа выдаст остатки (можно переписать функцию для выдачи любых данных) в формате xls на почту указанную в константе Константа.СерверОтправки. Программа может быть полезна в тех организациях где трудно или невозможно осуществить прямой доступ к 1С сотрудников для просмотра необходимых данных. Также можно организовать некий почтамт - запрос для клиентов - при посылке определенного логина клиентом на его почту будет автоматически выслана информация, например, акт сверки с клиентов, или процент выполнения его заказа и т.д.

//******************************************************************************    
Функция СоздатьSMTP_ROBOT (ДляПриема = 0)
    Попытка
        Если (ДляПриема = 0) Тогда
            SMTP_ROBOT = СоздатьОбъект("AddIn.SMTP");
        Иначе
            SMTP_ROBOT = СоздатьОбъект("AddIn.Pop3");
        КонецЕсли;            
        Возврат (SMTP_ROBOT);
    Исключение
        Сообщить (ОписаниеОшибки ());
        Возврат ("err");
    КонецПопытки;
    Возврат ("");
КонецФункции
//
//******************************************************************************    
Функция глВернутьПутьКСохраняемомуФайлу (КаталогВложений, НомерДок) Экспорт
    КаталогВложений    = КаталогИБ () + "MessageSMTP";
    GUID            = Прав (ТекущееВремя (), 2);
    Вложения        = КаталогВложений + "\SendMessage_" + СОКРЛП (НомерДок) + "_" + СОКРЛП (GUID) + ".xls";
    Возврат (Вложения);    
КонецФункции
//
//******************************************************************************
Функция глОтправитьПоПочтеОстаткиНаСкладе (ВхДатаОстатков, ФильтрСклад) Экспорт
    Перем КаталогВложений;
    
    ДатаОстатков    = мин (ВхДатаОстатков, ПОлучитьДатуТА ());
    
    ЛогинОбмена        = СОКРЛП(Константа.ЛогинОбменаПолучательАвтоОстаткиСклад);
    
    Если (ПустаяСтрока (ЛогинОбмена) = 1) Тогда
        Возврат (0);
    КонецЕсли;
    
    Тема            = "Остатки на " + Строка (ДатаОстатков) + " по складу " + СОКРЛП (ФильтрСклад);
    
    Тело            = Тема;
    
    Запрос             = СоздатьОбъект("Запрос");
    
    ТекстЗапроса     =
    "//{{ЗАПРОС(ЗапросПоОстаткамДляВнешенгоЗапроса)
    
    |Период с ДатаОстатков по ДатаОстатков;
    
    |МПЗ             = Регистр.МестаХранения.МПЗ;
    |МестоХранения     = Регистр.МестаХранения.МестоХранения;
    
    |Количество     = Регистр.МестаХранения.Количество;
    
    |Функция КонОст = КонОст(Количество);
    
    |Группировка МПЗ без групп;
    
    |Условие(МестоХранения = ФильтрСклад);
    |"//}}ЗАПРОС
    ;
    // Если ошибка в запросе, то выход из процедуры
    Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
        Возврат (0);
    КонецЕсли;
    
    Табл                                            = СоздатьОбъект ("Таблица");
    Табл.ИсходнаяТаблица ("ОстаткиТМЦ");
    Табл.Опции (0, 0, 4, 0);
    Табл.ТолькоПросмотр (1);
    Табл.ВывестиСекцию  ("Шапка");
    
    Пока Запрос.Группировка(1) = 1 Цикл
        Табл.ВывестиСекцию  ("Строка");
    КонецЦикла;
    Табл.ВывестиСекцию  ("Подвал");
    
    Вложения                                        = глВернутьПутьКСохраняемомуФайлу(КаталогВложений, "ОстаткиТМЦПоЗапросу");
    
    Табл.Записать (Вложения, "xls");
    
    Ответ                                            = 0;
    
    Если (ФС.СуществуетФайл (Вложения) = 1) Тогда
        Попытка
            //
            SMTP_ROBOT                                = СоздатьSMTP_ROBOT (0);
            Если         (SMTP_ROBOT = "") Тогда
                Возврат (0);
            ИначеЕсли     (SMTP_ROBOT = "err") Тогда
                Возврат (0);
            КонецЕсли;                
            //
            SMTP_ROBOT.РабочийКаталог                = СокрЛП(КаталогВложений);
            SMTP_ROBOT.УстановитьКодировкуИСпособКодирования(14, 1);
            SMTP_ROBOT.MakeContentDescriptionTag    = 0;
            SMTP_ROBOT.ПочтоваяПрограмма             = "1С 7.7.";
            SMTP_ROBOT.ИспользоватьПрокси            = 0;
            SMTP_ROBOT.ИспользоватьSSL                = Константа.ИспользоватьSSL;
            SMTP_ROBOT.ИспользоватьTSL                = Константа.ИспользоватьTSL;
            SMTP_ROBOT.ВестиЛогФайл                 = 1;
            SMTP_ROBOT.ИмяЛогФайла                    = КаталогИБ () + "LogDialMail.txt";
            //
            SMTP_ROBOT.СоздатьПисьмо (СокрЛП(Константа.ЛогинОтправки),
                                     СокрЛП(ЛогинОбмена),
                                     "",
                                     СОКРЛП(Тема),
                                     "1С 7.7.",
                                     СОКРЛП(Тело),
                                     Вложения);
            //
            Если (SMTP_ROBOT.Подключиться(СокрЛП(Константа.СерверОтправки),
                                          Константа.ПортОтправки,
                                          СокрЛП(Константа.ЛогинОтправки),
                                          СокрЛП(Константа.ПарольОтправки),
                                          3) = 0) Тогда
                Сообщить ("Не удалось подключиться к почтовому серверу");
                Ответ    = 0;
                SMTP_ROBOT.ОчиститьРабочийКаталог();
                Перейти ~Выход;
            КонецЕсли;
            //
            НомерПисьма                                = 1;
            Пока (SMTP_ROBOT.КоличествоПисемВРабочемКаталоге > 0) цикл
                Если (SMTP_ROBOT.ОтправитьПисьмо(1,1)                     SMTP_ROBOT.УдалитьПисьмоИзРабочегоКаталога();                
                    SMTP_ROBOT.ОчиститьРабочийКаталог();
                    Возврат (0);
                КонецЕсли;
                НомерПисьма    = НомерПисьма + 1;
            КонецЦикла;
            //
            SMTP_ROBOT.Отключиться();
            //
            SMTP_ROBOT.ОчиститьРабочийКаталог();        
            //
            Ответ    = 1;
            //
        Исключение
            Ответ    = 0;
        КонецПопытки;
    ~Выход:
        Если (ФС.СуществуетФайл (Вложения) = 1) Тогда
            ФС.УдалитьФайл (Вложения);
        КонецЕсли;        
    КонецЕсли;
    
    Возврат (Ответ);    
КонецФункции
//
//******************************************************************************
Функция ПроверитьНаПочтеЗапросНаВыдачуОстатков ()
    Если (Константа.StopОтправкиСкладскихОстатков = 1) Тогда
        Возврат (0);
    КонецЕсли;
    Если (ПустаяСтрока (Константа.СерверПолучения) = 0) И (ПустаяСтрока (Константа.ЛогинПолучения) = 0) И (ПустаяСтрока (Константа.ПарольПолучения) = 0) И (Константа.СкладПросмотраGiveMyStockBalance.Выбран () = 1) Тогда        
        SMTP_ROBOT                    = СоздатьSMTP_ROBOT (1);
        Если         (SMTP_ROBOT = "") Тогда
            Возврат (0);
        ИначеЕсли     (SMTP_ROBOT = "err") Тогда
            Возврат (0);
        КонецЕсли;    
        Если (SMTP_ROBOT.Подключиться(СокрЛП(Константа.СерверПолучения),
                                      110,
                                      СокрЛП(Константа.ЛогинПолучения),
                                      СокрЛП(Константа.ПарольПолучения),
                                      3) = 0) Тогда
            Возврат (0);
        КонецЕсли;    
        СпрЗапросовПоОстаткам        = СоздатьОбъект ("Справочник.ЗапросыПоОстаткамПоПочте");
        ТекстКоманды                = ВРЕГ("GiveMyStockBalance_ForAnalize");
        Попытка
            Для НомерПисьма = 1 По SMTP_ROBOT.КоличествоПисем Цикл
                Если (SMTP_ROBOT.ПолучитьЗаголовокПисьма (НомерПисьма) = 1) Тогда                
                    SMTP_ROBOT.ПолучитьПисьмо (НомерПисьма, 0, 0);
                    IDПисьма            = СОКРЛП(SMTP_ROBOT.createddate) + СОКРЛП(SMTP_ROBOT.createdtime);
                    ТелоПисьма            = ВРЕГ(СОКРЛП (SMTP_ROBOT.subject));
                    Отправлять            = 0;
                    Если (Найти (ТелоПисьма, ТекстКоманды) > 0) Тогда
                        Отправлять        = 1;
                    КонецЕсли;
                    Если (Отправлять) = 0 Тогда                
                        ТемаПисьма        = ВРЕГ(СОКРЛП (SMTP_ROBOT.ТелоПисьма));
                        Если (Найти (ТемаПисьма, ТекстКоманды) > 0) Тогда
                            Отправлять    = 1;                                      
                        КонецЕсли;
                    КонецЕсли;
                    Если (Отправлять) = 1 Тогда
                        Если (СпрЗапросовПоОстаткам.НайтиПоНаименованию (IDПисьма, 0, 1) = 0) Тогда
                            СпрЗапросовПоОстаткамОбж                = СоздатьОбъект ("Справочник.ЗапросыПоОстаткамПоПочте");
                            СпрЗапросовПоОстаткамОбж.Новый ();
                            СпрЗапросовПоОстаткамОбж.Наименование     = IDПисьма;
                            СпрЗапросовПоОстаткамОбж.ДатаЗаписи        = Строка (ТекущаяДата ()) + " " + ТекущееВремя ();
                            СпрЗапросовПоОстаткамОбж.Пользователь    = ИмяПользователя ();
                            СпрЗапросовПоОстаткамОбж.Получатель        = Константа.ЛогинОбменаПолучательАвтоОстаткиСклад;
                            СпрЗапросовПоОстаткамОбж.Записать ();
                            Если (SMTP_ROBOT.УдалитьПисьмо (НомерПисьма) = 0) Тогда
                                Константа.StopОтправкиСкладскихОстатков = 1;
                            Иначе
                                глОтправитьПоПочтеОстаткиНаСкладе (ТекущаяДата (), Константа.СкладПросмотраGiveMyStockBalance);
                            КонецЕсли;
                            Прервать;
                        КонецЕсли;
                    КонецЕсли;
                КонецЕсли;
            КонецЦикла;
        Исключение
        КонецПопытки;
        SMTP_ROBOT.Отключиться ();
        Возврат (1);
    Иначе
        Возврат (-1);
    КонецЕсли;
КонецФункции
//
//*****************************************************************************
// !!!!!!!!!!!!!  В глобальном модуле (в процедуре ПриНачалеРаботыСистемы ()) вставьте:
//Если (ЗагрузитьВнешнююКомпоненту(КаталогИБ () + "DialMail.dll") = 0) Тогда
//    Сообщить ("Не могу загрузить компоненту DialMail.dll !!!", "!!");
//КонецЕсли;
// !!!!!!!!!!!!! Также подцепите в команду ОбработкаОжидания процедуру ПроверитьНаПочтеЗапросНаВыдачуОстатков (). Например, вот так: ОбработкаОжидания ("ПроверитьНаПочтеЗапросНаВыдачуОстатков", 100)

Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
Пример процедуры
.ert 33,00Kb
25.03.14
5
.ert 1 33,00Kb 5 Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Франко Деллиани (Franco) 26.03.14 15:19
Нужно ещё или шифровать или сжимать и паролить. Представьте - уйдёт сотрудник к конкуренту и продолжит получать сведения об остатках.
2. Сергей Смирнов (protexprotex) 26.03.14 15:23
(1) Franco, Ну так если сотрудник уходит - то просто меняется пароль на "мыло" (почту) на которую приходят письма при запросе у 1С (на которое 1С-ка отправляет письма при внешнем запросе). Ну и можно еще анализировать от кого приходят письма чтобы от левых почтовых ящиков не брать запросы. Поле деятельности - целое поле. Это была просто идея реализованная у клиентов и переработанная под их нужды.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа