Как найти номенклатуру без движений и проводок в 1С?

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

В процессе эксплуатации информационных баз 1С справочник Номенклатура часто засоряется дублирующимися позициями, ошибочно созданными карточками или товарами, по которым давно прекращены операции. Для наведения порядка в справочнике необходимо четко определить критерии поиска неиспользуемых позиций.

Прежде чем приступать к анализу базы данных, разделим задачу на две принципиально разные ситуации:

  1. Абсолютно неиспользуемая номенклатура — элементы, которые были созданы пользователями или загружены из внешних источников, но никогда не фигурировали в документах, проводках и движениях регистров. Такие карточки являются прямыми кандидатами на удаление.
  2. Неликвидный товар — позиции, по которым были приходные операции и имеется текущий положительный остаток на складах, но за длительный интервал времени полностью отсутствовал расход или продажи.

Рассмотрим основные программные и аналитические способы решения этой задачи.

Способ 1. Запрос с левым соединением к регистрам накопления и бухгалтерии

Наиболее производительным и надежным способом выявления элементов без движений в платформе 1С является построение запроса. Прямой обход табличных частей документов неэффективен и создает высокую нагрузку на СУБД, поэтому обратимся напрямую к виртуальным таблицам регистров.

Разберем логику запроса: мы выбираем элементы из справочника Номенклатура и соединяем их через ЛЕВОЕ СОЕДИНЕНИЕ с таблицей оборотов соответствующего регистра (оперативного учета или бухгалтерских проводок). Если по позиции не было движений, поля присоединенной таблицы вернут значение NULL.

Проанализируем пример текста запроса для поиска номенклатуры, по которой не зафиксировано движений на складах:


ВЫБРАТЬ
    СпрНоменклатура.Ссылка КАК Номенклатура,
    СпрНоменклатура.Артикул КАК Артикул,
    СпрНоменклатура.Код КАК Код
ИЗ
    Справочник.Номенклатура КАК СпрНоменклатура
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Обороты(&НачалоПериода, &КонецПериода, , ) КАК ТоварыОбороты
        ПО СпрНоменклатура.Ссылка = ТоварыОбороты.Номенклатура
ГДЕ
    СпрНоменклатура.ЭтоГруппа = ЛОЖЬ
    И ТоварыОбороты.Номенклатура ЕСТЬ NULL

При составлении подобных запросов важно учитывать следующие правила фильтрации:

  1. Обязательно исключаем группы справочника с помощью условия СпрНоменклатура.ЭтоГруппа = ЛОЖЬ, чтобы в результат не попадали папки.
  2. Исключаем предопределенные и служебные элементы, а также типы номенклатуры, по которым не ведется количественный складской учет (услуги, работы, наборы).
  3. Для поиска позиций без бухгалтерских проводок соединение выполняется с виртуальной таблицей РегистрБухгалтерии.Хозрасчетный.ОборотыДтКт с фильтром по счетам учета ТМЦ (например, счет 41 «Товары» или счет 10 «Материалы»).

Способ 2. Поиск неликвидной номенклатуры с нулевым расходом

Если цель заключается в поиске товаров, которые числятся на остатках, но не продаются и не списываются, используем виртуальную таблицу ОстаткиИОбороты. В этом случае соединение не требуется — достаточно проанализировать показатели самой виртуальной таблицы.

Посмотрим на пример запроса для выявления залежалых позиций за определенный период:


ВЫБРАТЬ
    ТоварыНаСкладах.Номенклатура КАК Номенклатура,
    ТоварыНаСкладах.КоличествоКонечныйОстаток КАК Остаток,
    ЕСТЬNULL(ТоварыНаСкладах.КоличествоРасход, 0) КАК Расход
ИЗ
    РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, Авто, , ) КАК ТоварыНаСкладах
ГДЕ
    ТоварыНаСкладах.КоличествоКонечныйОстаток > 0
    И (ТоварыНаСкладах.КоличествоРасход ЕСТЬ NULL ИЛИ ТоварыНаСкладах.КоличествоРасход = 0)

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

Способ 3. Использование глобального метода НайтиПоСсылкам()

В платформе 1С существует встроенный метод НайтиПоСсылкам(), предназначенный для проверки ссылочной целостности перед удалением объектов. Он принимает массив ссылок и возвращает таблицу со всеми местами их использования в базе данных.

Рассмотрим программный пример использования данного метода:


МассивСсылок = Новый Массив;
МассивСсылок.Добавить(СсылкаНаНоменклатуру);

ТаблицаСсылок = НайтиПоСсылкам(МассивСсылок);

Если ТаблицаСсылок.Количество() = 0 Тогда
    // Объект нигде не задействован, можно помечать на удаление
    СсылкаНаНоменклатуру.ПолучитьОбъект().УстановитьПометкуУдаления(Истина);
КонецЕсли;

Однако при использовании функции НайтиПоСсылкам() необходимо учитывать существенные технические ограничения:

  1. Сканирование всей базы данных: метод выполняет глобальный поиск по всем таблицам метаданных, что на крупных информационных базах приводит к длительным блокировкам и высокому потреблению оперативной памяти.
  2. Ложные срабатывания на подчиненных объектах: функция считает объект «используемым», если на него ссылаются подчиненные справочники (например, единицы измерения, упаковки, спецификации) или независимые регистры сведений (штрихкоды, цены номенклатуры, соответствия номенклатуры). Даже если хозяйственных операций по товару не было, метод покажет наличие ссылок.

Рекомендации по очистке и архивации

При наведении порядка в справочнике Номенклатура рекомендуется придерживаться следующей последовательности действий:

  1. Если позиция никогда не использовалась в документах, перед непосредственным удалением необходимо программно очистить связанные с ней записи в регистрах сведений (цены, штрихкоды) и удалить подчиненные элементы (упаковки, файлы).
  2. Если по номенклатуре в прошлом были движения или проводки, удалять её из базы нельзя, так как это нарушит ссылочную целостность и отчетность прошлых периодов.
  3. Для позиций, снятых с производства или выведенных из ассортимента, используйте штатный флаг Недействителен (в типовых конфигурациях) либо перемещайте их в специальную архивную группу справочника с ограничением прав доступа для менеджеров.
← На главную