Как программно получить свободный остаток товара в 1С:Управление торговлей 11

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

Вопрос получения актуального свободного остатка в конфигурации «Управление торговлей 11» (а также в «ERP» и «Комплексной автоматизации 2») является классической задачей для разработчика. В отличие от более простых систем, таких как УТ 10.3, современная архитектура 1С использует сложную систему резервирования, графиков поступления и различных статусов обеспечения. В этой статье мы подробно разберем, откуда брать данные, какие регистры использовать и как правильно рассчитать остатки с учетом всех нюансов системы.

Понимание структуры регистров остатков в УТ 11

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

  1. ТоварыНаСкладах — это базовый регистр, который отражает фактическое наличие товара на складе (количественный учет). Ресурсы ВНаличии и КОтгрузке показывают физическое состояние, но не учитывают бумажные резервы под заказы.
  2. СвободныеОстатки — специализированный регистр, предназначенный для оперативного получения информации о том, сколько товара мы можем продать прямо сейчас. В нем обычно присутствуют измерения Номенклатура, Склад, Характеристика и ресурсы ВНаличии, ВРезерве.
  3. РаспределениеЗапасов — в новых версиях УТ 11 (начиная с 11.4/11.5) этот регистр стал ключевым. Он объединяет фактические остатки, ожидаемые поступления и все виды резервов (под заказ, обособленно и т.д.).

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

Способ 1. Запрос к регистру «Свободные остатки»

Если в вашей версии конфигурации и настройках системы активно используется регистр СвободныеОстатки, то расчет свободного остатка сводится к получению данных из его виртуальной таблицы Остатки. Проанализируем типичную формулу расчета:

СвободныйОстаток = ВНаличии - ВРезервеСоСклада

Разберем пример кода запроса:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	СвободныеОстаткиОстатки.ВНаличииОстаток - СвободныеОстаткиОстатки.ВРезервеСоСкладаОстаток КАК СвободныйОстаток
    |ИЗ
    |	РегистрНакопления.СвободныеОстатки.Остатки(&МоментВремени, Номенклатура = &Номенклатура И Склад = &Склад) КАК СвободныеОстаткиОстатки";

Запрос.УстановитьПараметр("МоментВремени", МоментВремени());
Запрос.УстановитьПараметр("Номенклатура", СсылкаНаНоменклатуру);
Запрос.УстановитьПараметр("Склад", СсылкаНаСклад);

РезультатЗапроса = Запрос.Выполнить();

Важный нюанс: Как отмечают опытные разработчики, при работе с этим регистром в условиях «беспорядка» в учете (например, когда разрешены отрицательные остатки), ресурс ВРезерве может оказаться больше, чем ВНаличии. В таких случаях свободный остаток может стать отрицательным. Чтобы этого избежать, в логику расчета рекомендуется добавлять проверку через функцию МАКСИМУМ(Резерв, 0) или аналогичные условия в запросе.

Способ 2. Использование данных регистра «Распределение запасов»

В современных релизах УТ 11 расчет доступности товаров опирается на регистр РаспределениеЗапасов. Он гораздо сложнее, так как учитывает состояния обеспечения (например, «В наличии», «Ожидается», «Резерв под заказ»).

Выясним причину использования именно этого регистра: он позволяет получить не просто «цифру на сегодня», а доступный остаток с учетом графика движения товаров. Если вам нужно получить остаток, доступный для новой продажи, мы должны суммировать остатки по определенным состояниям запасов.

Типовая формула доступности в этом случае выглядит так: Доступно = Наличие + Ожидаемое поступление - Все резервы.

Способ 3. Заимствование логики из типовых механизмов

Если вам нужно получить результат, который на 100% совпадает с тем, что видит пользователь в форме подбора товаров, лучше всего обратиться к программному коду этой формы. Рассмотрим, как это сделать.

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

ПодборТоваровСервер.ТекстЗапросаДоступныхОстатковПоДатамДляПодбора()

Посмотрим на алгоритм действий разработчика:

  1. Откройте конфигуратор и найдите форму подбора товаров (обычно ФормаПодбора в справочнике Номенклатура или общая форма).
  2. Найдите место, где заполняются данные о количестве.
  3. Изучите запрос — 1С часто использует временные таблицы для предварительного сбора данных из ТоварыНаСкладах, ЗапасыИПотребности и РаспределениеЗапасов.

Этот путь может занять чуть больше времени, но он самый надежный (так называемый «железный вариант»), так как учитывает все функциональные опции вашей базы (например, ордерные склады или использование характеристик).

Способ 4. Получение данных через отчет «Доступность товаров»

Еще один профессиональный подход — проанализировать схему компоновки данных (СКД) типового отчета «Доступность товаров на складах». Рассмотрим по шагам, как это работает:

  1. Найдем в конфигураторе отчет ОстаткиИДоступностьТоваров.
  2. Откроем основную схему компоновки данных.
  3. Изучим набор данных — там находится сложный, оптимизированный запрос, который учитывает характеристики, упаковки и склады.

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

Рекомендации по написанию кода

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

Подводя итог, можно сказать: для быстрого результата в старых версиях используйте регистр СвободныеОстатки. Для получения максимально точных и актуальных данных в новых версиях — анализируйте регистр РаспределениеЗапасов или копируйте логику из модуля подбора товаров. Это гарантирует, что ваша доработка будет работать синхронно со стандартными механизмами системы 1С:Предприятие. Для готового отображения расчетных данных без доработки кода можно использовать расширение для вывода свободного остатка в документах продаж.

← На главную