Автоматизация закрытия месяца — одна из самых амбициозных задач в 1С:УПП 1.3. Основная сложность заключается в том, что документ РасчетСебестоимостиВыпуска является финальным звеном в длинной цепочке операций, и его успешное проведение напрямую зависит от качества исходных данных. Разберем, как спроектировать систему, которая сможет самостоятельно рассчитывать себестоимость за несколько месяцев, корректно обрабатывая ошибки в каждом из них.
Для реализации задачи «стартовать следующий месяц, если предыдущий завершился с ошибкой», мы не можем использовать простое последовательное выполнение кода в одном регламентном задании. Если код упадет с критической ошибкой (Runtime error), все задание завершится. Поэтому мы применим модель «Менеджер — Воркер».
Проанализируем алгоритм работы такой системы:
Рассмотрим пример кода для управления такой очередью:
Процедура ЗапуститьЦепочкуРасчетов(ПараметрыРасчета) Экспорт
Для Каждого ТекущийПериод Из ПараметрыРасчета.МассивПериодов Цикл
ПараметрыЗапуска = Новый Массив;
ПараметрыЗапуска.Добавить(ТекущийПериод);
ПараметрыЗапуска.Добавить(ПараметрыРасчета.НастройкаРасчета);
// Запускаем фоновое задание
НовоеЗадание = ФоновыеЗадания.Выполнить("МойМодуль.ВыполнитьРасчетЗаМесяц", ПараметрыЗапуска);
Попытка
// Ожидаем завершения (например, тайм-аут 2 часа)
НовоеЗадание.ОжидатьЗавершения(7200);
Исключение
// Сюда попадем, если задание упало или превышен тайм-аут
ЗаписатьЛогОшибки(ТекущийПериод, НовоеЗадание.КраткоеОписаниеОшибки);
Продолжить; // Переходим к следующему месяцу
КонецПопытки;
Если НовоеЗадание.Состояние = СостояниеФоновогоЗадания.Завершено Тогда
ЗаписатьЛогУспеха(ТекущийПериод);
ИначеЕсли НовоеЗадание.Состояние = СостояниеФоновогоЗадания.ЗавершеноСОшибкой Тогда
ЗаписатьЛогОшибки(ТекущийПериод, НовоеЗадание.ИнформацияОбОшибке.Описание);
// Даже если ошибка, продолжаем цикл, как просил заказчик
Продолжить;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
В УПП 1.3 расчет себестоимости — это проведение документа Документы.РасчетСебестоимостиВыпуска. Выясним, какие параметры критически важны при его программном создании. Нельзя просто создать документ, нужно правильно заполнить его табличную часть «Технологические операции».
Для этого рекомендуем использовать справочник НастройкиРасчетаСебестоимости. Бухгалтер должен один раз настроить последовательность действий в интерфейсе, а мы будем программно подтягивать эту настройку.
Разберем по шагам заполнение документа:
Функция ВыполнитьРасчетЗаМесяц(ПериодРасчета, СсылкаНаНастройку) Экспорт
НовыйДок = Документы.РасчетСебестоимостиВыпуска.СоздатьДокумент();
НовыйДок.Дата = КонецМесяца(ПериодРасчета);
НовыйДок.Организация = СсылкаНаНастройку.Организация;
НовыйДок.ОтражатьВУправленческомУчете = Истина;
НовыйДок.ОтражатьВБухгалтерскомУчете = Истина;
НовыйДок.НастройкаЗакрытияМесяца = СсылкаНаНастройку;
// Важный момент: заполнение операций по настройке
НовыйДок.ЗаполнитьПоНастройкам();
Попытка
НовыйДок.Записать(РежимЗаписиДокумента.Проведение, РежимПроведенияДокумента.Неоперативный);
Возврат Истина;
Исключение
ВызватьИсключение "Ошибка проведения: " + ОписаниеОшибки();
КонецПопытки;
КонецФункции
Проанализируем ситуацию с режимами учета, так как от этого зависит целесообразность автоматизации:
УчетЗатратРегламентированный. Если за январь расчет упал из-за «отрицательных остатков в узлах корректировки», то расчет за февраль, скорее всего, не будет иметь смысла, так как себестоимость переходящих остатков не определена.РасчетСебестоимостиВыпуска либо не сделает ничего полезного, либо выдаст ошибку о нехватке партий. В цепочку автоматизации нужно добавить вызов метода ПроведениеПоПартиям.ВыполнитьПроведение().Чтобы расчет не «падал» в середине ночи на очевидных вещах, добавим блок предварительных проверок. Рассмотрим самые частые причины сбоев:
Так как бухгалтер не видит консоль фоновых заданий, нам необходимо реализовать механизм обратной связи. Выясним, как лучше хранить результаты работы:
Вариант 1: Справочник или Регистр сведений. Создайте простой регистр «Лог выполнения закрытия месяца». Записывайте туда дату запуска, период расчета, статус и подробный текст ошибки из ИнформацияОбОшибке.Описание.
Вариант 2: Журнал регистрации. Используйте метод ЗаписьЖурналаРегистрации, но помните, что бухгалтерам неудобно им пользоваться. Лучше дублировать критические ошибки в почту через СредстваПочты.
Реализация автоматического расчета себестоимости в УПП 1.3 возможна, но требует осторожности. Главное — помнить, что успешное проведение документа не равно корректному результату. Бухгалтер должен регулярно проверять отчет «Ведомость по учету затрат» после работы вашего робота. Если один месяц в цепочке рассчитался с ошибкой, данные всех последующих месяцев в части себестоимости остатков будут недостоверными, даже если сами документы проведутся успешно.