Данный прием пришлось изобретать из-за следующей ситуации доставшейся мне в наследство:
- каждый месяц бухгалтеру требуется выполнять стандартную обработку «Проведение по партиям» и анализировать сообщения выдаваемые обработкой;
- из-за большого объема данных обработка выполняется длительное время;
- при выполнении в немонопольном режиме периодически обработка останавливается по ошибке (пользователи проводят документы в уже обработанном периоде поэтому блокировки) – следовательно, сотрудник запустивший обработку должен периодически мониторить процесс выполнения – что не очень удобно;
- запускать в монопольном режиме в рабочее время не представляется возможным;
- желания оставаться, для выполнения этой обработки, в нерабочее время у бухгалтера нет.
Поэтому сложилась практика, что бухгалтер сообщает мне о необходимости выполнить проведение, я остаюсь после работы, выполняю обработку, а служебные сообщения отсылаю бухгалтеру по электронной почте.
Через пару месяцев мне это надоело, и родилась идея сделать один раз механизм – и потом вообще про эту проблему забыть. Исходя из вышесказанного, и наличия сервера 1С родилась идея - запускать автоматически через регламентное задание по ночам, когда пользователи не работают.
Первым делом из стандартной обработки «Проведение по партиям» делаем «упрощенный вариант». Разрешим пользователю выбирать только месяц, а остальные параметры настроим сами (смотрим в файле обработки «АвтоматическоеПроведениеПоПартиям.epf»).
Затем настраиваем регламентное задание на выполнение этой обработки (тексты процедур, которые надо добавить в модуль «МодульРегламентныхЗаданий» смотрим в файле «Общий модуль МодульРегламентныхЗаданий_ Модуль.txt»):
Процедура Автоматическое_Проведение_По_Партиям() Экспорт
ОбработкаФоновогоЗадания = Обработки.АвтоматическоеПроведениеПоПартиям.Создать();
ОбработкаФоновогоЗадания.АвтоматическиПровестиПоПартиям(ТекущаяДата());
КонецПроцедуры
Довольно потираем руки… и вспоминаем про сообщения, которые обработка выдает в окно «Служебные сообщения»! А как прочитать сообщения, когда выполняется регламентное задание? Может они в журнал регистрации записываются? – Записываются да не все… самые нужные и не записываются как раз. Что делать? Поиск ответа в документации и интернете дает пару вариантов: запускать на сервере через назначенные задания с записью служебных сообщений в текстовый файл и пытаться скопировать сообщения из окна «Служебные сообщения» через copy/paste.
Через copy/paste подходит… даже работает… но не из регламентного задания!
Через файл надо настраивать на сервере назначенные задания, в процедуре при старте определять, что стартовали из назначенного задания (например, по пользователю), потом еще организовывать через другое регламентное или назначенное задание отправку файла по электронной почте. А как обеспечивать взаимодействие заданий: сначала выполнение обработки, потом отсылка файла с логом?
В общем, решил придумать другой способ. Для начала надо определить, где формируются нужные бухгалтеру сообщения: берем текст сообщения «Не списано по партиям» и выполняем глобальный поиск. Находим нужную нам процедуру «СообщитьОНехваткеПартииУпр» в модуле «УправлениеЗапасамиПартионныйУчет». Анализируя процедуру обнаруживаем, что сообщения выводятся с помощью процедуры «СообщитьОбОшибке» модуля «ОбщегоНазначения».
В этой процедуре и поставим сохранение сообщений в переменную. Будем сохранять сообщения в параметре сеанса. Создаем параметр сеанса «СообщенияФоновогоЗадания». В «МодулеСеанса» в процедуре «УстановкаПараметровСеанса» инициализируем параметр (тексты процедур, которые надо доработать в модуле «МодулеСеанса» смотрим в файле «УправлениеПроизводственнымПредприятием_ Модуль сеанса.txt»):
ПараметрыСеанса.СообщенияФоновогоЗадания = "";
В модуле «ОбщегоНазначения» в процедуре «СообщитьОбОшибке» собственно сохраняем служебные сообщения – дописываем в наш параметр сеанса если он не пустой (тексты процедур, которые надо доработать в модуль «ОбщегоНазначения» смотрим в файле «Общий модуль ОбщегоНазначения_ Модуль.txt»):
#Если не Клиент Тогда // т.к. сообщения перехватываем, когда запуск не интерактивный
Если НЕ ПараметрыСеанса.СообщенияФоновогоЗадания = "" Тогда
ПараметрыСеанса.СообщенияФоновогоЗадания = ПараметрыСеанса.СообщенияФоновогоЗадания + Символы.ПС
+ ТекстСообщения;
КонецЕсли;
#КонецЕсли
В нашей обработке вначале инициализируем параметр сеанса (записываем в него что-нибудь), чтобы он был непустой и при возникновении ошибок в него дописывались сообщения:
ПараметрыСеанса.СообщенияФоновогоЗадания = ПараметрыСеанса.СообщенияФоновогоЗадания
+ Формат(ТекущаяДата(), "ДФ=дд/ММ/гггг чч:мм:сс") + ": "
+ "Запущено автоматическое перепроведение по партиям за "
+ Формат(ПараметрПериодПерепроведения, "ДФ=""ММММ гггг""");
В конце обработки посылаем электронное письмо с содержимым параметра сеанса и очищаем его, чтобы он был пустой и при возникновении ошибок в него не дописывались сообщения.
Данный алгоритм работает на 1С УПП 1.2.22.3.