При работе в программах семейства «1С:Предприятие» (таких как «1С:Управление торговлей», «1С:Комплексная автоматизация» или «1С:ERP») пользователи и разработчики часто сталкиваются с удивительным парадоксом. В форме подбора номенклатуры колонка «Доступно» внезапно оказывается больше, чем колонка «В наличии». На первый взгляд это кажется логической ошибкой: как система может позволить продать или зарезервировать больше товара, чем физически находится на складе?
В этой статье мы подробно разберем механизм формирования этих показателей, проанализируем исходный код запроса, выясним основные причины возникновения такой аномалии и рассмотрим эффективные методы исправления подобных ситуаций.
Для того чтобы понять логику программы, нам необходимо обратиться к первоисточнику — программному коду конфигурации. Формирование динамического запроса для формы подбора товаров происходит в общем модуле ПодборТоваровСервер в функции ТекстЗапросаСпискаФормыПодбора(Форма, ТипСписка).
Рассмотрим фрагмент этого запроса, который отвечает за вычисление полей «В наличии» и «Доступно»:
ВЫРАЗИТЬ(ЕСТЬNULL(СвободныеОстатки.ВНаличииОстаток, 0) / ЕСТЬNULL(ЦеныНоменклатуры.Упаковка.Коэффициент, 1) КАК ЧИСЛО(15, 3)) КАК ВНаличииОстаток,
ВЫРАЗИТЬ((ЕСТЬNULL(СвободныеОстатки.ВНаличииОстаток, 0) - ЕСТЬNULL(СвободныеОстатки.ВРезервеПодЗаказОстаток, 0) -
ЕСТЬNULL(СвободныеОстатки.ВРезервеСоСкладаОстаток, 0) + ЕСТЬNULL(ОстаткиИзЗаказов.Количество, 0)) / ЕСТЬNULL(ЦеныНоменклатуры.Упаковка.Коэффициент, 1) КАК ЧИСЛО(15, 3)) КАК Доступно
Проанализируем эту математическую модель. Если с полем ВНаличииОстаток все предельно просто (это физический остаток на складе, приведенный к коэффициенту упаковки), то расчет поля Доступно строится по более сложной формуле:
Доступно = В наличии - Резерв под заказ - Резерв со склада + Остатки из заказов
Исходя из этой формулы, существует две принципиально разные группы причин, почему доступный остаток превышает фактический.
Обратим внимание на слагаемое + ЕСТЬNULL(ОстаткиИзЗаказов.Количество, 0) в формуле расчета доступности. В типовых торговых конфигурациях 1С реализован механизм «работы под заказ» и обеспечения потребностей.
Если в системе оформлены и проведены документы «Заказ поставщику», «Заказ на перемещение» или «Заказ на производство», система фиксирует планируемое поступление товаров на склад. Этот товар физически еще не поступил (его нет «В наличии»), но система уже «видит» его в будущем и позволяет менеджерам распределять и резервировать его под «Заказы клиентов». Соответственно, эти ожидаемые объемы прибавляются к доступному остатку.
Это наиболее частая техническая и методологическая проблема, с которой сталкиваются пользователи. Вспомним школьное правило математики: вычитание отрицательного числа дает сложение (минус на минус дает плюс).
Если по какой-то причине в регистре свободных остатков значение переменной ВРезервеПодЗаказОстаток или ВРезервеСоСкладаОстаток принимает отрицательное значение (например, -5), расчет принимает следующий вид:
Доступно = В наличии - (-5) = В наличии + 5
В результате доступное количество чудесным образом увеличивается и становится больше, чем есть на складе.
Рассмотрим подробнее методологическую особенность работы документов резервирования и снятия резервов задним числом. Зачастую в конфигурациях отмена резервов отдельным документом (или закрытием заказа) оперирует не динамическими движениями резервов отменяемого документа, а фиксирует данные на момент своего создания.
Разберем типичный сценарий возникновения ошибки:
При подборе этого товара система выполнит расчет: В наличии - (-7), искусственно завысив доступность на 7 единиц.
Если вы обнаружили, что в форме подбора отображаются некорректные данные, необходимо выполнить последовательный комплекс диагностических и корректирующих действий.
Шаг 1. Анализ движений по регистрам накопления
Для начала выясним, по какому именно документу или заказу образовался отрицательный резерв. Откройте отчет «Ведомость по товарам на складах» или специализированный отчет по резервам. Если отчеты не показывают детальную картину, воспользуйтесь универсальным отчетом по регистру накопления СвободныеОстатки (в некоторых версиях — регистр сведений РаспределениеЗапасов), сделав отбор по проблемной номенклатуре и группировку по документам-регистраторам. Ваша цель — найти строки с отрицательными конечными остатками в колонках резерва.
Шаг 2. Перепроведение документов и восстановление последовательности
В большинстве случаев для устранения «красных» резервов достаточно восстановить хронологическую последовательность проведения документов. Попробуйте последовательно перепровести цепочку документов, начиная от исходного заказа и заканчивая документами корректировки, отгрузки или снятия резервов.
Шаг 3. Использование регламентных обработок
В современных редакциях конфигураций на платформе «1С:Предприятие 8.3» расчет доступности вынесен в фоновые задания, а результаты записываются в регистр сведений Распределение запасов. Из-за сбоев транзакций данные этого регистра могут рассинхронизироваться с реальными складскими остатками.
Для исправления этой проблемы разработчики 1С предусмотрели специальный инструмент:
Шаг 4. Доработка конфигурации (для программистов)
Если подобные рассогласования происходят регулярно из-за специфики работы пользователей задним числом, целесообразно заказать или выполнить небольшую доработку системы. Можно внедрить подписку на событие при проведении документов, формирующих резервы, которая будет автоматически находить связанные документы отмены резервов и корректировать их движения, либо блокировать проведение исходного заказа при наличии связанных последующих документов отмены без их предварительного анализа.