Где найти обработку проведения документов в 1С и как запустить перепроведение программно

Программист 1С v8.3 (Обычные формы) 1С:Комплексная автоматизация IT и автоматизация бизнеса
← На главную

При сопровождении и доработке типовых конфигураций (например, «Комплексная автоматизация 1.1» или «Управление производственным предприятием 1.3») разработчики часто сталкиваются с пунктом меню Операции → Проведение документов. Возникает вопрос: где найти эту форму и модуль в дереве метаданных конфигуратора, как устроена логика ее работы и каким образом можно вызвать аналогичное перепроведение программно с учетом прикладной специфики (партионного учета, взаиморасчетов и регламентных процедур).

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

Архитектура стандартной обработки «Проведение документов»

Рассмотрим, почему данную обработку невозможно найти в дереве объектов конфигурации. Пункт меню «Проведение документов» (как и «Поиск и удаление помеченных объектов», «Управление полнотекстовым поиском» и др.) является системным платформенным диалогом. Его логика и пользовательский интерфейс скомпилированы непосредственно в ядре платформы «1С:Предприятие» и не имеют исходного кода на встроенном языке 1С.

Принцип работы платформенного проведения предельно прост:

  1. Платформа делает выборку документов выбранных типов за указанный период времени в хронологическом порядке.
  2. Для каждого найденного документа последовательно вызывается запись объекта в режиме проведения: РежимЗаписиДокумента.Проведение с установкой неоперативного режима: РежимПроведенияДокумента.Неоперативный.
  3. Платформа не вызывает специализированные прикладные процедуры пересчета себестоимости или закрытия месяца. Выполняется исключительно стандартное событие модуля документа ОбработкаПроведения.

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

Специфика партионного учета в конфигурациях уровня КА 1.1 и УПП

Проанализируем распространенное заблуждение: многие полагают, что платформенная обработка сама выполняет партионные списания по управленческому, бухгалтерскому и налоговому учету. Это не так.

В конфигурациях с партионным учетом часто используется настройка отложенного списания партий (флаг «Списывать партии при проведении документов» снят для повышения скорости работы пользователей). В этом случае обычное перепроведение документов только формирует движения по регистрам накопления без распределения партий и расчета себестоимости списания.

Для полноценного восстановления учета в конфигурации реализованы отдельные прикладные механизмы:

  1. Последовательности документов (например, Последовательности.ПартионныйУчет, Последовательности.ПартионныйУчетБухгалтерскийУчет) — отслеживают момент нарушения хронологии движений и хранят границу актуальности остатков.
  2. Прикладная обработка Обработка.ПроведениеПоПартиям — выполняет расчет себестоимости и списание партий по заданным видам учета (УУ, БУ, НУ).
  3. Прикладная обработка Обработка.ВосстановлениеПоследовательностей — перепроводит документы по цепочке с контролем границ последовательностей.

Вариант 1: Программное восстановление последовательностей

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


ГраницаВосстановления = КонецДня(ТекущаяДата());
ПоследовательностьПартии = Последовательности.ПартионныйУчет;

// Сдвигаем и восстанавливаем границу последовательности
ПоследовательностьПартии.Восстановить(ГраницаВосстановления, РежимПроведенияДокумента.Неоперативный);

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

Вариант 2: Программный вызов прикладной обработки «Проведение по партиям»

Когда в базе отключено оперативное списание партий, простого проведения документов недостаточно — необходимо рассчитать партионные списания. Для этого создадим и выполним прикладную обработку конфигурации программно:


ОбработкаСписания = Обработки.ПроведениеПоПартиям.Создать();
ОбработкаСписания.Организация = ВыбраннаяОрганизация;
ОбработкаСписания.ДатаНач = НачалоМесяца(ТекущаяДата());
ОбработкаСписания.ДатаКон = КонецМесяца(ТекущаяДата());

// Настройка режимов учета
ОбработкаСписания.ОтражатьВУправленческомУчете = Истина;
ОбработкаСписания.ОтражатьВБухгалтерскомУчете = Истина;
ОбработкаСписания.ОтражатьВНалоговомУчете = Истина;

// Выполнение алгоритма проведения
ОбработкаСписания.ВыполнитьПроведение();

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

Вариант 3: Собственный алгоритм группового перепроведения документов

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


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |   РеализацияТоваровУслуг.Ссылка КАК Ссылка
    |ИЗ
    |   Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
    |ГДЕ
    |   РеализацияТоваровУслуг.Дата МЕЖДУ &ДатаНач И &ДатаКон
    |   И РеализацияТоваровУслуг.Проведен = ИСТИНА
    |УПОРЯДОЧИТЬ ПО
    |   РеализацияТоваровУслуг.МоментВремени ВОЗР";

Запрос.УстановитьПараметр("ДатаНач", НачалоДня(ВыбДатаНач));
Запрос.УстановитьПараметр("ДатаКон", КонецДня(ВыбДатаКон));

Выборка = Запрос.Выполнить().Выбрать();
Счетчик = 0;

Пока Выборка.Следующий() Цикл
    ДокументОбъект = Выборка.Ссылка.ПолучитьОбъект();
    
    Если ДокументОбъект = Неопределено Тогда
        Продолжить;
    КонецЕсли;
    
    Попытка
        ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение, РежимПроведенияДокумента.Неоперативный);
        Счетчик = Счетчик + 1;
    Исключение
        ЗаписьЖурналаРегистрации(
            "ГрупповоеПерепроведение",
            УровеньЖурналаРегистрации.Ошибка,
            ДокументОбъект.Метаданные(),
            ДокументОбъект.Ссылка,
            ОписаниеОшибки()
        );
    КонецПопытки;
КонецЦикла;

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

Автоматизация через регламентные задания

Для исключения блокировок базы в рабочее время все ресурсоемкие процедуры перепроведения документов и расчета партий рекомендуется переносить на ночное время. Для этого используются следующие механизмы:

  1. Типовые регламентные задания — в составе конфигурации предусмотрены предопределенные регламентные задания для фонового проведения по партиям и восстановления последовательностей.
  2. Пакетный запуск 1С из командной строки — запуск информационной базы в пакетном режиме с параметром /Execute "<ПутьКФайлуОбработки.epf>" или передачей параметров через ключ /C для автоматического выполнения сценариев по расписанию операционной системы.
← На главную