В процессе работы в программе «1С:Розница 2.2» пользователи часто сталкиваются с накоплением «мусорной» номенклатуры. Это могут быть позиции, заведенные по ошибке два или три раза, товары-дубли с незначительными различиями в написании, а также товары, которые продавались несколько лет назад и больше никогда не поступят в продажу. Наличие тысяч лишних позиций сильно усложняет работу продавцов на кассе, замедляет процесс инвентаризации и увеличивает вероятность ошибок при подборе.
Попытка просто пометить такие позиции на удаление и запустить стандартное удаление помеченных объектов в 1С часто заканчивается неудачей. Система выдает длинный список документов, которые ссылаются на эту номенклатуру, и отказывается ее удалять. Особенно часто процессу мешают такие документы, как Начальные остатки узла и Расчет и установка себестоимости. Давайте разберем по шагам, почему возникает эта проблема и какими способами можно эффективно очистить справочник номенклатуры от позиций без остатков.
Рассмотрим подробнее механизм работы платформы 1С 8.3. Свертка информационной базы предназначена для сокращения объема данных путем удаления старых документов и формирования документов ввода остатков на определенную дату. Однако свертка не удаляет сами справочники, если на их элементы есть хотя бы одна ссылка в системе.
Документы ценообразования (например, Установка цен номенклатуры) и расчетные документы (Расчет и установка себестоимости) создают записи в независимых и подчиненных регистрах сведений (таких как «Цены номенклатуры» или «Себестоимость номенклатуры»). Даже если сам исторический документ поступления или продажи был удален в процессе свертки, записи о ценах и себестоимости на этот товар остаются в базе данных. Платформа видит эти связи и блокирует физическое удаление карточки товара. Выясним, как обойти эти ограничения и безопасно очистить базу.
Рассмотрим оригинальный практический способ, предложенный пользователями на практике. Суть метода заключается в том, чтобы «перекрыть» актуальные остатки новыми документами ценообразования, а старые служебные документы принудительно пометить на удаление. Разберем этот алгоритм по шагам:
Установка цен номенклатуры. Выбираем нужные виды цен (например, закупочную и розничную). Переходим к заполнению табличной части и с помощью отбора выбираем только те товары, по которым на текущий момент есть положительные остатки на складах. Записываем и проводим этот документ. Он будет служить защитой от удаления для нужных нам позиций.Установка цен номенклатуры. Этот документ рекомендуется провести датой, следующей за днем ревизии.Пересчет товаров (инвентаризацию) также следующим днем после свертки, чтобы зафиксировать фактические остатки работающих позиций.Начальные остатки узла и Расчет и установка себестоимости, которые мешали удалению, и принудительно помечаем их на удаление.Удаление помеченных объектов. Номенклатура без остатков успешно удалится из базы, так как на нее больше не ссылаются проведенные документы. Товары, по которым есть остатки, система удалить не позволит, так как их защищают новые документы пересчета товаров и установки цен. В этих документах как раз и останутся только нужные позиции.Если документов в базе слишком много за несколько лет работы и физическое удаление позиций может нарушить целостность старых отчетов, отличным решением будет метод «схлопывания» неиспользуемых позиций на один служебный элемент.
Проанализируем этот подход: вместо физического удаления 2500 позиций мы заменим все ссылки на них в старых документах на один-единственный элемент справочника. Для этого выполним следующие действия:
_Архивный товар (не используется). Символ подчеркивания или буква «я» в начале названия помогут отправить этот элемент в самый конец или начало списка, чтобы он не мешал продавцам.Номенклатура. В правилах отбора настраиваем фильтр: выбирать только те товары, по которым отсутствуют остатки на складах (для этого можно предварительно перенести все ненужные товары в отдельную папку «Мусор» и указать в отборе поиск только в этой папке)._Архивный товар (не используется).Этот способ является наиболее безопасным для транзакционной целостности базы данных, так как исторические документы проведения не будут повреждены или помечены на удаление.
Часто пользователи не могут пометить на удаление служебные документы, такие как Начальные остатки узла, обычными интерфейсными методами. Чтобы решить эту задачу, воспользуемся встроенным инструментом разработчика:
Ввод начальных остатков узла или другой мешающий документ.ПометкаУдаления (Пометка на удаление), устанавливаем напротив него галочку и выбираем значение Да.Если база данных эксплуатируется много лет, сильно захламлена и содержит огромное количество исторических документов, лучшим техническим решением будет создание новой чистой информационной базы и перенос в нее исключительно актуальных данных. Это позволит избавиться не только от мусорной номенклатуры, но и от старых зависших регистров, что существенно ускорит работу системы.
Посмотрим на алгоритм реализации этого метода:
Выгрузка и загрузка данных XML (ее можно найти на диске ИТС или в каталоге шаблонов установленной конфигурации).Номенклатура настраиваем жесткий фильтр: выгружать только те элементы, остаток по которым на складах на дату переноса строго больше нуля.Оприходование товаров) на основе инвентаризационной ведомости.В результате мы получаем быструю, легкую базу данных, содержащую только актуальный ассортимент с остатками и ценами, а старую базу оставляем в качестве архива для просмотра истории продаж.
Для программистов 1С рассмотрим пример кода, который можно использовать во внешней обработке для «хирургического» удаления только строк с неиспользуемым товаром из документов установки цен. Это позволит не удалять сами документы целиком, а лишь очистить их от лишних связей:
// Пример программной очистки табличной части документа "Установка цен номенклатуры"
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| УстановкаЦен.Ссылка КАК Ссылка
|ИЗ
| Документ.УстановкаЦенНоменклатуры.Товары КАК УстановкаЦен
|ГДЕ
| УстановкаЦен.Номенклатура.ПометкаУдаления = ИСТИНА";
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
ДокументОбъект = ВыборкаДетальныеЗаписи.Ссылка.ПолучитьОбъект();
Индекс = ДокументОбъект.Товары.Количество() - 1;
// Обходим табличную часть с конца во избежание смещения индексов строк
Пока Индекс >= 0 Цикл
СтрокаТовара = ДокументОбъект.Товары[Индекс];
Если СтрокаТовара.Номенклатура.ПометкаУдаления Тогда
ДокументОбъект.Товары.Удалить(СтрокаТовара);
КонецЕсли;
Индекс = Индекс - 1;
EndЦикла;
Если ДокументОбъект.Модифицирован() Тогда
// Записываем документ без проведения или с проведением в зависимости от бизнес-логики
ДокументОбъект.Записать(РежимЗаписиДокумента.Запись);
КонецЕсли;
КонецЦикла;
Важное предупреждение: Перед выполнением любых операций по удалению данных, свертке информационной базы, схлопыванию дублей или использованию групповых обработок реквизитов, в обязательном порядке сделайте резервную копию вашей базы данных (файл .1CD или выгрузку .dt) и протестируйте весь процесс на копии базы!