Свертка информационной базы — это сложный процесс, который требует не только технических навыков, но и глубокого понимания бизнес-логики предприятия. Когда речь заходит о нетиповой конфигурации «1С:Управление торговлей» (УТ), стандартные механизмы могут давать сбои. Проанализируем, как подготовить план свертки, решить проблему «зависших» заказов и минимизировать риск потери данных.
Прежде чем приступать к коду, выясним причину свертки. Обычно это замедление работы файловой базы или требование законодательства (например, переход на «Виртуальный склад»). Рассмотрим два основных подхода:
КорректировкаЗаписейРегистров (КЗР), после чего удаляет старые документы.ВыгрузкаЗагрузкаДанныхXML.epf. Этот метод предпочтительнее для сильно измененных конфигураций, так как позволяет избавиться от накопленного «мусора» в системных таблицах.Проанализируем ситуацию автора: база 2016 года, нетиповая, с большим количеством заказов. В этом случае нам придется комбинировать методы.
Основная проблема заказов при свертке заключается в том, что они делают движения по регистрам накопления, таким как ТоварыВРезервеНаСкладах, ЗаказыПокупателей и РазмещениеЗаказовПокупателей. Если просто удалить документ заказа, у которого есть остаток по регистру, возникнет «битый» остаток, который нельзя будет списать стандартными средствами.
Разберем алгоритм обработки заказов по шагам:
ЗаказыПокупателей, значит, перед нами либо недопоставка, либо недоплата. Свертка должна перенести этот остаток в документ ввода остатков, сохранив ссылку на заказ как на объект аналитики.Рассмотрим пример кода, который поможет нам быстро проанализировать, какие заказы имеют незакрытые остатки перед началом процедуры:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЗаказыПокупателейОстатки.ЗаказПокупателя КАК Заказ,
| ЗаказыПокупателейОстатки.СуммаВзаиморасчетовОстаток КАК СуммаОстаток
|ИЗ
| РегистрНакопления.ЗаказыПокупателей.Остатки(&ДатаСвертки, ) КАК ЗаказыПокупателейОстатки
|ГДЕ
| ЗаказыПокупателейОстатки.СуммаВзаиморасчетовОстаток <> 0";
Результат = Запрос.Выполнить().Выбрать();
Пока Результат.Следующий() Цикл
Сообщить("Заказ " + Результат.Заказ + " имеет остаток: " + Результат.СуммаОстаток);
КонецЦикла;
При свертке типовая обработка создает документы ВводОстатков. Часто эти документы требуют указания «Документа расчетов». Если свертка удалит старые документы, в новых записях появятся ссылки «Объект не найден». Это критично для партионного учета и взаиморасчетов.
Выясним, как этого избежать. Рассмотрим методику «технической заглушки»:
Вместо того чтобы оставлять ссылки на тысячи старых документов, создадим один документ КорректировкаДолга или СписаниеБезналичныхДенежныхСредств датой, предшествующей свертке. Назовем его «Технический документ для свертки». При формировании документов ввода остатков программно заменим все ссылки на этот объект.
Проанализируем пример функции для замены ссылок в табличной части документа ввода остатков:
Процедура ЗаменитьСсылкиНаЗаглушку(ДокументОбъект, ТехЗаглушка)
Для Каждого СтрокаТЧ Из ДокументОбъект.Взаиморасчеты Цикл
Если СтрокаТЧ.ДокументРасчетов.Дата < '20230101' Тогда // Дата свертки
СтрокаТЧ.ДокументРасчетов = ТехЗаглушка;
КонецЕсли;
КонецЦикла;
ДокументОбъект.Записать();
КонецПроцедуры
Посмотрим на ситуацию с доработками. Если в конфигурации есть самописные регистры накопления или сведений, типовая свертка о них «не знает». Вам необходимо:
КорректировкаЗаписейРегистров, куда записываются входящие остатки на дату свертки.Важный момент: регистры оборотов (например, Продажи) сворачивать не нужно — они просто очищаются вместе с удалением документов за прошлые периоды.
Разберем последовательность действий, которую рекомендуется соблюдать для успешного результата:
.dt и загрузку обратно, чтобы физически уменьшить размер файла.Рассмотрим финальный совет: если ваша цель — ускорение работы, помните, что свертка в 1С 8.3 часто дает лишь кратковременный эффект. Если база работает в файловом режиме и в ней одновременно находятся более 10 пользователей, проанализируем возможность перехода на клиент-серверный вариант (SQL). Это решит проблемы с блокировками и производительностью надежнее, чем ежегодная обрезка данных.
Однако, если свертка неизбежна (например, для очистки базы перед обновлением на актуальный релиз с «Виртуальным складом»), используйте метод переноса остатков в чистую базу. Это позволит вам получить «здоровую» конфигурацию без старых ошибок в метаданных и лишних доработок прошлых лет.