При сопровождении и доработке типовых конфигураций (например, «Комплексная автоматизация 1.1» или «Управление производственным предприятием 1.3») разработчики часто сталкиваются с пунктом меню Операции → Проведение документов. Возникает вопрос: где найти эту форму и модуль в дереве метаданных конфигуратора, как устроена логика ее работы и каким образом можно вызвать аналогичное перепроведение программно с учетом прикладной специфики (партионного учета, взаиморасчетов и регламентных процедур).
Разберем детально внутреннее устройство этого механизма, выясним причины его отсутствия в метаданных и рассмотрим практические способы программного управления проведением документов.
Рассмотрим, почему данную обработку невозможно найти в дереве объектов конфигурации. Пункт меню «Проведение документов» (как и «Поиск и удаление помеченных объектов», «Управление полнотекстовым поиском» и др.) является системным платформенным диалогом. Его логика и пользовательский интерфейс скомпилированы непосредственно в ядре платформы «1С:Предприятие» и не имеют исходного кода на встроенном языке 1С.
Принцип работы платформенного проведения предельно прост:
РежимЗаписиДокумента.Проведение с установкой неоперативного режима: РежимПроведенияДокумента.Неоперативный.ОбработкаПроведения.Если в процессе проведения хотя бы один документ выдает ошибку блокировки или проверку заполнения, системное платформенное проведение может прерваться, требуя ручного вмешательства пользователя.
Проанализируем распространенное заблуждение: многие полагают, что платформенная обработка сама выполняет партионные списания по управленческому, бухгалтерскому и налоговому учету. Это не так.
В конфигурациях с партионным учетом часто используется настройка отложенного списания партий (флаг «Списывать партии при проведении документов» снят для повышения скорости работы пользователей). В этом случае обычное перепроведение документов только формирует движения по регистрам накопления без распределения партий и расчета себестоимости списания.
Для полноценного восстановления учета в конфигурации реализованы отдельные прикладные механизмы:
Последовательности.ПартионныйУчет, Последовательности.ПартионныйУчетБухгалтерскийУчет) — отслеживают момент нарушения хронологии движений и хранят границу актуальности остатков.Обработка.ПроведениеПоПартиям — выполняет расчет себестоимости и списание партий по заданным видам учета (УУ, БУ, НУ).Обработка.ВосстановлениеПоследовательностей — перепроводит документы по цепочке с контролем границ последовательностей.Если требуется восстановить актуальность партионного учета или расчетов с контрагентами программным путем, наиболее правильный способ — использование менеджера последовательностей. Посмотрим на пример кода:
ГраницаВосстановления = КонецДня(ТекущаяДата());
ПоследовательностьПартии = Последовательности.ПартионныйУчет;
// Сдвигаем и восстанавливаем границу последовательности
ПоследовательностьПартии.Восстановить(ГраницаВосстановления, РежимПроведенияДокумента.Неоперативный);
Менеджер последовательности автоматически определит документы, входящие в состав последовательности, упорядочит их по времени и выполнит перепроведение каждого документа от текущей границы до указанной даты.
Когда в базе отключено оперативное списание партий, простого проведения документов недостаточно — необходимо рассчитать партионные списания. Для этого создадим и выполним прикладную обработку конфигурации программно:
ОбработкаСписания = Обработки.ПроведениеПоПартиям.Создать();
ОбработкаСписания.Организация = ВыбраннаяОрганизация;
ОбработкаСписания.ДатаНач = НачалоМесяца(ТекущаяДата());
ОбработкаСписания.ДатаКон = КонецМесяца(ТекущаяДата());
// Настройка режимов учета
ОбработкаСписания.ОтражатьВУправленческомУчете = Истина;
ОбработкаСписания.ОтражатьВБухгалтерскомУчете = Истина;
ОбработкаСписания.ОтражатьВНалоговомУчете = Истина;
// Выполнение алгоритма проведения
ОбработкаСписания.ВыполнитьПроведение();
Данный подход гарантирует, что все движения по регистрам партий будут сформированы в строгом соответствии с заложенной учетной политикой предприятия.
Если стоит задача написать собственную процедуру перепроведения произвольного списка документов с защитой от аварийных остановок и снижением нагрузки на сервер, разберем по шагам создание безопасного алгоритма с транзакциями и обработкой исключений:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| РеализацияТоваровУслуг.Ссылка КАК Ссылка
|ИЗ
| Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
|ГДЕ
| РеализацияТоваровУслуг.Дата МЕЖДУ &ДатаНач И &ДатаКон
| И РеализацияТоваровУслуг.Проведен = ИСТИНА
|УПОРЯДОЧИТЬ ПО
| РеализацияТоваровУслуг.МоментВремени ВОЗР";
Запрос.УстановитьПараметр("ДатаНач", НачалоДня(ВыбДатаНач));
Запрос.УстановитьПараметр("ДатаКон", КонецДня(ВыбДатаКон));
Выборка = Запрос.Выполнить().Выбрать();
Счетчик = 0;
Пока Выборка.Следующий() Цикл
ДокументОбъект = Выборка.Ссылка.ПолучитьОбъект();
Если ДокументОбъект = Неопределено Тогда
Продолжить;
КонецЕсли;
Попытка
ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение, РежимПроведенияДокумента.Неоперативный);
Счетчик = Счетчик + 1;
Исключение
ЗаписьЖурналаРегистрации(
"ГрупповоеПерепроведение",
УровеньЖурналаРегистрации.Ошибка,
ДокументОбъект.Метаданные(),
ДокументОбъект.Ссылка,
ОписаниеОшибки()
);
КонецПопытки;
КонецЦикла;
В этом примере мы обрабатываем ошибки через блок Попытка ... Исключение, фиксируя сбойные документы в журнале регистрации без прерывания общего цикла обработки массива данных.
Для исключения блокировок базы в рабочее время все ресурсоемкие процедуры перепроведения документов и расчета партий рекомендуется переносить на ночное время. Для этого используются следующие механизмы:
/Execute "<ПутьКФайлуОбработки.epf>" или передачей параметров через ключ /C для автоматического выполнения сценариев по расписанию операционной системы.