При работе с крупными информационными системами на базе 1С:ERP Управление предприятием или 1С:Комплексная автоматизация 2 пользователи часто сталкиваются с неприятной ситуацией: после очередного обновления релиза программа начинает требовать пересчет себестоимости за давно закрытые периоды. Например, при попытке закрыть январь текущего года система сообщает о необходимости выполнить операции, начиная с октября пятилетней давности. При этом учетная политика не менялась, а данные в закрытых периодах официально считаются неизменными. Если подобные сложности возникают после оптимизации размера базы, в будущем может использоваться многопоточная свёртка 1С:ERP.
В этой статье мы подробно разберем, почему возникает такая ситуация, проанализируем внутренние механизмы контроля актуальности данных и рассмотрим проверенные способы решения проблемы без открытия прошлых периодов и нарушения целостности учета.
Давайте выясним, как помощник закрытия месяца понимает, что данные в прошлом изменились. В современных версиях 1С (начиная с партионного учета 2.2) классические последовательности документов ушли в прошлое. Их заменила система регистров заданий. Это специальные регистры сведений, в которые записывается информация каждый раз, когда происходит событие, потенциально влияющее на себестоимость или финансовый результат.
Рассмотрим основные причины появления таких «фантомных» требований после обновления:
КлючиАналитикиУчетаНоменклатуры. Несмотря на то, что документы не меняются, перезапись ключа аналитики создает запись в регистре заданий, сигнализируя системе: «Данные изменились, нужно пересчитать».РасчетСебестоимости, но и корректность записей в регистре ВыручкаИСебестоимостьПродаж. Если в этом регистре обнаруживаются записи, не подтвержденные расчетом за тот же период, система выдает ошибку.ВводОстатков могут создавать движения по регистру выручки за прошлые периоды для целей построения отчетов по продажам. Система видит эти движения и требует их «обработать» расчетом себестоимости.Это самый эффективный и быстрый способ, если вы уверены, что данные в прошлых периодах верны и не требуют изменений. Нам необходимо удалить «флажки», которые заставляют систему смотреть в прошлое.
Проанализируем список регистров, которые необходимо проверить и очистить. Все они начинаются с префикса «Задания к...»:
ЗаданияКРасчетуСебестоимости — основной виновник проблем с себестоимостью.ЗаданияКРаспределениюРасчетовСПоставщиками и ЗаданияКРаспределениюРасчетовСКлиентами — влияют на расчет курсовых разниц и доп. расходов, которые косвенно тянут за собой себестоимость.ЗаданияКОтражениюВРегламентированномУчете — если система считает, что не все проводки сформированы.ЗаданияКРаспределениюЗапасов — отвечает за актуальность распределения товаров по организациям и складам.Порядок действий:
Задания к расчету себестоимости.После этой манипуляции вернемся в рабочее место «Закрытие месяца» и нажмем кнопку «Обновить». Система перечитает состояние заданий и, не найдя записей в регистрах, сочтет периоды актуальными. Для автоматизации этого процесса можно использовать обработку для удаления заданий и пропуска этапов закрытия периода.
Рассмотрим ситуацию, описанную программистами при свертке базы. В модуле РасчетСебестоимостиПрикладныеАлгоритмы существует функция ОрганизацииСДвижениямиПоСебестоимости. Проанализируем запрос внутри этой функции. Он ищет записи в регистре ВыручкаИСебестоимостьПродаж, для которых нет соответствующего документа закрытия месяца.
Если проблема вызвана документами Ввод остатков оптовых продаж, которые создают движения прошлым периодом, у нас есть два пути:
Путь А: Создание пустых документов расчета. Мы можем программно создать документы Расчет себестоимости товаров за каждый «проблемный» месяц в прошлом. В этих документах достаточно установить статус «Рассчитано» и провести их, не заполняя фактическими данными (либо заполнив только технические поля). Это «закроет» проверку системы.
Путь Б: Доработка запроса (не рекомендуется). Можно изменить логику функции в расширении, чтобы она игнорировала движения, сделанные документами ввода остатков. Примерный алгоритм поиска проблемы в коде:
// Фрагмент логики в модуле РасчетСебестоимостиПрикладныеАлгоритмы
Функция ОрганизацииСДвижениямиПоСебестоимости(Период, Организация) Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| Выручка.Организация КАК Организация
|ИЗ
| РегистрНакопления.ВыручкаИСебестоимостьПродаж КАК Выручка
|ГДЕ
| Выручка.Период МЕЖДУ &НачалоПериода И &КонецПериода
| И НЕ ВЫРАЗИТЬ(Выручка.Регистратор КАК Документ.РасчетСебестоимостиТоваров) ССЫЛКА Документ.РасчетСебестоимостиТоваров";
// ... дальнейшая логика проверки наличия документа расчета
КонецФункции
Проанализировав этот запрос, мы понимаем, что любое движение в регистре выручки, не являющееся самим документом расчета, трактуется системой как необходимость действия.
Если очистка заданий не помогает, и помощник все равно настойчиво требует пересчета, посмотрим на регистр сведений Статусы закрытия месяца. В этом регистре хранится финальное состояние каждого этапа для каждой организации.
Мы можем воспользоваться консолью запросов или внешней обработкой, чтобы принудительно установить статус Выполнено для этапа «Расчет себестоимости». Рассмотрим пример записи в этот регистр:
МенеджерЗаписи = РегистрыСведений.СтатусыЗакрытияМесяца.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Период = Дата("20171001");
МенеджерЗаписи.Организация = ВыбраннаяОрганизация;
МенеджерЗаписи.Этап = ПредопределенноеЗначение("Перечисление.ЭтапыЗакрытияМесяца.РасчетСебестоимости");
МенеджерЗаписи.Статус = ПредопределенноеЗначение("Перечисление.СтатусыВыполненияЭтаповЗакрытияМесяца.ВыполненоУспешно");
МенеджерЗаписи.Записать();
Важный нюанс: Данный метод является «косметическим». Он убеждает помощника закрытия месяца, что всё хорошо, но если в базе остались записи в ЗаданияКРасчетуСебестоимости, при следующем обновлении данных ситуация может повториться.
Чтобы избежать подобных проблем в будущем, рекомендуем придерживаться следующих правил:
Подведем итог. В большинстве случаев для «победы» над требованием пересчета достаточно полной очистки регистров сведений группы «Задания к...» за прошлые периоды. Это безопасная операция, так как она не удаляет первичные документы и проводки, а лишь сбрасывает технические флаги планировщика задач 1С.