Как убрать требование пересчета себестоимости за прошлые годы в 1С:ERP и КА 2 после обновления или свертки базы

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

При работе с крупными информационными системами на базе 1С:ERP Управление предприятием или 1С:Комплексная автоматизация 2 пользователи часто сталкиваются с неприятной ситуацией: после очередного обновления релиза программа начинает требовать пересчет себестоимости за давно закрытые периоды. Например, при попытке закрыть январь текущего года система сообщает о необходимости выполнить операции, начиная с октября пятилетней давности. При этом учетная политика не менялась, а данные в закрытых периодах официально считаются неизменными. Если подобные сложности возникают после оптимизации размера базы, в будущем может использоваться многопоточная свёртка 1С:ERP.

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

Разберем причину: почему система требует пересчета?

Давайте выясним, как помощник закрытия месяца понимает, что данные в прошлом изменились. В современных версиях 1С (начиная с партионного учета 2.2) классические последовательности документов ушли в прошлое. Их заменила система регистров заданий. Это специальные регистры сведений, в которые записывается информация каждый раз, когда происходит событие, потенциально влияющее на себестоимость или финансовый результат.

Рассмотрим основные причины появления таких «фантомных» требований после обновления:

  1. Обновление ключей аналитики: При переходе на новый релиз часто запускаются обработчики обновления. Они могут изменять записи в системных справочниках, таких как КлючиАналитикиУчетаНоменклатуры. Несмотря на то, что документы не меняются, перезапись ключа аналитики создает запись в регистре заданий, сигнализируя системе: «Данные изменились, нужно пересчитать».
  2. Усиление контроля в новых релизах: Разработчики 1С постоянно совершенствуют алгоритмы проверки. В свежих версиях программа может проверять не только наличие документа РасчетСебестоимости, но и корректность записей в регистре ВыручкаИСебестоимостьПродаж. Если в этом регистре обнаруживаются записи, не подтвержденные расчетом за тот же период, система выдает ошибку.
  3. Эффект от свертки базы: Если вы проводили свертку, документы ВводОстатков могут создавать движения по регистру выручки за прошлые периоды для целей построения отчетов по продажам. Система видит эти движения и требует их «обработать» расчетом себестоимости.

Способ 1: Очистка регистров сведений «Задания к...»

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

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

Порядок действий:

  1. Перейдем в меню «Функции для технического специалиста» (или воспользуемся ссылкой на регистр).
  2. Найдем регистр сведений Задания к расчету себестоимости.
  3. Отфильтруем записи по дате или организации, если это необходимо. Если требуется «забыть» всё старое, мы можем просто удалить все записи за периоды до начала текущего года. При необходимости полной очистки информационной базы от сведений по конкретной компании применяется выборочное удаление организаций.
  4. Повторим процедуру для остальных регистров из группы «Задания к...».

После этой манипуляции вернемся в рабочее место «Закрытие месяца» и нажмем кнопку «Обновить». Система перечитает состояние заданий и, не найдя записей в регистрах, сочтет периоды актуальными. Для автоматизации этого процесса можно использовать обработку для удаления заданий и пропуска этапов закрытия периода.

Способ 2: Программная обработка «фантомных» движений при свертке

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

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

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

Путь Б: Доработка запроса (не рекомендуется). Можно изменить логику функции в расширении, чтобы она игнорировала движения, сделанные документами ввода остатков. Примерный алгоритм поиска проблемы в коде:


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

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

Способ 3: Ручная корректировка статусов закрытия месяца

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

Мы можем воспользоваться консолью запросов или внешней обработкой, чтобы принудительно установить статус Выполнено для этапа «Расчет себестоимости». Рассмотрим пример записи в этот регистр:


МенеджерЗаписи = РегистрыСведений.СтатусыЗакрытияМесяца.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Период = Дата("20171001");
МенеджерЗаписи.Организация = ВыбраннаяОрганизация;
МенеджерЗаписи.Этап = ПредопределенноеЗначение("Перечисление.ЭтапыЗакрытияМесяца.РасчетСебестоимости");
МенеджерЗаписи.Статус = ПредопределенноеЗначение("Перечисление.СтатусыВыполненияЭтаповЗакрытияМесяца.ВыполненоУспешно");
МенеджерЗаписи.Записать();

Важный нюанс: Данный метод является «косметическим». Он убеждает помощника закрытия месяца, что всё хорошо, но если в базе остались записи в ЗаданияКРасчетуСебестоимости, при следующем обновлении данных ситуация может повториться.

Рекомендации по профилактике

Чтобы избежать подобных проблем в будущем, рекомендуем придерживаться следующих правил:

  1. Контроль даты запрета изменения: Убедитесь, что дата запрета установлена для всех пользователей, включая администраторов. Однако помните, что регламентные операции обновления конфигурации часто игнорируют эту дату. Для корректного выполнения технического обслуживания по расписанию может использоваться программа для автоматического обновления и тестирования баз 1С.
  2. Регулярная очистка очередей: Если вы замечаете, что регистры заданий переполнены старыми записями (например, из-за неудачных попыток закрытия месяца в прошлом), очищайте их до того, как начнете обновление на новый тяжелый релиз.
  3. Анализ фоновых заданий: Часто записи в регистры заданий вносятся фоновыми процессами распределения запасов или расчетов. Проверьте настройки регламентных заданий: возможно, стоит отключить автоматическое формирование заданий для периодов, старше определенной даты.

Подведем итог. В большинстве случаев для «победы» над требованием пересчета достаточно полной очистки регистров сведений группы «Задания к...» за прошлые периоды. Это безопасная операция, так как она не удаляет первичные документы и проводки, а лишь сбрасывает технические флаги планировщика задач 1С.

← На главную