Переход на новые релизы 1С:Комплексная автоматизация (начиная с 2.5.12 и выше, особенно в ветке 2.5.16) часто сопровождается сюрпризами при попытке перезакрыть прошлые периоды. Одной из самых неприятных ошибок является сообщение системы: «Внимание! Требуется исправление остатков взаиморасчетов. Исправить остатки автоматически невозможно, так как введен некорректный документ Корректировка регистров». Это происходит потому, что механизмы контроля взаиморасчетов стали более жесткими, а структура хранения данных изменилась.
В этой статье мы подробно разберем, как исправить «красные поля» в корректировках регистров за прошлые годы, не вызывая при этом цепную реакцию перезакрытия всех последующих месяцев. Мы проанализируем причины возникновения ошибки и воспользуемся программными методами решения задачи.
Разберем по шагам, что именно ломается при обновлении. В версии 2.5.16 фирма «1С» завершила масштабную унификацию механизмов взаиморасчетов. Даже если в настройках вашей системы все еще выбран «офлайн» режим, программный код уже активно использует структуры, характерные для онлайн-взаиморасчетов.
Проанализируем основные изменения:
ОбъектыРасчетов. Если в старой корректировке заполнена прямая ссылка, а поле объекта расчетов пустое, система подчеркнет его красным и откажется закрывать месяц.Если мы просто откроем документ Корректировка регистров, внесем изменения и нажмем «Записать», система немедленно пометит все последующие периоды как требующие перезакрытия. Чтобы «обмануть» этот механизм, мы применим программную запись с использованием специального признака.
Рассмотрим основной способ — использование свойства ОбменДанными.Загрузка = Истина. Это свойство отключает стандартные проверки при записи и, что самое важное, блокирует работу подписок на события, которые ставят период в очередь на перезакрытие.
Разберем пример кода для программного исправления движений документа:
// Определяем ссылку на наш документ корректировки
СсылкаНаДокумент = Документы.КорректировкаРегистров.НайтиПоНомеру("0000-000001", Дата("20240101"));
// Работаем с набором записей конкретного регистра, например, РасчетыСКлиентами
НаборЗаписей = РегистрыНакопления.РасчетыСКлиентами.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(СсылкаНаДокумент);
НаборЗаписей.Прочитать();
// Перебираем записи и заполняем недостающие реквизиты
Для Каждого Запись Из НаборЗаписей Цикл
// Проверяем заполнение объекта расчетов
Если Не ЗначениеЗаполнено(Запись.ОбъектРасчетов) Тогда
// Здесь должна быть логика поиска или создания объекта расчетов на основании Заказа/Накладной
Запись.ОбъектРасчетов = ПолучитьОбъектРасчетов(Запись.ЗаказКлиента);
КонецЕсли;
КонецЦикла;
// Записываем набор с признаком Загрузка = Истина
НаборЗаписей.ОбменДанными.Загрузка = Истина;
НаборЗаписей.Записать();
Посмотрим на этот процесс подробнее. При использовании метода Записать() с флагом Загрузка = Истина система не выполняет пересчет итогов и не регистрирует изменения в планах обмена. Это идеальный инструмент для «точечной хирургии» в закрытых периодах.
Одной из самых частых причин «красных полей» является отсутствие связи с Объектом расчетов. В новых релизах КА этот справочник является ключевым звеном. Если вы видите, что поле пустое, вам необходимо либо найти существующий объект для данного документа основания (Заказа или Реализации), либо создать его.
Проанализируем, как можно программно получить объект расчетов, если он не был создан при обновлении:
Функция ПолучитьОбъектРасчетов(ДокументОснование)
// Попытаемся найти объект расчетов, привязанный к документу
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| ОбъектыРасчетов.Ссылка КАК Ссылка
|ИЗ
| Справочник.ОбъектыРасчетов КАК ОбъектыРасчетов
|ГДЕ
| ОбъектыРасчетов.Объект = &Объект";
Запрос.УстановитьПараметр("Объект", ДокументОснование);
Результат = Запрос.Выполнить();
Если Не Результат.Пустой() Тогда
Выборка = Результат.Выбрать();
Выборка.Следующий();
Возврат Выборка.Ссылка;
Иначе
// Если объект не найден, его создание требует осторожности
// В типовых решениях для этого есть специальные модули
Возврат Справочники.ОбъектыРасчетов.ПустаяСсылка();
КонецЕсли;
КонецФункции
Даже если вы записали движения документа через Загрузка = Истина, иногда система все равно может «заметить» изменения через механизмы платформенного контроля или если вы случайно затронули сам объект документа (шапку), а не только его движения.
Выясним причину, по которой статус периода в мониторе закрытия месяца меняется на «Требуется выполнение». Это происходит из-за появления записей в специальных регистрах сведений — регистрах заданий. В 1С:КА 2.5 это такие регистры как:
ЗаданияКРаспределениюРасчетовЗаданияКОтражениюВРегламентированномУчетеОчередьЗаданийЗакрытияМесяцаРазберем алгоритм действий для сохранения статуса «Закрыто»:
Важно: Это действие нужно выполнять крайне осторожно и только в том случае, если вы на 100% уверены, что ваша правка корректировки регистров не вносит реального искажения в данные, а лишь заполняет технические поля для совместимости с новым релизом.
Посмотрим на ситуацию со стороны рисков. Любая ручная корректировка регистров — это «мина замедленного действия». При каждом крупном обновлении логика работы с этими данными может меняться. Чтобы минимизировать проблемы в будущем, придерживайтесь следующих правил:
Корректировка регистров для исправления взаиморасчетов. Лучше использовать штатные документы, такие как Взаимозачет задолженности или Корректировка задолженности, так как они содержат встроенные обработчики обновления и автоматически поддерживают целостность данных.Проанализировав ситуацию, мы видим, что проблема «красных полей» в КА 2.5.16 — это следствие эволюции метаданных. Использование Загрузка = Истина в сочетании с очисткой регистров заданий позволяет решить проблему оперативно и без остановки работы бухгалтерии на период перепроведения старых данных.