Данный прием пришлось изобретать из-за следующей ситуации доставшейся мне в наследство:
— каждый месяц бухгалтеру требуется выполнять стандартную обработку «Проведение по партиям» и анализировать сообщения выдаваемые обработкой;
— из-за большого объема данных обработка выполняется длительное время;
— при выполнении в немонопольном режиме периодически обработка останавливается по ошибке (пользователи проводят документы в уже обработанном периоде поэтому блокировки) – следовательно, сотрудник запустивший обработку должен периодически мониторить процесс выполнения – что не очень удобно;
— запускать в монопольном режиме в рабочее время не представляется возможным;
— желания оставаться, для выполнения этой обработки, в нерабочее время у бухгалтера нет.
Поэтому сложилась практика, что бухгалтер сообщает мне о необходимости выполнить проведение, я остаюсь после работы, выполняю обработку, а служебные сообщения отсылаю бухгалтеру по электронной почте.
Через пару месяцев мне это надоело, и родилась идея сделать один раз механизм – и потом вообще про эту проблему забыть. Исходя из вышесказанного, и наличия сервера 1С родилась идея — запускать автоматически через регламентное задание по ночам, когда пользователи не работают.
Первым делом из стандартной обработки «Проведение по партиям» делаем «упрощенный вариант». Разрешим пользователю выбирать только месяц, а остальные параметры настроим сами (смотрим в файле обработки «АвтоматическоеПроведениеПоПартиям.epf»).
Затем настраиваем регламентное задание на выполнение этой обработки (тексты процедур, которые надо добавить в модуль «МодульРегламентныхЗаданий» смотрим в файле «Общий модуль МодульРегламентныхЗаданий_ Модуль.txt»):
Процедура Автоматическое_Проведение_По_Партиям() Экспорт
ОбработкаФоновогоЗадания = Обработки.АвтоматическоеПроведениеПоПартиям.Создать();
ОбработкаФоновогоЗадания.АвтоматическиПровестиПоПартиям(ТекущаяДата());
КонецПроцедуры
Довольно потираем руки… и вспоминаем про сообщения, которые обработка выдает в окно «Служебные сообщения»! А как прочитать сообщения, когда выполняется регламентное задание? Может они в журнал регистрации записываются? – Записываются да не все… самые нужные и не записываются как раз. Что делать? Поиск ответа в документации и интернете дает пару вариантов: запускать на сервере через назначенные задания с записью служебных сообщений в текстовый файл и пытаться скопировать сообщения из окна «Служебные сообщения» через copy/paste.
Через copy/paste подходит… даже работает… но не из регламентного задания!
Через файл надо настраивать на сервере назначенные задания, в процедуре при старте определять, что стартовали из назначенного задания (например, по пользователю), потом еще организовывать через другое регламентное или назначенное задание отправку файла по электронной почте. А как обеспечивать взаимодействие заданий: сначала выполнение обработки, потом отсылка файла с логом?
В общем, решил придумать другой способ. Для начала надо определить, где формируются нужные бухгалтеру сообщения: берем текст сообщения «Не списано по партиям» и выполняем глобальный поиск. Находим нужную нам процедуру «СообщитьОНехваткеПартииУпр» в модуле «УправлениеЗапасамиПартионныйУчет». Анализируя процедуру обнаруживаем, что сообщения выводятся с помощью процедуры «СообщитьОбОшибке» модуля «ОбщегоНазначения».
В этой процедуре и поставим сохранение сообщений в переменную. Будем сохранять сообщения в параметре сеанса. Создаем параметр сеанса «СообщенияФоновогоЗадания». В «МодулеСеанса» в процедуре «УстановкаПараметровСеанса» инициализируем параметр (тексты процедур, которые надо доработать в модуле «МодулеСеанса» смотрим в файле «УправлениеПроизводственнымПредприятием_ Модуль сеанса.txt»):
ПараметрыСеанса.СообщенияФоновогоЗадания = «»;
В модуле «ОбщегоНазначения» в процедуре «СообщитьОбОшибке» собственно сохраняем служебные сообщения – дописываем в наш параметр сеанса если он не пустой (тексты процедур, которые надо доработать в модуль «ОбщегоНазначения» смотрим в файле «Общий модуль ОбщегоНазначения_ Модуль.txt»):
#Если не Клиент Тогда // т.к. сообщения перехватываем, когда запуск не интерактивный
Если НЕ ПараметрыСеанса.СообщенияФоновогоЗадания = «» Тогда
ПараметрыСеанса.СообщенияФоновогоЗадания = ПараметрыСеанса.СообщенияФоновогоЗадания + Символы.ПС
+ ТекстСообщения;
КонецЕсли;
#КонецЕсли
В нашей обработке вначале инициализируем параметр сеанса (записываем в него что-нибудь), чтобы он был непустой и при возникновении ошибок в него дописывались сообщения:
ПараметрыСеанса.СообщенияФоновогоЗадания = ПараметрыСеанса.СообщенияФоновогоЗадания
+ Формат(ТекущаяДата(), «ДФ=дд/ММ/гггг чч:мм:сс») + «: «
+ «Запущено автоматическое перепроведение по партиям за «
+ Формат(ПараметрПериодПерепроведения, «ДФ=»»ММММ гггг»»»);
В конце обработки посылаем электронное письмо с содержимым параметра сеанса и очищаем его, чтобы он был пустой и при возникновении ошибок в него не дописывались сообщения.
Данный алгоритм работает на 1С УПП 1.2.22.3.
(1) iov,
За комментарий спасибо — любая информация полезна.
Ну так не на «зубров» рассчитано а на начинающих.
Столкнулся с проблемой — решил. Мне не изящество надо было а решение проблемы.
Сначала просто думал что это разово попросили… потом пытался «организовать» ручное выполнение бухгалтером… и только когда стало ясно что надо придумывать как самому выкручиваться — тогда и написал.
Если не трудно покажите ту песочницу где про это написано — я сначала поискал в литературе и интернете — негусто…
Здесь выложен принцип и код как при автоматичеком запуске обработки «Проведение по партиям» сохранять сообщения. У себя в рабочей системе есть и проверки и … здесь не хотел перегружать статью, так как на уровень новичков рассчитывал.
(2) Так я и написал что песочница- читай новички.
Просто выложил все это как обработку а не как статью — вот потому и вопросы. Будь это просто статья- словил бы плюс… Но именно как решение — слишком просто (если новичок это не способен сделать — то боюсь это уже не лечится).
Аналогичную задачу делал через журнал. Для моих задач там все есть.
Но ни один раз сталкивался, что на продолжительных проведениях — 5 и более часов фоновое задание запускаемое сервером падало. Версия 8.2
Не сталкивался?
(4) aspirator23,
да, в 8.2 дублирование сообщений в журнал регистрации как раз избавляет от необходимости менять конфигурацию.
еще вариант: запуск 1С из ярлыка с параметром /Out «полный путь к файлу-логу»
все гениальное просто — и не нужно сумашедших идей, которые описаны по всему инету .. спасибо!
Уважаемый вы пишите очищаем параметр сеанса что бы система не писала туда ошибки, не совсем понятна эта фраза. получается все что теперь происходит на сервере пишиться в параметр сеанса. или я что то не до понял.
в 8.2 дублирование сообщений в журнал регистрации, кто в теме, поподробней с этого момента. Где в УТ 10.3 это настраивается? А то пришлось ошибки партии писать в журнал регистрации, а потом в конце регл задания их оттуда выгребать и отправлять Прльзователю + самому всегда можно посмотреть, кто из Пользователей начхал при проведении на данне сообщения! )), 1 строчка кода в СообщитьОНехваткеПартииУпр()
ЗаписьЖурналаРегистрации(«Сообщение», УровеньЖурналаРегистрации.Примечание, СтрокаДокумента.Регистратор.Метаданные(), СтрокаДокумента.Регистратор, СтрокаСообщения, РежимТранзакцииЗаписиЖурналаРегистрации.Транзакционная);
У нас при перепроведнии, может возникнуть несколько ошибок на несколько тысяч строк.
Спасибо! Статья пригодилась для общего развития.
Я проверил её на практике, но в итоге я сделал по другому:
Запуск 1С из ярлыка с параметром /Out «полный путь к файлу-логу», затем обработал полученный текстовый лог-файл, разложил ошибки по их видам в разные колонки, сохранил табличку в эксель . Экселька отправляется бухгалтеру на почту и все довольны)
Поделитесь обработкой на slelvi@rambler.ru . Заранее спасибо
Спасибо, пригодится.
(10) kainder,
Приветствую!
Скажите пожалуйста, а как можно налету сохранять служебные сообщения при перепроведение документов, когда закрывается месяц?
Это нужно на тот случай когда проведение слетело по какой-то причине: связь с сервером БД пропала, свет отключили и т.д..
Таким образом мы бы имели ошибки и сообщения до момента аварийного выхода из системы и потом можно было бы продолжить проведение с той даты, на которой вылетела программа.
Спасибо!
(13) kolesnikovdv,
Например завести в конфигурации новый регистр сведений для таких сообщений, и писать сообщения не в параметр сеанса а в этот регистр новыми записями. Или вообще не в регистр писать а в текстовый файл.
6 — /OUT не срабатывает при аварийном завершении.
Автору спасибо!
Искал идею, как решить такую же задачу.