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

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

В процессе управления запасами часто возникает необходимость выявить так называемые «неликвиды» — товары, которые числятся на остатках, но по каким-то причинам не продаются и не перемещаются. Для полноценного анализа недостаточно просто увидеть остаток; важно понимать, как долго этот товар занимает место на складе. В этой статье мы разберем, как с помощью консоли запросов или Системы компоновки данных (СКД) получить список номенклатуры без движений и вычислить дату её последнего поступления — для этого есть обработка для поиска неликвидов и расчета сроков хранения.

Определяем критерии «отсутствия движения»

Прежде чем писать запрос, давайте определимся, что мы считаем отсутствием движения. Если мы просто укажем в условиях, что обороты за период равны нулю, мы можем упустить товары, которые когда-то закупались, но сейчас «зависли» — здесь поможет расширение для анализа неликвидов и рентабельности номенклатуры. Проанализируем наиболее эффективный подход: товар считается неликвидным, если его начальный остаток равен конечному остатку за выбранный период и при этом отсутствует расход (оборот по кредиту).

Рассмотрим пример кода для получения таких остатков из регистра бухгалтерии:


ВЫБРАТЬ
    ХозрасчетныйОстаткиИОбороты.Субконто1 КАК Номенклатура,
    ХозрасчетныйОстаткиИОбороты.Субконто2 КАК Склад,
    ХозрасчетныйОстаткиИОбороты.КоличествоКонечныйОстатокДт КАК Остаток
ПОМЕСТИТЬ ВТ_ДанныеОстатков
ИЗ
    РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, , , Счет В ИЕРАРХИИ (&Счет), , ) КАК ХозрасчетныйОстаткиИОбороты
ГДЕ
    ХозрасчетныйОстаткиИОбороты.КоличествоКонечныйОстатокДт = ХозрасчетныйОстаткиИОбороты.КоличествоНачальныйОстатокДт
    И ХозрасчетныйОстаткиИОбороты.КоличествоОборотКт = 0
ИНДЕКСИРОВАТЬ ПО
    Номенклатура,
    Склад
;

Оптимизация запроса через параметры виртуальных таблиц

Выясним причину, почему запросы к регистру бухгалтерии могут работать медленно. Часто разработчики накладывают фильтры в секции ГДЕ. Это заставляет систему сначала выбрать все записи из базы, а потом отсеивать лишние. Для повышения производительности мы должны передавать условия (например, по счету учета или складу) напрямую в параметры виртуальной таблицы.

Обратите внимание на использование ИНДЕКСИРОВАТЬ ПО. Когда мы планируем соединять временную таблицу с другими данными (например, для получения даты прихода), индексация по ключевым полям Номенклатура и Склад значительно ускорит процесс.

Получение даты последнего поступления

Теперь разберем, как узнать, когда этот товар в последний раз попадал на склад. Поскольку в текущем периоде движений нет, нам нужно заглянуть «в прошлое», то есть проанализировать обороты с самого начала ведения учета до даты начала нашего отчета. Нам нужна максимальная дата регистратора, где был оборот по дебету (приход).

Посмотрим на структуру второго запроса:


ВЫБРАТЬ
    ХозрасчетныйОбороты.Субконто1 КАК Номенклатура,
    ХозрасчетныйОбороты.Субконто2 КАК Склад,
    МАКСИМУМ(ХозрасчетныйОбороты.Период) КАК ДатаПоследнегоПрихода
ПОМЕСТИТЬ ВТ_ДатыПрихода
ИЗ
    РегистрБухгалтерии.Хозрасчетный.Обороты(, &НачалоПериода, День, Счет В ИЕРАРХИИ (&Счет), , , , ) КАК ХозрасчетныйОбороты
ГДЕ
    ХозрасчетныйОбороты.Субконто1 В (ВЫБРАТЬ Номенклатура ИЗ ВТ_ДанныеОстатков)
СГРУППИРОВАТЬ ПО
    ХозрасчетныйОбороты.Субконто1,
    ХозрасчетныйОбороты.Субконто2
ИНДЕКСИРОВАТЬ ПО
    Номенклатура,
    Склад
;

В данном случае мы используем пустое значение начала периода в виртуальной таблице Обороты, чтобы охватить всю историю движений до &НачалоПериода. Условие в секции ГДЕ ограничивает выборку только той номенклатурой, которую мы уже определили как «неликвидную» в первой временной таблице.

Соединение данных и итоговый результат

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


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

Настройка СКД для расчета средних показателей

Если вы разрабатываете отчет на базе СКД, проанализируем, как вычислить средний срок хранения по складу или группе номенклатуры. Для этого воспользуемся вычисляемыми полями и ресурсами:

  1. Вкладка Вычисляемые поля: добавьте поле СрокХранения с выражением РазностьДат(ДатаПоступления, &КонецПериода, "ДЕНЬ").
  2. Вкладка Ресурсы: добавьте поле СрокХранения, выберите функцию Среднее(СрокХранения) и укажите в колонке "Рассчитывать по..." те группировки, по которым вам нужны итоги (например, Склад или Номенклатура.Родитель).
  3. Вкладка Настройки: добавьте иерархическую группировку по номенклатуре и складу. Система автоматически рассчитает среднее количество дней простоя для каждой группы товаров.

Важные методологические нюансы

При реализации этого отчета стоит учитывать несколько тонкостей, которые сделают результат более точным:

1. Внутренние перемещения. В стандартном регистре бухгалтерии перемещение между складами создает обороты. Если товар просто переложили с полки на полку, формально «движение» было, но продажи не случилось. Для более качественного анализа неликвидов рекомендуется исключать из оборотов документы типа ПеремещениеТоваров (поможет отчет выявления неликвидных и залежалых товаров без продаж).

2. Партионный учет. Если в вашей конфигурации включен партионный учет (ФИФО), то задачу решить проще. Каждая единица остатка уже привязана к конкретному документу поступления через субконто Партии. В этом случае дату прихода можно брать напрямую из субконто остатка, не обращаясь к таблице оборотов.

3. Использование регистров накопления. Если ваша база — это не только «Бухгалтерия», но и «Управление торговлей» или «ERP», лучше строить запрос по регистрам накопления ТоварыНаСкладах или ВыручкаИСебестоимостьПродаж — для этого подойдёт отчет для выявления неликвидов в УТ и ERP. Они работают быстрее регистра бухгалтерии, так как содержат меньше измерений и оптимизированы именно под складской учет.

Таким образом, комбинируя работу с виртуальными таблицами остатков и оборотов, индексацию временных таблиц и механизмы агрегации СКД, мы получаем мощный инструмент для анализа складских запасов и выявления залежалого товара — для этого также есть отчет ABC/XYZ-анализа для выявления неликвидных позиций.

← На главную