В процессе эксплуатации информационных баз 1С справочник Номенклатура часто засоряется дублирующимися позициями, ошибочно созданными карточками или товарами, по которым давно прекращены операции. Для наведения порядка в справочнике необходимо четко определить критерии поиска неиспользуемых позиций.
Прежде чем приступать к анализу базы данных, разделим задачу на две принципиально разные ситуации:
Рассмотрим основные программные и аналитические способы решения этой задачи.
Наиболее производительным и надежным способом выявления элементов без движений в платформе 1С является построение запроса. Прямой обход табличных частей документов неэффективен и создает высокую нагрузку на СУБД, поэтому обратимся напрямую к виртуальным таблицам регистров.
Разберем логику запроса: мы выбираем элементы из справочника Номенклатура и соединяем их через ЛЕВОЕ СОЕДИНЕНИЕ с таблицей оборотов соответствующего регистра (оперативного учета или бухгалтерских проводок). Если по позиции не было движений, поля присоединенной таблицы вернут значение NULL.
Проанализируем пример текста запроса для поиска номенклатуры, по которой не зафиксировано движений на складах:
ВЫБРАТЬ
СпрНоменклатура.Ссылка КАК Номенклатура,
СпрНоменклатура.Артикул КАК Артикул,
СпрНоменклатура.Код КАК Код
ИЗ
Справочник.Номенклатура КАК СпрНоменклатура
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Обороты(&НачалоПериода, &КонецПериода, , ) КАК ТоварыОбороты
ПО СпрНоменклатура.Ссылка = ТоварыОбороты.Номенклатура
ГДЕ
СпрНоменклатура.ЭтоГруппа = ЛОЖЬ
И ТоварыОбороты.Номенклатура ЕСТЬ NULL
При составлении подобных запросов важно учитывать следующие правила фильтрации:
СпрНоменклатура.ЭтоГруппа = ЛОЖЬ, чтобы в результат не попадали папки.РегистрБухгалтерии.Хозрасчетный.ОборотыДтКт с фильтром по счетам учета ТМЦ (например, счет 41 «Товары» или счет 10 «Материалы»).Если цель заключается в поиске товаров, которые числятся на остатках, но не продаются и не списываются, используем виртуальную таблицу ОстаткиИОбороты. В этом случае соединение не требуется — достаточно проанализировать показатели самой виртуальной таблицы.
Посмотрим на пример запроса для выявления залежалых позиций за определенный период:
ВЫБРАТЬ
ТоварыНаСкладах.Номенклатура КАК Номенклатура,
ТоварыНаСкладах.КоличествоКонечныйОстаток КАК Остаток,
ЕСТЬNULL(ТоварыНаСкладах.КоличествоРасход, 0) КАК Расход
ИЗ
РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, Авто, , ) КАК ТоварыНаСкладах
ГДЕ
ТоварыНаСкладах.КоличествоКонечныйОстаток > 0
И (ТоварыНаСкладах.КоличествоРасход ЕСТЬ NULL ИЛИ ТоварыНаСкладах.КоличествоРасход = 0)
Такой отчет наглядно покажет позиции с положительным текущим остатком, по которым за выбранный интервал времени не зафиксировано ни одного списания.
В платформе 1С существует встроенный метод НайтиПоСсылкам(), предназначенный для проверки ссылочной целостности перед удалением объектов. Он принимает массив ссылок и возвращает таблицу со всеми местами их использования в базе данных.
Рассмотрим программный пример использования данного метода:
МассивСсылок = Новый Массив;
МассивСсылок.Добавить(СсылкаНаНоменклатуру);
ТаблицаСсылок = НайтиПоСсылкам(МассивСсылок);
Если ТаблицаСсылок.Количество() = 0 Тогда
// Объект нигде не задействован, можно помечать на удаление
СсылкаНаНоменклатуру.ПолучитьОбъект().УстановитьПометкуУдаления(Истина);
КонецЕсли;
Однако при использовании функции НайтиПоСсылкам() необходимо учитывать существенные технические ограничения:
При наведении порядка в справочнике Номенклатура рекомендуется придерживаться следующей последовательности действий: