Свертка базы данных в «1С:Розница 2.3» — это процедура, к которой прибегают для повышения производительности и уменьшения объема файловой базы (обычно при достижении порога в 10–15 ГБ). Однако часто после стандартной обработки СверткаИнформационнойБазы пользователи сталкиваются с критическими проблемами: перестают действовать накопительные скидки, исчезают виды цен, а помеченные на удаление документы (особенно чеки ККМ) остаются в базе «мертвым грузом».
В этой статье мы подробно разберем, почему возникают эти ошибки и как привести базу в рабочее состояние после неудачной или неполной свертки.
Рассмотрим механизм работы скидок в «1С:Розница». Накопительные дисконтные карты опираются на данные регистра накопления ПродажиПоДисконтнымКартам. Когда мы выполняем свертку на определенную дату, программа должна сформировать документы ВводОстатковПоДисконтнымКартам, которые фиксируют сумму накоплений на момент «отсечки».
Выясним причину сбоя:
ВводОстатковПоДисконтнымКартам не проведен, регистр накопления пуст, и программа считает, что накоплений по карте нет.ФизическиеЛица. Если в процессе свертки или последующего удаления объектов были затронуты связи между картой и владельцем, скидка может не срабатывать из-за настроек в маркетинговых акциях (например, если стоит проверка по владельцу).Решение: Проверьте наличие движений в регистре накопления ПродажиПоДисконтнымКартам. Если они отсутствуют, необходимо найти все документы ВводОстатковПоДисконтнымКартам и перепровести их. Если данные утеряны, их можно восстановить из архивной копии с помощью обработки ВыгрузкаЗагрузкаДанныхXML83.epf, выгрузив только этот тип документов и связанные с ними регистры.
Закупочные цены в «Рознице» хранятся в регистре сведений ЦеныНоменклатуры. В отличие от остатков товаров, которые сворачиваются в документ ВводОстатков, записи в регистрах сведений при свертке могут просто очищаться до определенной даты.
Проанализируем ситуацию: если закупочная цена устанавливалась автоматически при проведении документа ПоступлениеТоваров, то после удаления этих поступлений (как старых документов) связь в системе может нарушиться. Если на дату свертки не было создано актуальной записи в регистре цен, программа будет показывать нулевую цену. Для автоматической фиксации среза цен можно использовать обработку для свертки цен и формирования документа установки цен.
Как восстановить цены:
УстановкаЦенНоменклатуры. Это наиболее правильный метод. Перед сверткой или сразу после нее нужно зафиксировать текущие цены этим документом.Это самая сложная техническая задача. Ситуация, когда база после свертки уменьшилась незначительно (например, с 17 ГБ до 12 ГБ), хотя удалены миллионы документов, говорит о том, что физического удаления объектов не произошло.
Проанализируем, почему УдалениеПомеченныхОбъектов не справляется:
ПродажиПоДисконтнымКартам. Если свертка перенесла накопления, она создала ссылки на старые чеки. Пока эти ссылки существуют, 1С не позволит удалить объект для соблюдения ссылочной целостности.ЗамерыПроизводительности. В интенсивно работающих магазинах он может раздувать базу на 5–8 ГБ. Свертка его часто игнорирует. Его нужно очистить вручную.ВерсииОбъектов хранятся копии всех миллионов чеков. Удаление самого чека не всегда автоматически очищает его историю в этом регистре.Посмотрим на техническое ограничение: На 32-разрядной платформе процесс удаления такого объема данных практически невозможен. Программа упирается в лимит выделяемой памяти (2–4 ГБ), что приводит к аварийному завершению или бесконечному «зависанию».
Рассмотрим последовательность действий, которая поможет реально уменьшить размер базы и завершить свертку:
Шаг 1: Переход на 64-битную платформу. Для работы с файловой базой более 10 ГБ это обязательное условие. Только 64-битный сеанс сможет адресовать достаточно памяти для построения таблицы ссылок при удалении миллионов объектов.
Шаг 2: Ручная очистка технических регистров. Перед запуском стандартного удаления выполните очистку регистров, которые не несут бизнес-ценности, но держат ссылки на документы. Напишем пример простого кода для очистки регистра (использовать в консоли кода):
НаборЗаписей = РегистрыСведений.ЗамерыПроизводительности.СоздатьНаборЗаписей();
// Набор пустой, записываем его, тем самым очищая регистр
НаборЗаписей.Записать();
Аналогично стоит поступить с регистром ВерсииОбъектов, если он переполнен.
Шаг 3: Удаление порциями. Не пытайтесь удалить все миллионы чеков разом. Используйте доработанные обработки по удалению помеченных объектов, которые позволяют выбирать тип объекта (например, только ЧекККМ) и удалять их порциями по 1000–5000 штук. Это позволит транзакциям завершаться успешно. Для такой задачи подойдёт специализированная обработка для порционного удаления чеков ККМ.
Шаг 4: ТИИ и сжатие таблиц. После того как программа отрапортует об успешном удалении, физический размер файла 1Cv8.1CD не изменится. Это особенность файловой СУБД 1С. Чтобы вернуть место операционной системе, необходимо выполнить Тестирование и исправление (ТИИ) с включенной галочкой «Сжатие таблиц информационной базы». Только после этого страницы базы данных будут переупорядочены, и размер файла уменьшится.
Проанализировав опыт эксплуатации «Розница 2.3», можно сделать вывод: если ваша база стабильно растет более чем на 5 ГБ в год, стандартная свертка будет становиться всё более болезненной. Рассмотрим альтернативы:
ВыгрузкаЗагрузкаДанныхXML переносятся только справочники, настройки и остатки на текущую дату. Этот метод гарантирует отсутствие «мусорных» ссылок и минимальный размер файла.Таким образом, для исправления последствий свертки нам необходимо: восстановить движения в регистре накопления дисконтных карт путем перепроведения ввода остатков, зафиксировать цены документом установки цен и произвести жесткую очистку технических регистров на 64-битной платформе с последующим сжатием таблиц базы.