1С:Розница 2.3: Как исправить ошибки после свертки базы и удалить миллионы чеков?

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

Свертка базы данных в «1С:Розница 2.3» — это процедура, к которой прибегают для повышения производительности и уменьшения объема файловой базы (обычно при достижении порога в 10–15 ГБ). Однако часто после стандартной обработки СверткаИнформационнойБазы пользователи сталкиваются с критическими проблемами: перестают действовать накопительные скидки, исчезают виды цен, а помеченные на удаление документы (особенно чеки ККМ) остаются в базе «мертвым грузом».

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

Проблема 1: Почему перестали работать дисконтные карты?

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

Выясним причину сбоя:

  1. Непроведенные документы: Часто после свертки документы ввода остатков создаются, но не проводятся автоматически или их случайно распроводят пользователи. Если документ ВводОстатковПоДисконтнымКартам не проведен, регистр накопления пуст, и программа считает, что накоплений по карте нет.
  2. Дублирование строк: При большом объеме данных свертка может дробить ввод остатков на десятки документов (например, по 10 000 строк в каждом). Если хотя бы один из них содержит ошибку или не был перенесен, цепочка накоплений разрывается.
  3. Связь с владельцем: Проанализируем справочник ФизическиеЛица. Если в процессе свертки или последующего удаления объектов были затронуты связи между картой и владельцем, скидка может не срабатывать из-за настроек в маркетинговых акциях (например, если стоит проверка по владельцу).

Решение: Проверьте наличие движений в регистре накопления ПродажиПоДисконтнымКартам. Если они отсутствуют, необходимо найти все документы ВводОстатковПоДисконтнымКартам и перепровести их. Если данные утеряны, их можно восстановить из архивной копии с помощью обработки ВыгрузкаЗагрузкаДанныхXML83.epf, выгрузив только этот тип документов и связанные с ними регистры.

Проблема 2: Куда пропали закупочные цены?

Закупочные цены в «Рознице» хранятся в регистре сведений ЦеныНоменклатуры. В отличие от остатков товаров, которые сворачиваются в документ ВводОстатков, записи в регистрах сведений при свертке могут просто очищаться до определенной даты.

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

Как восстановить цены:

  1. Используйте документ УстановкаЦенНоменклатуры. Это наиболее правильный метод. Перед сверткой или сразу после нее нужно зафиксировать текущие цены этим документом.
  2. Загрузка через Excel. Если база уже свернута и старые документы удалены, проще всего выгрузить актуальные цены из архивной копии в таблицу и загрузить их в новую базу через стандартную обработку «Загрузка данных из файла».

Проблема 3: Миллионы чеков не удаляются — в чем причина?

Это самая сложная техническая задача. Ситуация, когда база после свертки уменьшилась незначительно (например, с 17 ГБ до 12 ГБ), хотя удалены миллионы документов, говорит о том, что физического удаления объектов не произошло.

Проанализируем, почему УдалениеПомеченныхОбъектов не справляется:

  1. Блокирующие ссылки: Чеки ККМ связаны с огромным количеством регистров. Основной виновник — ПродажиПоДисконтнымКартам. Если свертка перенесла накопления, она создала ссылки на старые чеки. Пока эти ссылки существуют, 1С не позволит удалить объект для соблюдения ссылочной целостности.
  2. Регистр «Замеры производительности»: Посмотрим на регистр сведений ЗамерыПроизводительности. В интенсивно работающих магазинах он может раздувать базу на 5–8 ГБ. Свертка его часто игнорирует. Его нужно очистить вручную.
  3. Версионирование объектов: Если включена история изменений, то в регистре ВерсииОбъектов хранятся копии всех миллионов чеков. Удаление самого чека не всегда автоматически очищает его историю в этом регистре.

Посмотрим на техническое ограничение: На 32-разрядной платформе процесс удаления такого объема данных практически невозможен. Программа упирается в лимит выделяемой памяти (2–4 ГБ), что приводит к аварийному завершению или бесконечному «зависанию».

Пошаговый алгоритм очистки базы

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

Шаг 1: Переход на 64-битную платформу. Для работы с файловой базой более 10 ГБ это обязательное условие. Только 64-битный сеанс сможет адресовать достаточно памяти для построения таблицы ссылок при удалении миллионов объектов.

Шаг 2: Ручная очистка технических регистров. Перед запуском стандартного удаления выполните очистку регистров, которые не несут бизнес-ценности, но держат ссылки на документы. Напишем пример простого кода для очистки регистра (использовать в консоли кода):


НаборЗаписей = РегистрыСведений.ЗамерыПроизводительности.СоздатьНаборЗаписей();
// Набор пустой, записываем его, тем самым очищая регистр
НаборЗаписей.Записать();

Аналогично стоит поступить с регистром ВерсииОбъектов, если он переполнен.

Шаг 3: Удаление порциями. Не пытайтесь удалить все миллионы чеков разом. Используйте доработанные обработки по удалению помеченных объектов, которые позволяют выбирать тип объекта (например, только ЧекККМ) и удалять их порциями по 1000–5000 штук. Это позволит транзакциям завершаться успешно. Для такой задачи подойдёт специализированная обработка для порционного удаления чеков ККМ.

Шаг 4: ТИИ и сжатие таблиц. После того как программа отрапортует об успешном удалении, физический размер файла 1Cv8.1CD не изменится. Это особенность файловой СУБД 1С. Чтобы вернуть место операционной системе, необходимо выполнить Тестирование и исправление (ТИИ) с включенной галочкой «Сжатие таблиц информационной базы». Только после этого страницы базы данных будут переупорядочены, и размер файла уменьшится.

Важные рекомендации при работе с крупными базами «Розницы»

Проанализировав опыт эксплуатации «Розница 2.3», можно сделать вывод: если ваша база стабильно растет более чем на 5 ГБ в год, стандартная свертка будет становиться всё более болезненной. Рассмотрим альтернативы:

Таким образом, для исправления последствий свертки нам необходимо: восстановить движения в регистре накопления дисконтных карт путем перепроведения ввода остатков, зафиксировать цены документом установки цен и произвести жесткую очистку технических регистров на 64-битной платформе с последующим сжатием таблиц базы.

← На главную