Ситуация, когда в крупной информационной системе на базе 1С:ERP 2.5 происходит несанкционированное перепроведение документов за прошлые периоды (включая уже закрытые и сданные в налоговую), является критической. Особенно остро проблема стоит в компаниях с высокой нагрузкой (транспортные услуги, спецтехника), где используется расширение УАТ (Управление автотранспортом). В результате такого сбоя "плывет" себестоимость, возникают разрывы в аналитике по счету 97 (РБП), и стандартное закрытие месяца становится невозможным. Рассмотрим детально, как выйти из этой ситуации и восстановить корректные данные.
Прежде чем приступать к лечению, разберем по шагам, почему это произошло. В 1С:ERP 2.5 механизмы расчета себестоимости тесно связаны с фоновыми заданиями и очередями заданий. Проанализируем основные факторы:
ДатаЗапретаИзменения.ЗаданияКРасчетуСебестоимости и ЗаданияКРаспределениюРасчетов. Если механизм автоматизирован некорректно, система может "подхватить" записи годовой давности.ПрочиеРасходы. При перепроведении первичных документов ПриобретениеТоваровУслуг (ПТУ) связь между управленческим и регламентированным учетом может нарушиться, что приводит к появлению "синтетического сальдо" без субконто на 97 счете.Если база из бэкапа не была восстановлена сразу, а работа пользователей продолжалась (например, в модуле УАТ наклепали множество путевых листов), мы не можем просто "откатиться" назад. В этом случае применим метод переноса движений. Разберем алгоритм действий:
Хозрасчетный, СебестоимостьТоваров, ПрочиеРасходы, ПартииПрочихРасходов и ВыручкаИСебестоимостьПродаж.Проанализируем пример кода, который может быть использован для программной перезаписи движений документа на основе эталонных данных:
// Пример кода для восстановления движений из эталона
Процедура ВосстановитьДвиженияДокумента(ДокументСсылка, ТаблицаЭталонныхДвижений)
НаборЗаписей = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(ДокументСсылка);
// Загружаем таблицу, полученную из бэкапа
НаборЗаписей.Загрузить(ТаблицаЭталонныхДвижений);
// Блокируем пересчет при записи
НаборЗаписей.ОбменДанными.Загрузка = Истина;
НаборЗаписей.Записать();
КонецПроцедуры
Этот метод считается наиболее надежным для сохранения целостности. Рассмотрим его этапы:
УниверсальныйОбменДаннымиXML.Если масштаб бедствия позволяет исправить данные в текущей базе, выясним причину, по которой закрытие месяца не "видит" аналитику РБП. Выясним, что мешает закрытию:
Скорее всего, записи в регистре накопления ПрочиеРасходы не соответствуют проводкам по счету 97. Для исправления ситуации выполним следующие действия:
КорректировкаРегистров для выравнивания остатков в оперативных регистрах на начало текущего месяца.ЗаданияКРасчетуСебестоимости за прошлые периоды. Это можно сделать следующим скриптом:
// Очистка очереди заданий, чтобы ERP не тянула старый год
Набор = РегистрыСведений.ЗаданияКРасчетуСебестоимости.СоздатьНаборЗаписей();
Набор.Отбор.Период.Использовать = Истина;
Набор.Отбор.Период.ВидСравнения = ВидСравнения.Меньше;
Набор.Отбор.Период.Значение = НачалоГода(ТекущаяДата());
Набор.Записать();
После очистки заданий система перестанет пытаться пересчитывать закрытые месяцы при каждом запуске процедуры ЗакрытиеМесяца.
Чтобы в будущем не "запороть" ERP, придерживаемся следующих правил:
Записать(РежимЗаписиДокумента.Проведение) в цикле по старым периодам без проверки даты запрета.РасходыБудущихПериодов. Если в системе используется кастомизированное создание ПТУ фоновым заданием, добавьте в него проверку наличия заполненной аналитики (статьи расходов с нужным вариантом распределения).Резюме: Не паникуйте. Даже если база кажется "запоротой", 1С:ERP позволяет восстановить данные через манипуляции с регистрами. Оптимальный путь — восстановление эталонных движений из бэкапа в текущую базу с одновременной очисткой регистров-заданий. Начинать базу с нуля стоит только в самом крайнем случае, так как перенос остатков по сложной себестоимости в ERP — процесс не менее трудоемкий, чем восстановление текущей БД.