В процессе работы с конфигурациями 1С:Комплексная автоматизация 2.4 или 1С:ERP пользователи и разработчики часто сталкиваются с ситуацией, когда отчет Оборачиваемость запасов на складах формируется не полностью. Наиболее распространенная проблема — пустые значения в колонке «Период оборачиваемости (дней)», даже если по товару есть остатки. В этой статье мы подробно разберем, как устроена логика этого отчета, где искать причины отсутствия данных и как проанализировать код системы.
Прежде чем приступать к программному анализу, давайте выясним математическую причину появления пустых полей. Оборачиваемость запасов в днях — это показатель, который говорит нам, за сколько дней в среднем продается (оборачивается) средний запас товара на складе. Формула расчета выглядит следующим образом:
Период оборачиваемости = Количество дней в периоде / Коэффициент оборачиваемости
Где Коэффициент оборачиваемости = Расход за период / Средний остаток за период.
Рассмотрим основные ситуации, когда расчет не может быть произведен:
Списание недостач товаров или Внутреннее потребление товаров, система проигнорирует этот расход, и колонка останется пустой.Проанализируем техническую сторону вопроса. В отличие от простых отчетов, которые строятся на одном запросе в схеме компоновки данных (СКД), отчет Оборачиваемость запасов на складах использует программное формирование данных. Рассмотрим, как найти место формирования отчета:
Основная логика сосредоточена в модуле объекта отчета. Нам необходимо найти процедуру ПриКомпоновкеРезультата. Именно там происходит сбор данных во временные таблицы. Одной из ключевых функций является ТекстЗапросаРасходЗаПериодТоварыНаСкладах.
В этой функции формируется текст запроса к регистрам накопления. Важно понимать, что система не просто обращается к оборотам, а анализирует виртуальную таблицу ТоварыНаСкладах.Обороты или детализированные записи через ТоварыНаСкладах.Регистратор с фильтром по виду движения Расход.
Проанализируем примерный фрагмент кода, который отвечает за сбор данных по расходу:
// Пример логики формирования текста запроса для получения расхода
Функция ТекстЗапросаРасходЗаПериодТоварыНаСкладах()
ТекстЗапроса =
"ВЫБРАТЬ
| ТоварыНаСкладахОбороты.Номенклатура КАК Номенклатура,
| ТоварыНаСкладахОбороты.Характеристика КАК Характеристика,
| ТоварыНаСкладахОбороты.ВНаличииРасход КАК КоличествоРасход
|ИЗ
| РегистрНакопления.ТоварыНаСкладах.Обороты(&НачалоПериода, &КонецПериода, Авто, ) КАК ТоварыНаСкладахОбороты";
Возврат ТекстЗапроса;
КонецФункции
В настройках СКД этого отчета часто можно увидеть, что в качестве набора данных используется Объект с именем ТаблицаОтчета. Это означает, что данные в отчет передаются «снаружи» — сначала выполняется код на встроенном языке, формируется таблица значений (ТЗ), и уже эта ТЗ передается в систему компоновки.
Чтобы просмотреть содержимое ТаблицаОтчета, выполним следующие действия в режиме отладки:
ПроцессорКомпоновкиДанных.Инициализировать().ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных).КоличествоРасход и СреднийОстаток до того, как они попадут в финальный отчет.Выясним причину использования конкретных таблиц. В сообщениях форума упоминается ТоварыНаСкладахРегистраторРасход. Это виртуальная таблица, которая позволяет системе получить не просто общую сумму расхода, а детализировать её до конкретного документа-регистратора.
Важный нюанс: Для корректного расчета периода оборачиваемости 1С использует алгоритм интегральной оценки остатков. Это значит, что система считает остаток на каждый день внутри периода. Если за весь месяц был остаток 100 штук, но расход произошел только в последний день, показатель оборачиваемости будет сильно отличаться от случая, когда расход был равномерным. Если данных в регистре ТоварыНаСкладах недостаточно для определения ежедневных остатков (например, отключен детальный учет), отчет может выводить пустые значения.
Рассмотрим последовательность действий для пользователя или аналитика, если данные не выводятся:
Анализировать потребление охватывает нужные вам типы документов.Способ обеспечения. В некоторых версиях алгоритм расчета может игнорировать товары, для которых не заданы параметры поддержания запасов, так как для них не ведется статистика потребления.Таким образом, пустое значение в периоде оборачиваемости — это чаще всего не ошибка программы, а следствие отсутствия данных для деления (нулевой расход) или специфических настроек фильтрации, которые отсекают движения по складу. Проанализировав ТаблицаОтчета и функции формирования запроса, вы сможете точно определить, на каком этапе «теряются» данные.