Пример сохранения служебных сообщений автоматически выполняемой (из регламентного задания) обработки (проведение по партиям) для дальнейшего использования.


Пример показывает, как можно сохранить сообщения выдаваемые в окно "Служебные сообщения" при автоматическом выполнении обработки "Проведение по партиям" с помощью регламентного задания.

Данный прием пришлось изобретать из-за следующей ситуации доставшейся мне в наследство:

- каждый месяц бухгалтеру требуется выполнять стандартную обработку «Проведение по партиям» и анализировать сообщения выдаваемые обработкой;

- из-за большого объема данных обработка выполняется длительное время;

- при выполнении в немонопольном режиме периодически обработка останавливается по ошибке (пользователи проводят документы в уже обработанном периоде поэтому блокировки) – следовательно, сотрудник запустивший обработку должен периодически мониторить процесс выполнения – что не очень удобно;

- запускать в монопольном режиме в рабочее время не представляется возможным;

- желания оставаться, для выполнения этой обработки, в нерабочее время у бухгалтера нет.

Поэтому сложилась практика, что бухгалтер сообщает мне о необходимости выполнить проведение, я остаюсь после работы, выполняю обработку, а служебные сообщения отсылаю бухгалтеру по электронной почте.

            Через пару месяцев мне это надоело, и родилась идея сделать один раз механизм – и потом вообще про эту проблему забыть. Исходя из вышесказанного, и наличия сервера 1С родилась идея -  запускать автоматически через регламентное задание по ночам, когда пользователи не работают.

Первым делом из стандартной обработки «Проведение по партиям» делаем «упрощенный вариант». Разрешим пользователю выбирать только месяц, а остальные параметры настроим сами (смотрим в файле обработки «АвтоматическоеПроведениеПоПартиям.epf»).

Затем настраиваем регламентное задание на выполнение этой обработки (тексты процедур, которые надо добавить в модуль «МодульРегламентныхЗаданий» смотрим в файле «Общий модуль МодульРегламентныхЗаданий_ Модуль.txt»):

Процедура Автоматическое_Проведение_По_Партиям() Экспорт

  ОбработкаФоновогоЗадания   = Обработки.АвтоматическоеПроведениеПоПартиям.Создать();

  ОбработкаФоновогоЗадания.АвтоматическиПровестиПоПартиям(ТекущаяДата());

КонецПроцедуры

Довольно потираем руки… и вспоминаем про сообщения, которые обработка выдает в окно «Служебные сообщения»! А как прочитать сообщения, когда выполняется регламентное задание? Может они в журнал регистрации записываются? – Записываются да не все… самые нужные и не записываются как раз. Что делать? Поиск ответа в документации и интернете дает пару вариантов: запускать на сервере через назначенные задания с записью служебных сообщений в текстовый файл и пытаться скопировать сообщения из окна «Служебные сообщения» через copy/paste.

Через copy/paste подходит… даже работает… но не из регламентного задания!

Через файл надо настраивать на сервере назначенные задания, в процедуре при старте определять, что стартовали из назначенного задания (например, по пользователю), потом еще организовывать через другое регламентное или назначенное задание отправку файла по электронной почте. А как обеспечивать взаимодействие заданий: сначала выполнение обработки, потом отсылка файла с логом?

В общем, решил придумать другой способ. Для начала надо определить, где формируются нужные бухгалтеру сообщения: берем текст сообщения «Не списано по партиям» и выполняем глобальный поиск. Находим нужную нам процедуру «СообщитьОНехваткеПартииУпр» в модуле «УправлениеЗапасамиПартионныйУчет». Анализируя процедуру обнаруживаем, что сообщения выводятся с помощью процедуры «СообщитьОбОшибке» модуля «ОбщегоНазначения».

В этой процедуре и поставим сохранение сообщений в переменную. Будем сохранять сообщения в параметре сеанса. Создаем параметр сеанса «СообщенияФоновогоЗадания». В «МодулеСеанса» в процедуре «УстановкаПараметровСеанса» инициализируем параметр (тексты процедур, которые надо доработать в модуле «МодулеСеанса» смотрим в файле «УправлениеПроизводственнымПредприятием_ Модуль сеанса.txt»):

ПараметрыСеанса.СообщенияФоновогоЗадания = "";

В модуле «ОбщегоНазначения» в процедуре «СообщитьОбОшибке» собственно сохраняем служебные сообщения – дописываем в наш параметр сеанса если он не пустой (тексты процедур, которые надо доработать в модуль «ОбщегоНазначения» смотрим в файле «Общий модуль ОбщегоНазначения_ Модуль.txt»):

#Если не Клиент Тогда // т.к. сообщения перехватываем, когда запуск не интерактивный

  Если НЕ ПараметрыСеанса.СообщенияФоновогоЗадания = "" Тогда

    ПараметрыСеанса.СообщенияФоновогоЗадания = ПараметрыСеанса.СообщенияФоновогоЗадания + Символы.ПС

+ ТекстСообщения;

  КонецЕсли;     

#КонецЕсли

В нашей обработке вначале инициализируем параметр сеанса (записываем в него что-нибудь), чтобы он был непустой и при возникновении ошибок в него дописывались сообщения:

ПараметрыСеанса.СообщенияФоновогоЗадания = ПараметрыСеанса.СообщенияФоновогоЗадания

                                         + Формат(ТекущаяДата(), "ДФ=дд/ММ/гггг чч:мм:сс") + ": "

                                         + "Запущено автоматическое перепроведение по партиям за "

                                         + Формат(ПараметрПериодПерепроведения, "ДФ=""ММММ гггг""");

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

Данный алгоритм работает на 1С УПП 1.2.22.3.

Файлы обработки:

-