Часто при доработке конфигурации разработчики сталкиваются с задачей контроля наличия товаров. Возникает закономерный вопрос: есть ли в современных конфигурациях, таких как 1С:Управление торговлей 11.4, готовая функция в общих модулях, куда можно передать список товаров и склад, чтобы получить ошибку при нехватке остатков? Рассмотрим подробнее, как устроена архитектура учета запасов в новых решениях 1С и почему старые подходы здесь больше не работают.
В более старых конфигурациях, таких как УТ 10.3, остаток воспринимался как простое число на складе. Разберем ситуацию в УТ 11.4 (а также в комплексных решениях вроде КА 2 и ERP 2). Здесь архитектура значительно сложнее. Система не просто хранит количество номенклатуры на складе, она учитывает:
Из-за такой многомерности нет банальной функции вида ПроверитьОстаток(Номенклатура, Склад), которая просто вернет Истину или Ложь. Контроль "размазан" по сложной логике алгоритмов проведения документов.
Если вам необходимо программно вмешаться в механизмы работы с остатками или изучить их, проанализируем общий модуль ЗапасыСервер. Именно в нем содержатся ключевые процедуры для работы с запасами:
Однако, как советуют опытные специалисты, если вам нужна простая проверка перед выполнением какой-либо операции (вне типового проведения), лучше создать собственную функцию запроса к регистрам накопления. Выясним причину: типовые общие модули часто рефакторятся, функции переименовываются или их логика меняется от релиза к релизу. Своя изолированная функция проверки (если она нужна только для кастомной логики) будет работать надежнее.
Посмотрим на пример проведения документа в современной типовой конфигурации. Проверка выполняется не предварительным чтением запросом (как это часто делали раньше), а непосредственно при записи набора записей регистра накопления.
Разберем по шагам, как это реализовано на уровне платформы и конфигурации:
ТоварыНаСкладах, ТоварыОрганизаций, РезервыТоваровОрганизаций).Проанализируем ситуацию глубже. Контроль в УТ 11.4 не един, он делится на несколько независимых контуров:
В отличие от старых версий, где остатки проверялись в основном только при оперативном проведении (текущим временем), в УТ 11.4 оперативный и неоперативный контроль объединены. Механизмы контроля работают и при проведении задним числом. Например, контроль по организациям проверяет остаток на конец месяца проводимого документа и на текущую дату актуальности.
Иногда при разработке механизмов переноса данных или создании служебных корректировок возникает потребность временно отключить стандартный контроль остатков. Разберем, как разработчики решают эту задачу. Чаще всего контроль отключается через коллекцию ДополнительныеСвойства самого объекта документа или через ПараметрыСеанса.
Пример (условный) использования дополнительных свойств для обхода проверок (требует точного знания имен свойств конкретного релиза):
ДокументОбъект = СсылкаНаДокумент.ПолучитьОбъект();
// Добавляем специальный флаг в дополнительные свойства объекта
ДокументОбъект.ДополнительныеСвойства.Вставить("ОтключитьКонтрольОстатков", Истина);
ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);
Важно: Использование таких обходов требует глубокого понимания архитектуры конфигурации, так как некорректное отключение контроля приведет к появлению "минусов" в регистрах, что впоследствии нарушит расчет себестоимости и алгоритмы обеспечения потребностей.