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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  КонецЕсли;     

#КонецЕсли

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

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

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

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

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

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

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

15 Comments

  1. VarvarV

    (1) iov,

    За комментарий спасибо — любая информация полезна.

    Не то что нового — вообще ничего особенного — это даже не работа а так 15 минут пока кофе пьешь

    Ну так не на «зубров» рассчитано а на начинающих.

    ну нету изюминки

    Столкнулся с проблемой — решил. Мне не изящество надо было а решение проблемы.

    За то что ДВА месяца не писал такого а задерживался

    Сначала просто думал что это разово попросили… потом пытался «организовать» ручное выполнение бухгалтером… и только когда стало ясно что надо придумывать как самому выкручиваться — тогда и написал.

    А так — решения для песочницы. Даже выгонялку и проверялку на другие регламентные задания не сделал.

    Если не трудно покажите ту песочницу где про это написано — я сначала поискал в литературе и интернете — негусто…

    Здесь выложен принцип и код как при автоматичеком запуске обработки «Проведение по партиям» сохранять сообщения. У себя в рабочей системе есть и проверки и … здесь не хотел перегружать статью, так как на уровень новичков рассчитывал.

    Reply
  2. iov

    (2) Так я и написал что песочница- читай новички.

    Плюс за то что расписал — трудился сделал все почти без глобального переписывания конфы

    Просто выложил все это как обработку а не как статью — вот потому и вопросы. Будь это просто статья- словил бы плюс… Но именно как решение — слишком просто (если новичок это не способен сделать — то боюсь это уже не лечится).

    Reply
  3. aspirator23

    Аналогичную задачу делал через журнал. Для моих задач там все есть.

    Но ни один раз сталкивался, что на продолжительных проведениях — 5 и более часов фоновое задание запускаемое сервером падало. Версия 8.2

    Не сталкивался?

    Reply
  4. climepost

    (4) aspirator23,

    да, в 8.2 дублирование сообщений в журнал регистрации как раз избавляет от необходимости менять конфигурацию.

    Reply
  5. vec435

    еще вариант: запуск 1С из ярлыка с параметром /Out «полный путь к файлу-логу»

    Reply
  6. amyd

    все гениальное просто — и не нужно сумашедших идей, которые описаны по всему инету .. спасибо!

    Reply
  7. Al-77

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

    Reply
  8. AndrewVVS

    в 8.2 дублирование сообщений в журнал регистрации, кто в теме, поподробней с этого момента. Где в УТ 10.3 это настраивается? А то пришлось ошибки партии писать в журнал регистрации, а потом в конце регл задания их оттуда выгребать и отправлять Прльзователю + самому всегда можно посмотреть, кто из Пользователей начхал при проведении на данне сообщения! )), 1 строчка кода в СообщитьОНехваткеПартииУпр()

    ЗаписьЖурналаРегистрации(«Сообщение», УровеньЖурналаРегистрации.Примечание, СтрокаДокумента.Регистратор.Метаданные(), СтрокаДокумента.Регистратор, СтрокаСообщения, РежимТранзакцииЗаписиЖурналаРегистрации.Транзакционная);

    Reply
  9. kainder

    У нас при перепроведнии, может возникнуть несколько ошибок на несколько тысяч строк.

    Спасибо! Статья пригодилась для общего развития.

    Я проверил её на практике, но в итоге я сделал по другому:

    Запуск 1С из ярлыка с параметром /Out «полный путь к файлу-логу», затем обработал полученный текстовый лог-файл, разложил ошибки по их видам в разные колонки, сохранил табличку в эксель . Экселька отправляется бухгалтеру на почту и все довольны)

    Reply
  10. slelvi

    Поделитесь обработкой на slelvi@rambler.ru . Заранее спасибо

    Reply
  11. Angel_19

    Спасибо, пригодится.

    Reply
  12. kolesnikovdv

    (10) kainder,

    Приветствую!

    Скажите пожалуйста, а как можно налету сохранять служебные сообщения при перепроведение документов, когда закрывается месяц?

    Это нужно на тот случай когда проведение слетело по какой-то причине: связь с сервером БД пропала, свет отключили и т.д..

    Таким образом мы бы имели ошибки и сообщения до момента аварийного выхода из системы и потом можно было бы продолжить проведение с той даты, на которой вылетела программа.

    Спасибо!

    Reply
  13. VarvarV

    (13) kolesnikovdv,

    Например завести в конфигурации новый регистр сведений для таких сообщений, и писать сообщения не в параметр сеанса а в этот регистр новыми записями. Или вообще не в регистр писать а в текстовый файл.

    Reply
  14. alexsu4236

    6 — /OUT не срабатывает при аварийном завершении.

    Reply
  15. Petrony

    Автору спасибо!

    Искал идею, как решить такую же задачу.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *