gifts2017

Запуск внешней обработки по расписанию v7.7

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

Неоднократно возникали задачи организовать, например ежедневную выгрузку и отправку отчетов по эл.почте, и вот…

...представляю вашему вниманию простой и достаточно дубовый способ: 

1. Создаём в списке пользователей специальное имя, например АвтоEmail, набор прав минимальный – лишь бы хватило открыть общую внешнюю обработку.

2. В Глобальном модуле в процедуре ПриНачалеРаботыСистемы() описываем вызов отработки и завершение работы системы:

Если, например в торговле, обработка будет использовать значения по умолчанию пользователя, то вставку делаем после слов


глПользователь = Спр.ТекущийЭлемент();

 

// Вызов и завершение работы

Если ИмяПользователя() = "АвтоEmail" Тогда
    СтатусВозврата(
0);
    ОткрытьФорму(
"Отчет", "АвтоEmail", КаталогИБ() + "ExtForms\ПродажиОстатки.ert");
    Возврат;
КонецЕсли;

 

3. В самой обработке при открытии выполняем все нужные действия.

4. Далее собираем команду запуска 1С с параметрами:

Пример: "C:\Program Files\1Cv77\BIN\1cv7.exe" ENTERPRISE /D"D:\DataBase\Db\" /N"АвтоEmail" /P"123"

5. Осталось лишь Создать задачу в Планировщике заданий windows, указать команду запуска в действии и расписание.

 

И раз уж речь была об отправке почтой, то модуль формы обработки может выглядеть примерно так:


Процедура ПриОткрытии()
   
// Какой нибудь Запрос
   
Таб = СоздатьОбъект("Таблица");
   
Таб.ВывестиСекцию("Шапка");
    Пока
Запрос.Группировка(1) = 1 Цикл
       
Таб.ВывестиСекцию("Строка");
    КонецЦикла;
   
Таб.ВывестиСекцию("Подвал");
   
Таб.Записать(КаталогИБ()+"ExtForms\Остатки.xls", 1);

    Попытка
        Если ЗагрузитьВнешнююКомпоненту(
"ROM-Mail.dll")=0 Тогда
            Сообщить(
"Не удалось загрузить ROM-Mail.dll");
            Возврат;
        КонецЕсли;
    Исключение
        Возврат;
    КонецПопытки;
   
ВК = СоздатьОбъект("AddIn.AddInMail");
   
ВК.СерверОтправки  = "smtp.yandex.ru";
   
ВК.ПортОтправки                  = 25;
   
ВК.Логин                 = "МойЛогин";
   
ВК.Пароль               = "МойПароль";
   
ВК.АутентификацияПриОтправке     = 1 ;
    Если
ВК.Подключиться("Отправка") = 0 Тогда
        Возврат;
    КонецЕсли;
   
ВК.АдресОтправителя "МойЛогин@yandex.ru";
    ВК.ИмяОтправителя   = "ООО Рога и копыта"; // можно на несколько адресов через ;
   
ВК.АдресПолучателя  = СокрЛП(Мыло1) + ";" + СокрЛП(Мыло2) + ";" + СокрЛП(Мыло3);
   
ВК.Тема             = "Например, отчеты по ТМЦ на складах";
   
ВК.Кодировка        = "windows-1251";
   
ВК.ТипПисьма        = 2;                   // можно отправить несколько файлов через ;
   
ВК.Вложения = КаталогИБ()+"ExtForms\Движения.xls;"+КаталогИБ()+"ExtForms\Остатки.xls";
    Если
ВК.Отправить()=1 Тогда
        Сообщить(
"Отчеты успешно отправлены.");
    Иначе
        Сообщить(
"Не удалось отправить отчеты на почтовый сервер!", "!");
    КонецЕсли;
   
ВК.Отключиться();
КонецПроцедуры

Компонента ROM-Mail.dll бесплатная и легко пробивается в яндексе. 

 

Возможная проблема или «запишу, чтоб не забыть».

Планировщик Windows 2008 ошибка 2147943645

Планировщику заданий не удается запустить задачу "такую-то" для пользователя "такого-то". Дополнительные сведения: значение ошибки: 2147943645.

Дело в том, что при создании задания по умолчанию оно «Выполняется только зарегистрированного пользователя», но не в смысле, что пользователь должен существовать, а в смысле, что он должен быть залогинен. В случае, если эта галка выставлена «Выполнять вне зависимости от регистрации пользователя», то задание от имени незалогиненного в момент срабатывания триггера планировщика пользователя выполняется без проблем.

Предлагаемое решение – выставить вышеописанную галку и до кучи поставить галку "Выполнить с наивысшими правами", расположенную там же – мне лично сразу помогло.

Ссылка на источник

См. также

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

Комментарии

1. Александр Лыткин (TrinitronOTV) 20.03.12 07:48
неплохая реализация задачи
2. andrewks 20.03.12 08:26
вместо ROM-mail советую использовать dialmail.dll - гораздо меньше глючит в современных условиях, и функционал побогаче. или ещё CDO можно заюзать
3. Alex210 (janber) 20.03.12 09:53
Вижу по тексту, что на сервере будет по расписанию открываться окно 1С,
а кто его будет закрывать?
И еще, в письмо вкладывается файл результата другой обработки, а ее кто будет запускать?
4. Артур Коржан (1v7) 20.03.12 10:20
Для отправки мыла не обязательно использовать ВК.
(3) Alex210, поддерживаю...
Проще использовать таймаут в 1С или если время не принципиально - засунуть обработку в процедуру ПриНачалеРаботыСистемы().
5. Юрий Зайцев (Yury1001) 20.03.12 10:44
(3) Закрывать окно 1С будет строка СтатусВозврата(0).
Запускать другую обработку будет текст первой обработки ПриОткрытии() хоть 5 штук подряд.
6. Юрий Зайцев (Yury1001) 20.03.12 10:47
(4) таймаут в 1С зависает наглухо, при некоторых условиях, к тому же предполагается что 1С будет запущена всегда, а кто её запустит после перезагрузки сервера и как её останавливать при обновлениях - каждый раз, не...

ПриНачалаеРаботыСистемы засунуть можно, но изменять проще обработку - никого из базы выгонять не нужно.
7. Юрий Зайцев (Yury1001) 20.03.12 10:48
(2) ну я что нашёл 5 лет назад то и юзаю, а так компонента конечно может быть любая.
8. empty psk (Jelu) 20.03.12 10:49
Запускать можно скриптом по планировщику виндовс.
9. Юрий Зайцев (Yury1001) 20.03.12 10:51
(8) так об этом и публикация
10. soba (soba) 21.03.12 03:00
Прямо в лоб и эффективно. Только вот непонятно назначение операторов Сообщить("....") Для отладики разве что. Наверное все-же лучше ЗаписьЖурналаРегистрации("Мыло отправлено")
11. Юрий Зайцев (Yury1001) 21.03.12 20:56
(10) soba, ну да, это просто рабочий кусок по отправке почты, а в этой задаче конечно запись журнала или лог файла.
12. warden 22.03.12 07:54
Таки советую использовать CDO, меньше глючит, чем компоненты. Сам использую примерно такую схему, только запускается управляющая обработка, а дальше по критериям уже запускает остальные.
13. Дмитрий Утенков (automatizator) 25.03.12 03:35
Что бы само закрывалось надо дать команду
Форма.Закрыть();
14. Юрий Осипов (yuraos) 28.03.12 17:30
(9) Yury1001, Изящьное решение!
;)))
Я подобное тоже использовал в своей базе на прошлом месте работы.
Правда набор прав "автоюзера" назывался "Робот".
Причем юзер-робот по имени "Налипаефф" с утра заходил в базу целых три раза:
- первый раз делал выгрузки на сайты;
- второй раз аннулировал счета и заказы;
- третий раз выполнял рассылку прайсов, первичных документов и графиков платежей оптовикам;
Еще этого робота я мог при открытии заставить выполнить произвольный код на языке 1С из внешнего файла.
Метода описана в статье Обработка "Партионное удаление объектов" для 1С:Предприятие-7.7
в сааамом конце (над картинками).
PS:
Кроме "Робота" у меня еще был набор прав "Демон".
Он запускался в базу также планировщиком Windows,
но в отличии от "робота" он не отваливал, после выполнения положенных действий,
а оставался там в течении дня и выполнял в обработке ожидания фоновое задание
(гасил документы под названием "Заказ розничного покупателя").
15. selesta (selesta) 30.03.12 11:23
в добавок к таким фоновым юзерам-роботам использую обработку ожидания из ФормЕкса, все замечательно работает, например поднятие карточки звонка у оператора колл-центра
за сабж спасибо, главное не настроить планировщик в тоже время что и бекап :)
16. Денис Денин (MrDen) 19.09.12 14:42
Когда то тоже не нашел пришлось делать самому
http://infostart.ru/public/15995/
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа