Как программно проверить остатки товаров на складе в 1С:УТ 11.4?

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

Часто при доработке конфигурации разработчики сталкиваются с задачей контроля наличия товаров. Возникает закономерный вопрос: есть ли в современных конфигурациях, таких как 1С:Управление торговлей 11.4, готовая функция в общих модулях, куда можно передать список товаров и склад, чтобы получить ошибку при нехватке остатков? Рассмотрим подробнее, как устроена архитектура учета запасов в новых решениях 1С и почему старые подходы здесь больше не работают.

Почему нет простой функции проверки остатков?

В более старых конфигурациях, таких как УТ 10.3, остаток воспринимался как простое число на складе. Разберем ситуацию в УТ 11.4 (а также в комплексных решениях вроде КА 2 и ERP 2). Здесь архитектура значительно сложнее. Система не просто хранит количество номенклатуры на складе, она учитывает:

  1. Резервы под конкретные заказы покупателей;
  2. Различные виды запасов;
  3. Статусы обеспечения и графики поступления;
  4. Механизмы "Интеркампани" (передачи товаров между собственными организациями);
  5. Серийный учет.

Из-за такой многомерности нет банальной функции вида ПроверитьОстаток(Номенклатура, Склад), которая просто вернет Истину или Ложь. Контроль "размазан" по сложной логике алгоритмов проведения документов.

Где искать логику работы с запасами?

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

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

Как физически работает контроль остатков в УТ 11.4?

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

Разберем по шагам, как это реализовано на уровне платформы и конфигурации:

  1. Алгоритмы документа формируют предварительные движения в памяти.
  2. Система записывает эти движения в регистры (например, ТоварыНаСкладах, ТоварыОрганизаций, РезервыТоваровОрганизаций).
  3. В модулях наборов записей или подписках на события срабатывает механизм платформенного контроля. Система проверяет, не ушли ли итоги регистра в минус с учетом новых записей.
  4. Если обнаруживается нехватка (отрицательный остаток), формируется отказ от проведения, транзакция отменяется, а пользователю выводится детальное сообщение об ошибке с указанием конкретной номенклатуры.

Виды контроля остатков

Проанализируем ситуацию глубже. Контроль в УТ 11.4 не един, он делится на несколько независимых контуров:

В отличие от старых версий, где остатки проверялись в основном только при оперативном проведении (текущим временем), в УТ 11.4 оперативный и неоперативный контроль объединены. Механизмы контроля работают и при проведении задним числом. Например, контроль по организациям проверяет остаток на конец месяца проводимого документа и на текущую дату актуальности.

Отключение проверок (для служебных целей)

Иногда при разработке механизмов переноса данных или создании служебных корректировок возникает потребность временно отключить стандартный контроль остатков. Разберем, как разработчики решают эту задачу. Чаще всего контроль отключается через коллекцию ДополнительныеСвойства самого объекта документа или через ПараметрыСеанса.

Пример (условный) использования дополнительных свойств для обхода проверок (требует точного знания имен свойств конкретного релиза):


ДокументОбъект = СсылкаНаДокумент.ПолучитьОбъект();
// Добавляем специальный флаг в дополнительные свойства объекта
ДокументОбъект.ДополнительныеСвойства.Вставить("ОтключитьКонтрольОстатков", Истина);
ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);

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

← На главную