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