Почему при перезаписи документа "Этап производства" в 1С:ERP сбрасываются статусы отражения в регламентированном учете за прошлые периоды?

Программист 1С v8.3 (Управляемые формы) 1С:ERP Управление предприятием Бухгалтерский учет Промышленность, строительство и АПК
← На главную

В процессе эксплуатации 1С:ERP Управление предприятием на крупных производственных предприятиях пользователи часто сталкиваются с крайне неприятной ситуацией. Длительный документ Этап производства, который выполнялся в течение нескольких месяцев (или даже кварталов), после обычного открытия и нажатия кнопки Записать и закрыть неожиданно сбрасывает свои статусы отражения в регламентированном учете на значение К отражению за все периоды своего существования. При этом некоторые из этих периодов (например, прошлый год или прошлый квартал) уже давно закрыты, отчетность сдана, а повторное отражение в учете заблокировано датой запрета изменения данных.

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

Суть проблемы и сценарий ее воспроизведения

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

  1. В ноябре 2018 года по документу Этап производства были отгружены первые материалы со склада в производство. Программа сформировала записи в регистре сведений Отражение документов в регл. учете на ноябрь со статусом Отражен.
  2. В декабре 2018 года была произведена следующая отгрузка материалов. В регистре появилась вторая строка со статусом Отражен. Период 2018 года успешно закрывается бухгалтерией, устанавливается дата запрета изменения данных.
  3. В январе 2019 года отражаются дополнительные трудозатраты или материалы. Появляется третья строка в регистре со статусом Отражен.
  4. В феврале 2019 года оформляется финальный выпуск продукции. В регистре появляется четвертая строка на февраль со статусом К отражению.

На данный момент в регистре сведений Отражение документов в регл. учете по нашему документу присутствуют четыре записи:

Все идет штатно. Однако, стоит любому пользователю (например, диспетчеру производства) случайно открыть этот документ Этап производства, ничего в нем не менять и нажать кнопку Записать и закрыть (которая инициирует транзакцию проведения проведенного документа), как происходит сбой: все четыре записи в регистре, начиная с Ноября 2018 года, сбрасывают свой статус на "К отражению"!

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

Технический анализ: где скрыта причина в коде?

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

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


Если ЗначениеЗаполнено(РезультатПроверки.ОбщийМинимальныйПериод) Тогда
    ПериодЗаполнения = РезультатПроверки.ОбщийМинимальныйПериод;
Иначе
    // Если после перепроведения данные документа не изменились, то все движения должны быть сохранены.
    // ПериодЗаполнения равный пустой дате соответствует режиму сохранения всех движений, фоновое задание расхода не запускается.
    // ПериодЗаполнения равный НЕОПРЕДЕЛЕНО соответствует режиму перезаписи всех движений, фоновое задание расхода не запускается.
    // ПериодЗаполнения равный началу месяца соответствует режиму сохранения движений в предыдущих месяцах и формированию
    // новых начиная с начала месяца, для формирования оффлайновых движений запускается фоновое задание.
    ПериодЗаполнения = Дата('00010101');
КонецЕсли;

Когда мы нажимаем Записать и закрыть, система выполняет проверку изменений в табличных частях документа. Если никаких изменений не произошло, переменная РезультатПроверки.ОбщийМинимальныйПериод остается пустой. Соответственно, срабатывает ветка Иначе, и переменной ПериодЗаполнения присваивается пустая дата '0001-01-01'. По комментариям разработчиков, пустая дата должна соответствовать режиму сохранения всех движений.

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


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

Проанализируем это условие подробнее. В нем проверяется:

Строка.ДатаОтражения >= ПериодЗаполнения И ЗначениеЗаполнено(ПериодЗаполнения)

Поскольку при отсутствии изменений в документе переменная ПериодЗаполнения установлена в пустую дату ('0001-01-01'), функция ЗначениеЗаполнено(ПериодЗаполнения) возвращает Ложь. Из-за этого условие внутри цикла не выполняется ни разу!

Следовательно, вызов метода ДобавитьПараметрыВыборочнойРегистрацииКОтражениюВРеглУчете полностью пропускается для всех строк таблицы отражения. В дополнительных свойствах документа признак ВыборочнаяРегистрацияКОтражениюВРеглУчете остается в значении Ложь.

Когда этот признак равен Ложь, система считает, что выборочная (частичная) регистрация к отражению не требуется, и инициирует полную перезапись регистра отражения по всему документу. Старые записи во всех периодах (включая закрытые ноябрь и декабрь) удаляются, а на их месте создаются новые записи со статусом по умолчанию — К отражению. Вот так обычная запись неизмененного документа приводит к сбросу статусов отражения в закрытых периодах.

Почему это критично для ведения учета?

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

Варианты решения проблемы

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

Решение 1. Организационный регламент (без изменения кода)

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

  1. Категорически запретить открывать документы прошлых периодов в режиме редактирования, если не планируется внесение изменений.
  2. Для просмотра информации использовать только открытие формы в режиме "Только просмотр" (если настроены соответствующие права) либо закрывать открытый документ исключительно клавишей Esc или нажатием на крестик в правом верхнем углу формы.
  3. Исключить использование кнопки Записать и закрыть для документов, у которых фактические даты операций лежат в закрытых периодах.

Минус метода: Человеческий фактор исключить невозможно. Рано или поздно один из сотрудников случайно нажмет "Записать и закрыть", что приведет к сбросу статусов.

Решение 2. Программное исправление через расширение конфигурации

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

Нам необходимо перехватить процедуру, в которой выполняется запись движений по регистру ОтражениеДокументовВРеглУчете. Задача доработки — принудительно устанавливать выборочную регистрацию только для тех периодов, которые действительно изменились, либо полностью блокировать перезапись статусов для периодов, которые меньше или равны установленной дате запрета изменения регламентированного учета.

Рассмотрим пример реализации в расширении. Мы можем переопределить поведение заполнения признака выборочной регистрации. Если документ проводится без фактических изменений (и ПериодЗаполнения равен пустой дате), мы должны трактовать это как сигнал к тому, что существующие движения в регистре отражения вообще не должны перезаписываться.

Пример кода для расширения (общий модуль РеглУчетПроведениеСервер):


&Вместо("ЗарегистрироватьКОтражениюВРеглУчете")
Процедура Расш_ЗарегистрироватьКОтражениюВРеглУчете(Объект, ДополнительныеСвойства)
    
    // Вызываем оригинальный метод для стандартной обработки
    ПродолжитьВызов(Объект, ДополнительныеСвойства);
    
    // Дополнительная проверка: если это документ "Этап производства"
    Если ТипЗнч(Объект) = Тип("ДокументОбъект.ЭтапПроизводства2_4") Тогда
        
        // Проверяем, пустой ли период заполнения (то есть изменений в документе не было)
        ПериодЗаполнения = Неопределено;
        Если ДополнительныеСвойства.Свойство("ПериодЗаполненияВидовЗапасовИСебестоимости") Тогда
            ПериодЗаполнения = ДополнительныеСвойства.ПериодЗаполненияВидовЗапасовИСебестоимости;
        КонецЕсли;
        
        Если ПериодЗаполнения = Дата('00010101') Тогда
            // Если изменений нет, принудительно защищаем старые движения от перезаписи.
            // Устанавливаем признак выборочной регистрации только для будущих/открытых дат,
            // либо вообще взводим флаг НеРегистрироватьКОтражениюВРеглУчете для уже отраженных строк.
            ДополнительныеСвойства.Вставить("НеРегистрироватьКОтражениюВРеглУчете", Истина);
        КонецЕсли;
        
    КонецЕсли;
    
КонецПроцедуры

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

Выводы

Поведение системы 1С:ERP при перезаписи длительных документов Этап производства без изменений ТЧ является следствием архитектурного компромисса между производительностью проведения и точностью отражения данных. Для стабильной работы учетной системы на крупном предприятии рекомендуется своевременно локализовать эту особенность программного кода и внедрить защитные механизмы (организационные ограничения либо точечную программную доработку через расширение конфигурации).

← На главную