Как программно проверить наличие остатка товара в 1С:УПП 1.3?

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

При разработке новых механизмов или доработке существующих документов в конфигурации «1С:Управление производственным предприятием 1.3» (УПП) часто возникает необходимость программно проверить остатки номенклатуры. В отличие от современных конфигураций, построенных на базе Библиотеки стандартных подсистем (БСП), в УПП используются свои специализированные механизмы контроля остатков.

В этой статье мы подробно разберем несколько способов решения этой задачи: от использования готовых функций общих модулей до написания оптимальных прямых запросов к регистрам накопления.

Способ 1. Использование встроенных функций общего модуля УправлениеЗапасами

Проанализируем типовые механизмы конфигурации. В УПП есть мощный общий модуль УправлениеЗапасами, который содержит готовые экспортные методы для работы с остатками номенклатуры. Один из наиболее полезных методов, позволяющий избежать ручного написания запросов, — это ПолучитьДеревоОстатковНоменклатуры.

Этот метод часто применяется в формах подбора и справочниках для динамического отображения остатков по складам и характеристикам. Рассмотрим подробнее, как его вызвать программно в своем коде:


// Шаг 1. Получим список типов цен, необходимый для работы метода
СписокЦенОстатков = УправлениеЗапасами.ЗаполнитьСписокТиповЦенДляПолученияОстатков();

// Шаг 2. Создадим структуру колонок дерева значений, куда будут помещены данные
ОстаткиТоваров = УправлениеЗапасами.СоздатьКолонкиДереваОстатков(СписокЦенОстатков);

// Шаг 3. Заполним дерево остатков данными по конкретной номенклатуре
УправлениеЗапасами.ПолучитьДеревоОстатковНоменклатуры(
    ОстаткиТоваров, 
    СсылкаНаНоменклатуру, 
    Истина, // Флаг: Показывать остатки по складам (если Ложь — выдаст общий итог)
    СписокЦенОстатков, 
    , // Подразделение (необязательно, для фильтрации складов)
    Новый Соответствие, // Соответствие курсов валют
    , // Договор контрагента (необязательно)
    ТекущаяДата() // Дата, на которую запрашиваются остатки
);

// Шаг 4. Обходим полученное дерево значений и анализируем остатки
Для Каждого СтрокаДереваИзмерения Из ОстаткиТоваров.Строки Цикл
    Для Каждого СтрокаДанных Из СтрокаДереваИзмерения.Строки Цикл
        Склад = СтрокаДанных.ХарактеристикаСклад;
        Остаток = СтрокаДанных.Общий; // Доступное количество на складе
        
        // Здесь можно выполнить проверку на наличие необходимого количества
        Если Остаток > 0 Тогда
            // Товар есть на складе
        КонецЕсли;
    КонецЦикла;
КонецЦикла;

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

Способ 2. Самостоятельный запрос к регистрам накопления

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

Перед написанием запроса выясним принципиальное различие между основными регистрами остатков в УПП:

  1. Регистр накопления «ТоварыНаСкладах» — отражает только физическое наличие товаров на складах. Он не учитывает резервы под заказы покупателей. Если контролировать остатки только по нему, есть риск продать товар, который фактически находится на складе, но уже зарезервирован под другой заказ.
  2. Регистр накопления «СвободныеОстатки» — хранит доступные остатки с учетом резервов (вычисляется по формуле: Физический остаток минус Резерв). В базах с включенным режимом Расширенной аналитики учета затрат (РАУЗ) именно этот регистр является основным источником для контроля превышения лимитов списания.

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

Посмотрим на пример правильного написания запроса:


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

Запрос.УстановитьПараметр("Период", ТекущаяДата());
Запрос.УстановитьПараметр("СписокНоменклатуры", СписокТоваров); // Массив или СписокЗначений
Запрос.УстановитьПараметр("Склад", СсылкаНаСклад);

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

Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
    // Обработка результатов запроса
    Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура;
    ДоступныйОстаток = ВыборкаДетальныеЗаписи.КоличествоОстаток;
КонецЦикла;

Способ 3. Программный контроль остатков при проведении документов

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

В УПП контроль остатков тесно связан с режимом проведения:

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

Для этого в процедуре проведения подготавливается таблица списания и передается в метод:


// Пример вызова контроля остатков из модуля проведения документа
ПроцедурыКонтроляОстатков.КонтрольОстатковНоменклатуры(
    Ссылка, // Ссылка на проводимый документ
    Движения.СвободныеОстатки, // Набор движений регистра для анализа
    Отказ, // Флаг отказа от проведения
    Истина // Флаг оперативного проведения
);

Таким образом, выбор метода проверки остатков полностью зависит от вашей задачи. Для быстрого анализа на форме используйте функции модуля УправлениеЗапасами, а для контроля проведения и массовой проверки — оптимальные запросы к регистру СвободныеОстатки или встроенные процедуры проведения документов.

← На главную