8.х Запуск рассылки отчетов по событию

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем dimon_k, 11 мар 2014.

  1. TopicStarter Overlay
    dimon_k
    Offline

    dimon_k Опытный в 1С Команда форума

    Регистрация:
    17 янв 2011
    Сообщения:
    259
    Симпатии:
    17
    Баллы:
    29
    1С:Предприятие 8.3 (8.3.4.408)
    Управление торговлей, редакция 11.1 (11.1.4.11) SQL

    Создал рассылку отчетов "Test" в которую включены 4 внешних отчета, сохраняет их в текстовые файлы в папку. Расписание настроено на выполнение рассылки каждые 10 минут (актуальность данных важна), но это создает ненужную нагрузку на сервер. Актуальность отчета зависит от изменений только в одном типе документов "Заявка на расходование ДС". Появилась идея сделать подписку на событие "Сохранение документа(Заявка на расходование ДС)" и уже оттуда инициировать запуск рассылки (без расписания), но не нашел как из кода в подписке это сделать :( Или может есть более правильное решение? Кратко вопрос звучит так: как при создании или изменении документа выбранного нами вида, запускать нужную нам рассылку отчетов?
  2. alexburn
    Offline

    alexburn Модераторы Команда форума Модератор

    Регистрация:
    5 янв 2009
    Сообщения:
    14.735
    Симпатии:
    508
    Баллы:
    204
    Делаете общий модуль, прописываете в нем нужные процедуры и функции (экспортные), далее добавляете подписку, источник - ваш документ, обработчик - ваша процедура из вашего общего модуля.
  3. TopicStarter Overlay
    dimon_k
    Offline

    dimon_k Опытный в 1С Команда форума

    Регистрация:
    17 янв 2011
    Сообщения:
    259
    Симпатии:
    17
    Баллы:
    29
    Я в 1С ламер ... Я стандартными средствами Администрирование -> Печатные формы, отчеты и обработки -> Рассылки отчетов -> Создать
    сделал рассылку "test".
    На закладке "Отчеты" включил в рассылку 4 отчета (они были добавлены через Администрирование -> Печатные формы, отчеты и обработки -> Дополнительные отчеты и обработки, сами отчеты сделаны в СКД). Расписание (не активно). Доставка (в сетевой каталог). Формат сохранения отчетов "Текстовый документ UTF-8". Если нажимаю "Выполнить сейчас" отчеты отрабатывают, в нужной папке появляются необходимые файлы. Я могу включить расписание чтоб отчет генерился каждые 10 мин. Но хотелось бы запускать эту рассылку только после создания или изменения документа "Заявка на расходование ДС". В конфигурации есть общий модуль "Нетиповое" (туда кидаем код для других подписок), создал в нем процедуру "ЗапускРассылки". Создал подписку на событие:
    Источник -> ДокументОбъект.ЗаявкаНаРасходованиеДенежныхСредств
    Событие -> ОбработкаПроведения
    Обработчик -> Нетиповое.ЗапускРассылки

    В процедуру загнал код
    Код:
    ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Запуск подписки");
    При проведении документа "Заявка на расходование ДС", выдает сообщение "Запуск подписки". Какой код мне нужно вставить в процедуру для запуска рассылки "test"?
  4. alexburn
    Offline

    alexburn Модераторы Команда форума Модератор

    Регистрация:
    5 янв 2009
    Сообщения:
    14.735
    Симпатии:
    508
    Баллы:
    204
    А вот это уже нужно смотреть по коду, какими процедурами запускается рассылка. Я не знаком с вашей конфой, по-этому затрудняюсь ответить, нужно код смотреть. Посмотрите что происходит при нажатии "Выполнить сейчас", что там именно происходит и что для этого требуется.
  5. TopicStarter Overlay
    dimon_k
    Offline

    dimon_k Опытный в 1С Команда форума

    Регистрация:
    17 янв 2011
    Сообщения:
    259
    Симпатии:
    17
    Баллы:
    29
    Вот это-то для меня и есть самое сложное... Все остальное я итак знал как сделать, а вот понять что нужно в коде прописать чтоб выполнить рассылку мне пока не удается ... Вот что в коде кнопки "Выполнить сейчас"
    Код:
    ////////////////////////////////////////////////////////////////////////////////
    // ОБРАБОТЧИКИ СОБЫТИЙ
    
    &НаКлиенте
    Процедура ОбработкаКоманды(МассивРассылок, Параметры)
        Если ТипЗнч(МассивРассылок) <> Тип("Массив") ИЛИ МассивРассылок.Количество() = 0 Тогда
            Возврат;
        КонецЕсли;
      
        ЭтаФорма = Параметры.Источник;
      
        ПредварительныеНастройки = Неопределено;
        Если ЭтаФорма.ИмяФормы = "Справочник.РассылкиОтчетов.Форма.ФормаЭлемента" Тогда
            ТекстСообщения = НСтр("ru = 'Выполняется рассылка отчетов'");
          
            Объект = ЭтаФорма.Объект;
            Если НЕ Объект.Подготовлена Тогда
                Предупреждение(НСтр("ru = 'Рассылка не подготовлена'"));
                Возврат;
            КонецЕсли;
          
            Если Объект.ИспользоватьЭлектроннуюПочту Тогда
                Получатели = РассылкаОтчетовКлиент.ВыбратьПолучателя(Объект, Истина, Истина);
                Если Получатели = Неопределено Тогда
                    Возврат;
                КонецЕсли;
                ПредварительныеНастройки = Новый Структура("Получатели", Получатели);
            КонецЕсли;
        Иначе
            ТекстСообщения = НСтр("ru = 'Выполняются рассылки отчетов'");
        КонецЕсли;
      
        Состояние(ТекстСообщения, , , );
      
        ПараметрыВызоваСервера = Новый Структура("МассивРассылок, ПредварительныеНастройки",
            МассивРассылок,
            ПредварительныеНастройки);
      
        Результат = ВыполнитьРассылкиВФоновомЗадании(ПараметрыВызоваСервера, ЭтаФорма.УникальныйИдентификатор);
      
        Если Результат.Статус = "ВыполненоУспешно" Тогда
            РассылкаОтчетовКлиент.ПоказатьРезультат(Результат.Детали);
        ИначеЕсли Результат.Статус = "Исключение" Тогда
            Предупреждение(
                НСтр("ru = 'Рассылки не выполнены из-за ошибки,
                |Подробности см. в журнале регистрации.'"));
        ИначеЕсли Результат.Статус = "Выполняется" Тогда
            ФормаДлительнойОперации = ДлительныеОперацииКлиент.ОткрытьФормуДлительнойОперации(ЭтаФорма, Результат.Детали.ИдентификаторЗадания);
          
            ПараметрыОбработчика = Неопределено;
            ДлительныеОперацииКлиент.ИнициализироватьПараметрыОбработчикаОжидания(ПараметрыОбработчика);
            ДлительныеОперацииКлиент.ОбновитьПараметрыОбработчикаОжидания(ПараметрыОбработчика);
          
            ЭтаФорма.ПараметрыФоновогоЗадания.Очистить();
            ЭтаФорма.ПараметрыФоновогоЗадания.Добавить(Результат.Детали.ИдентификаторЗадания);
            ЭтаФорма.ПараметрыФоновогоЗадания.Добавить(Результат.Детали.АдресХранилища);
            ЭтаФорма.ПараметрыФоновогоЗадания.Добавить(ПараметрыОбработчика);
            ЭтаФорма.ПараметрыФоновогоЗадания.Добавить(ФормаДлительнойОперации);
          
            ЭтаФорма.ПодключитьОбработчикОжидания("Подключаемый_ПроверитьВыполнениеФоновогоЗадания", ПараметрыОбработчика.ТекущийИнтервал, Истина);
        КонецЕсли;
    КонецПроцедуры
    
    ////////////////////////////////////////////////////////////////////////////////
    // СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ
    
    &НаСервере
    Функция ВыполнитьРассылкиВФоновомЗадании(ПараметрыВызоваСервера, Знач УникальныйИдентификатор)
        Результат = Новый Структура("Статус, Детали");
      
        Попытка
            Если ОбщегоНазначения.ИнформационнаяБазаФайловая() Тогда
                РезультатФоновогоЗадания = Новый Структура("ЗаданиеВыполнено, АдресХранилища");
                РезультатФоновогоЗадания.ЗаданиеВыполнено = Истина;
                РезультатФоновогоЗадания.АдресХранилища   = ПоместитьВоВременноеХранилище(Неопределено, УникальныйИдентификатор);
              
                РассылкаОтчетов.ВыполнитьРассылкиВФоновомЗадании(ПараметрыВызоваСервера, РезультатФоновогоЗадания.АдресХранилища);
            Иначе
                РезультатФоновогоЗадания = ДлительныеОперации.ЗапуститьВыполнениеВФоне(
                    УникальныйИдентификатор,
                    "РассылкаОтчетов.ВыполнитьРассылкиВФоновомЗадании",
                    ПараметрыВызоваСервера,
                    НСтр("ru = 'Рассылки отчетов: Выполнение рассылок в фоне'"));
            КонецЕсли;
          
            Если РезультатФоновогоЗадания.ЗаданиеВыполнено Тогда
                Результат.Статус = "ВыполненоУспешно"; // Не локализуется
                Результат.Детали = ПолучитьИзВременногоХранилища(РезультатФоновогоЗадания.АдресХранилища);
            Иначе
                Результат.Статус = "Выполняется"; // Не локализуется
                Результат.Детали = Новый Структура("ИдентификаторЗадания, АдресХранилища");
                ЗаполнитьЗначенияСвойств(Результат.Детали, РезультатФоновогоЗадания);
            КонецЕсли;
        Исключение
            Результат.Статус = "Исключение"; // Не локализуется
        КонецПопытки;
      
        Возврат Результат;
    КонецФункции
    
    Пытаюсь сделать так
    Код:
    Отчет = Справочники.РассылкиОтчетов.НайтиПоНаименованию("test").ПолучитьОбъект();
    Отчет.Команда.ВыполнитьСейчас;
    
    Ругается ... Знаний 1С мне явно не хватает :(
  6. alexburn
    Offline

    alexburn Модераторы Команда форума Модератор

    Регистрация:
    5 янв 2009
    Сообщения:
    14.735
    Симпатии:
    508
    Баллы:
    204
    Тогда может к спецам? Или в библиотеку ?
  7. TopicStarter Overlay
    dimon_k
    Offline

    dimon_k Опытный в 1С Команда форума

    Регистрация:
    17 янв 2011
    Сообщения:
    259
    Симпатии:
    17
    Баллы:
    29
    Ну можно конечно и в библиотеку ... А к спецам я по наивности думал что и обратился ... Ну да ладно ... Пока сделал так:
    1) В рассылке отчетов на закладке "Расписание" включил галку "Выполнять по расписанию" (пофигу по какому, потом все равно выключим).
    2) В регламентных заданиях нашел созданное задание, снял галку "Включено" и скопировал "Идентификатор".
    3) В подписку на событие вставил код
    Код:
    ИдентификаторРегламентногоЗадания = "1a41d628-8fec-4e18-bf4e-d5e1ea851c89";
    МоментЗапуска                = Неопределено;
    ИдентификаторФоновогоЗадания = "";
    МоментОкончания = Неопределено;
    НомерСеанса = Неопределено;
    НачалоСеанса = Неопределено;
    ПредставлениеФоновогоЗадания = "";
    ПроцедураУжеВыполняется = Неопределено;
    
    РегламентныеЗаданияСлужебный.ВыполнитьРегламентноеЗаданиеВручную(
            ИдентификаторРегламентногоЗадания,
            МоментЗапуска,
            ИдентификаторФоновогоЗадания,
            МоментОкончания,
            НомерСеанса,
            НачалоСеанса,
            ПредставлениеФоновогоЗадания,
            ПроцедураУжеВыполняется);
    Где "ИдентификаторРегламентногоЗадания" это тот что скопировал из задания.
    Все вроде как заработало (может и коряво, но как сумел).
    В общем сам спросил, сам ответил ... Всем спасибо!
    alexburn нравится это.

Поделиться этой страницей