В процессе активной работы с информационной базой 1С неизбежно накапливаются "мусорные" данные – элементы справочников, которые по каким-либо причинам перестали использоваться в документах, регистрах или других объектах системы. Это могут быть устаревшие товары, неактуальные контрагенты, неиспользуемые склады и т.д. Такие данные не только засоряют базу, но и могут негативно влиять на производительность и удобство работы. В этой статье мы разберем несколько подходов, которые позволят нам эффективно находить такие неиспользуемые элементы справочников в 1С 8.3 на управляемых формах — для этой задачи есть инструмент удаления неиспользуемых элементов и очистки базы.
Представим, что перед нами стоит задача найти все элементы справочника «Номенклатура», которые не были задействованы ни в одном документе (например, «РеализацияТоваровУслуг», «ПоступлениеТоваровУслуг») или других справочниках (например, в комплектах) — для этого подойдёт обработка очистки справочника номенклатура без остатков. Рассмотрим подробнее, как мы можем решить эту проблему, используя различные инструменты и методы 1С.
Это самый простой и часто используемый подход, когда нам известны конкретные места, где может использоваться элемент справочника. Мы строим запрос, который выбирает все элементы справочника, а затем исключаем из этого списка те, которые встречаются в указанных нами таблицах с помощью оператора НЕ В.
Справочник.Номенклатура.Давайте посмотрим на пример запроса, который поможет нам найти номенклатуру, не использованную в основных закупочных и продажных документах:
ВЫБРАТЬ
Номенклатура.Ссылка КАК СсылкаНаНоменклатуру,
Номенклатура.Наименование КАК Наименование
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ НЕ Номенклатура.Ссылка В
(ВЫБРАТЬ РАЗЛИЧНЫЕ
РеализацияТоваровУслугТовары.Номенклатура
ИЗ
Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
ГДЕ
РеализацияТоваровУслугТовары.Номенклатура ССЫЛКА Справочник.Номенклатура)
И НЕ Номенклатура.Ссылка В
(ВЫБРАТЬ РАЗЛИЧНЫЕ
ПоступлениеТоваровУслугТовары.Номенклатура
ИЗ
Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары
ГДЕ
ПоступлениеТоваровУслугТовары.Номенклатура ССЫЛКА Справочник.Номенклатура)
И НЕ Номенклатура.ПометкаУдаления
Важные моменты:
РАЗЛИЧНЫЕ для оптимизации подзапросов, чтобы избежать дублирования ссылок.ССЫЛКА Справочник.Номенклатура в подзапросах помогает явно указать тип ссылки, что может быть полезно для полей смешанных типов или при отладке.И НЕ Номенклатура.ПометкаУдаления, чтобы исключить уже помеченные на удаление элементы, поскольку нас интересуют активно существующие, но неиспользуемые элементы.Этот базовый запрос легко расширить, добавляя новые секции И НЕ Номенклатура.Ссылка В (...) для каждого нового места использования. Например, если номенклатура может быть в комплектах:
...
И НЕ Номенклатура.Ссылка В
(ВЫБРАТЬ РАЗЛИЧНЫЕ
КомплектыНоменклатурыСостав.Номенклатура
ИЗ
Справочник.КомплектыНоменклатуры.Состав КАК КомплектыНоменклатурыСостав
ГДЕ
КомплектыНоменклатурыСостав.Номенклатура ССЫЛКА Справочник.Номенклатура)
И НЕ Номенклатура.Ссылка В
(ВЫБРАТЬ РАЗЛИЧНЫЕ
КомплектыНоменклатуры.НоменклатураКомплекта
ИЗ
Справочник.КомплектыНоменклатуры КАК КомплектыНоменклатуры
ГДЕ
КомплектыНоменклатуры.НоменклатураКомплекта ССЫЛКА Справочник.Номенклатура)
...
Ограничения этого метода:
Этот подход значительно более гибок и позволяет найти все потенциальные ссылки на элемент справочника в конфигурации, не требуя ручного перечисления всех возможных мест. Мы будем динамически обходить метаданные системы, чтобы определить, где могут храниться ссылки на интересующий нас тип объекта.
В 1С платформа предоставляет доступ к метаданным конфигурации через объект Метаданные. Мы можем программно перебрать все объекты конфигурации (документы, справочники, регистры сведений и т.д.) и для каждого из них проверить, есть ли реквизиты или поля табличных частей, которые могут хранить ссылку на наш справочник «Номенклатура».
Этот подход требует определенных навыков программирования, и подробная инструкция для разработчиков (удобнее через инструментарий разработчика для поиска ссылок в 1С) может стать отличным подспорьем при создании собственного решения.
Тип("СправочникСсылка.Номенклатура")).Метаданные.ВсеОбъекты. Это включает в себя справочники, документы, регистры, планы видов характеристик и т.д.Тип.СодержитТип() для определения, может ли текущий реквизит хранить ссылку на наш тип объекта.Этот код демонстрирует, как мы можем найти все места, где теоретически может быть использована ссылка на объект определенного типа. Обратите внимание, что этот код *идентифицирует потенциальные места хранения*, но не проверяет *фактическое наличие* ссылки в данных. Для проверки фактического наличия потребуется построить динамический запрос.
Функция НайтиВсеПотенциальныеИспользованияТипа(ТипИскомойСсылки)
СписокМест = Новый Массив;
// Исключаем системные и служебные объекты, которые не содержат прямых ссылок
ИсключаемыеТипыМетаданных = Новый Массив;
ИсключаемыеТипыМетаданных.Добавить(Метаданные.Константы);
ИсключаемыеТипыМетаданных.Добавить(Метаданные.Перечисления);
ИсключаемыеТипыМетаданных.Добавить(Метаданные.ПланыВидовРасчета);
ИсключаемыеТипыМетаданных.Добавить(Метаданные.ПланыВидовХарактеристик); // Если только не сами ПВХ
ИсключаемыеТипыМетаданных.Добавить(Метаданные.ПланыСчетов);
ИсключаемыеТипыМетаданных.Добавить(Метаданные.БизнесПроцессы);
ИсключаемыеТипыМетаданных.Добавить(Метаданные.Задачи);
ИсключаемыеТипыМетаданных.Добавить(Метаданные.ФункциональныеОпции);
ИсключаемыеТипыМетаданных.Добавить(Метаданные.ФункциональныеКатегории);
ИсключаемыеТипыМетаданных.Добавить(Метаданные.WebСервисы);
ИсключаемыеТипыМетаданных.Добавить(Метаданные.HTTPСервисы);
ИсключаемыеТипыМетаданных.Добавить(Метаданные.XDTOПакеты);
ИсключаемыеТипыМетаданных.Добавить(Метаданные.СоставКомпоновкиДанных);
ИсключаемыеТипыМетаданных.Добавить(Метаданные.ОбщиеМодули);
// Добавляем другие неинтересные нам типы, например, отчеты, обработки, формы и т.д.
Для Каждого МетаданныеОбъект Из Метаданные.ВсеОбъекты Цикл
// Пропускаем объекты, которые заведомо не могут содержать ссылки или не интересны для поиска
Если ИсключаемыеТипыМетаданных.Найти(МетаданныеОбъект) <> Неопределено Тогда
Продолжить;
КонецЕсли;
// 1. Проверяем реквизиты самого объекта
Если МетаданныеОбъект.ИмеетРеквизиты() Тогда
Для Каждого РеквизитМД Из МетаданныеОбъект.Реквизиты Цикл
Если РеквизитМД.Тип.СодержитТип(ТипИскомойСсылки) Тогда
СписокМест.Добавить(МетаданныеОбъект.ПолноеИмя() + "." + РеквизитМД.Имя);
КонецЕсли;
КонецЦикла;
КонецЕсли;
// 2. Проверяем реквизиты табличных частей объекта
Если МетаданныеОбъект.ИмеетТабличныеЧасти() Тогда
Для Каждого ТабЧастьМД Из МетаданныеОбъект.ТабличныеЧасти Цикл
Для Каждого РеквизитТЧМД Из ТабЧастьМД.Реквизиты Цикл
Если РеквизитТЧМД.Тип.СодержитТип(ТипИскомойСсылки) Тогда
СписокМест.Добавить(МетаданныеОбъект.ПолноеИмя() + "." + ТабЧастьМД.Имя + "." + РеквизитТЧМД.Имя);
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецЕсли;
// 3. Проверяем измерения регистров сведений, накопления, бухгалтерии
Если ТипЗнч(МетаданныеОбъект) = Тип("Метаданные.РегистрСведений")
ИЛИ ТипЗнч(МетаданныеОбъект) = Тип("Метаданные.РегистрНакопления")
ИЛИ ТипЗнч(МетаданныеОбъект) = Тип("Метаданные.РегистрБухгалтерии") Тогда
Для Каждого ИзмерениеМД Из МетаданныеОбъект.Измерения Цикл
Если ИзмерениеМД.Тип.СодержитТип(ТипИскомойСсылки) Тогда
СписокМест.Добавить(МетаданныеОбъект.ПолноеИмя() + "." + ИзмерениеМД.Имя);
КонецЕсли;
КонецЦикла;
// Также можно проверить ресурсы и реквизиты регистров, если они могут содержать ссылки
Для Каждого РесурсМД Из МетаданныеОбъект.Ресурсы Цикл
Если РесурсМД.Тип.СодержитТип(ТипИскомойСсылки) Тогда
СписокМест.Добавить(МетаданныеОбъект.ПолноеИмя() + "." + РесурсМД.Имя);
КонецЕсли;
КонецЦикла;
Для Каждого РеквизитРегистраМД Из МетаданныеОбъект.Реквизиты Цикл
Если РеквизитРегистраМД.Тип.СодержитТип(ТипИскомойСсылки) Тогда
СписокМест.Добавить(МетаданныеОбъект.ПолноеИмя() + "." + РеквизитРегистраМД.Имя);
КонецЕсли;
КонецЦикла;
КонецЕсли;
// 4. Проверяем реквизиты планов видов характеристик (если номенклатура может быть типом доп. реквизита)
Если ТипЗнч(МетаданныеОбъект) = Тип("Метаданные.ПланВидовХарактеристик") Тогда
Для Каждого РеквизитПВХМД Из МетаданныеОбъект.Реквизиты Цикл
Если РеквизитПВХМД.Тип.СодержитТип(ТипИскомойСсылки) Тогда
СписокМест.Добавить(МетаданныеОбъект.ПолноеИмя() + "." + РеквизитПВХМД.Имя);
КонецЕсли;
КонецЦикла;
// Тип значения самого ПВХ
Если МетаданныеОбъект.ТипЗначения.СодержитТип(ТипИскомойСсылки) Тогда
СписокМест.Добавить(МетаданныеОбъект.ПолноеИмя() + " (ТипЗначения)");
КонецЕсли;
КонецЕсли;
КонецЦикла;
Возврат СписокМест;
КонецФункции
// Пример использования:
// ТипНоменклатуры = Тип("СправочникСсылка.Номенклатура");
// МестаИспользованияНоменклатуры = НайтиВсеПотенциальныеИспользованияТипа(ТипНоменклатуры);
// Для Каждого Место Из МестаИспользованияНоменклатуры Цикл
// Сообщить(Место);
// КонецЦикла;
После получения списка потенциальных мест использования, мы можем программно сформировать и выполнить серию запросов, аналогичных тем, что были в первом методе, но уже динамически, для каждого найденного места. Это позволит нам получить более полный и точный список неиспользуемых элементов.
Преимущества этого метода:
Ограничения этого метода:
Помимо прямого написания кода, существуют также готовые подходы и инструменты, которые могут помочь нам в решении данной задачи.
В некоторых типовых конфигурациях 1С (особенно построенных на Библиотеке стандартных подсистем - БСП) могут присутствовать служебные отчеты или обработки, такие как "Анализ доступности", "Связи объектов" или "Поиск ссылок на объекты".
1С:Управление торговлей (УТ 11) или 1С:ERP Управление предприятием, могут быть специфические инструменты для анализа целостности данных, например, механизмы проверки ведения учета, которые могут косвенно помочь в выявлении проблемных ссылок, но напрямую не ищут "неиспользуемые". В БСП часто есть универсальный поиск ссылок.Полнотекстовый поиск 1С (функционал, основанный на индексе полнотекстового поиска) позволяет искать любую текстовую информацию в базе данных. Однако для задачи поиска *неиспользуемых элементов справочника* он не является идеальным решением. Полнотекстовый поиск найдет *любое упоминание* наименования или кода элемента, даже если это просто текст в комментарии или описание, а не прямая ссылка на объект. Это даст слишком много ложноположительных результатов.
На платформах вроде InfoStart.ru и других специализированных ресурсах сообщество разработчиков 1С активно делится готовыми обработками и внешними отчетами. Например, универсальная очистка справочников реализует автоматический анализ метаданных, похожий на метод 2, но в виде готового к использованию инструмента. Встречаются и узкоспециализированные решения, например, помощник для удаления неактуальных цен, валют и версий объектов в УТ 11 и ERP. Поиск такой готовой разработки может сэкономить значительное время, но требует внимательной проверки кода на предмет безопасности и корректности.
После того как мы успешно нашли список неиспользуемых элементов справочника, перед нами встает задача их удаления. Важно подходить к этому процессу с особой осторожностью:
Надеемся, что этот подробный анализ методов поиска неиспользуемых элементов справочников в 1С 8.3 поможет вам поддерживать порядок в вашей информационной базе и повысить эффективность работы.