В процессе эксплуатации крупных информационных баз 1С часто возникает ситуация, когда справочники переполняются неактуальными данными. Типичный пример: сотрудники (кассиры или менеджеры) вместо правильной работы с карточками номенклатуры переименовывают их в «Х» или «Мусор» и перемещают в архивные папки. Со временем количество таких записей может достигать миллионов, что существенно замедляет работу системы. В данной статье мы разберем, как эффективно очистить базу от подобного «хлама», сохранив при этом целостность данных.
Прежде чем приступать к физическому удалению, проанализируем ситуацию. Если номенклатура была переименована в «Х», но ранее по ней проводились документы (поступления, продажи, перемещения), то стандартный механизм удаления 1С не позволит её стереть. Это связано с контролем ссылочной целостности. Если же принудительно удалить объект, в старых документах вместо названия товара появится пугающая надпись <Объект не найден> (так называемая «битая ссылка»).
Рассмотрим основные способы решения этой задачи, от стандартных до продвинутых инструментов разработчика.
В современных конфигурациях на базе Библиотеки стандартных подсистем (БСП) существует встроенная обработка «Удаление помеченных объектов». Посмотрим, как использовать её возможности максимально эффективно:
Важный момент: при миллионных объемах данных стандартная обработка может работать крайне медленно, так как она проверяет каждую ссылку в транзакции. Для ускорения процесса выполним удаление в периоды минимальной нагрузки на базу (ночью или в выходные).
Если штатные средства не справляются или работают слишком долго, рассмотрим использование специализированных внешних обработок. Одним из проверенных решений является набор инструментов tools_ui_1c или аналогичные универсальные обработки с порталов разработчиков.
Преимущества внешних обработок:
SQL.Для программиста 1С существует возможность написать скрипт для удаления объектов. Однако здесь нужно быть предельно осторожными. Посмотрим на пример кода, который позволяет пометить объекты на удаление программно:
Выборка = Справочники.Номенклатура.Выбрать(Справочники.Номенклатура.НайтиПоНаименованию("Мусор"));
Пока Выборка.Следующий() Цикл
Объект = Выборка.ПолучитьОбъект();
Объект.УстановитьПометкуУдаления(Истина);
КонецЦикла;
Если же мы решим использовать метод Удалить() вместо УстановитьПометкуУдаления(), система произведет непосредственное удаление. Помните, что вызов этого метода без предварительной проверки НайтиПоСсылкам() приведет к появлению битых ссылок в базе данных.
Как выясним из практики опытных администраторов, массовую очистку лучше всего проводить после закрытия периода и создания резервной копии. Проанализируем ситуацию: если часть «хлама» — это действительно ошибочно созданные копии, которые не участвовали в движениях, их удаление пройдет безболезненно.
Если же документы с этой номенклатурой все же есть, рассмотрим следующий алгоритм действий:
После того как миллион записей будет удален, физический размер базы данных (особенно в файловом варианте) не уменьшится автоматически. Чтобы вернуть свободное место операционной системе, выполним следующие шаги:
Shrink для базы данных и лога транзакций через SQL Management Studio, а также обновим статистики и реорганизуем индексы, так как массовое удаление вызывает их сильную дефрагментацию.Подведем итог: удаление огромного массива данных — это комплексная задача, требующая предварительного анализа ссылок. Никогда не удаляйте данные непосредственно, если не уверены, что они не использовались в первичных документах. Использование стратегии «замены на один объект» является наиболее безопасным и технически грамотным решением для очистки справочника Номенклатура.