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