В типовой конфигурации «Торговля и Склад 7.7» (ТиС) механизмы резервирования товаров являются одной из самых обсуждаемых и, зачастую, проблемных зон. Пользователи часто сталкиваются с ситуацией, когда товар, поставленный в резерв под конкретного покупателя, беспрепятственно продается другому. Проанализируем, почему это происходит, как система вычисляет остатки и где именно кроются те самые «дыры» в логике программы, о которых говорят опытные разработчики.
Для начала рассмотрим, как 1С 7.7 хранит информацию о наличии ТМЦ. В отличие от современных версий платформы, где данные могут быть распределены по множеству измерений, в ТиС 7.7 за наличие товара отвечают два основных регистра:
ЗаявкамиПокупателей.Важно понимать, что в системе нет регистра «Свободные остатки». Это расчетная величина, которая вычисляется динамически в момент проведения документа или формирования отчета. Проанализируем формулу, которую использует система:
Свободный_остаток = Физический_остаток (из регистра ОстаткиТМЦ) - Зарезервированный_товар (из регистра РезервыТоваров)
Если в настройках системы или в полномочиях пользователя отключен «Контроль остатков», программа перестает обращать внимание на результат этой формулы. Рассмотрим ситуацию: на складе 10 единиц товара, все 10 в резерве. Свободный остаток равен 0. При отключенном контроле система позволит провести документ РеализацияТМЦ на любое количество, так как она просто записывает движения в регистр, не выполняя проверку на «минус».
Более того, если разрешена продажа в минус, система даже не выдаст предупреждение. Это происходит потому, что контроль остатков в 7.7 — это механизм прерывания транзакции проведения. Если прерывание отключено, код внутри модуля документа выполняется до конца, фиксируя списание товара, которого фактически нет или который предназначен для другого.
В конфигурации «Торговля и Склад 7.7» существует тонкая настройка прав в справочнике «Пользователи» на вкладке «Торговля». Разберем две ключевые опции, которые влияют на нашу проблему:
ОстаткиТМЦ.РеализацияТМЦ (созданному на основании заявки) больше товара, чем было зарезервировано в исходной ЗаявкеПокупателя.Если эти опции включены, система считает действия пользователя легитимными и не блокирует проведение, даже если нарушается логика резервирования.
Опытные программисты 1С часто упоминают критическую ошибку в логике типовой ТиС 7.7, которая приводит к возникновению отрицательных резервов. Посмотрим на примере, как это работает и почему это опасно.
Представим ситуацию:
РеализациюТМЦ на основании этой заявки, но меняет количество на 7 штук.РезервыТоваров по данной заявке образуется остаток -2.Теперь вспомним формулу свободного остатка: Остаток (физический) - Резерв. Если физически на складе 10 штук, а резерв составляет -2, математика работает следующим образом:
10 - (-2) = 12
Результат: система считает, что свободного товара стало 12 штук, хотя физически их всего 10! Отрицательный резерв начинает работать как «виртуальный приход», искусственно увеличивая доступное к продаже количество. Это и есть та самая дыра, которая приводит к тому, что менеджеры видят в базе товар, которого не существует в природе.
Часто путаница возникает из-за невнимательности к управленческой аналитике. Резерв в 7.7 жестко привязан к комбинации «Фирма + Склад». Проанализируем сценарий:
Товар пришел на «Фирму А» на «Склад 1». Менеджер выписал ЗаявкуПокупателя от «Фирмы Б». В ТиС 7.7 резерв может не зафиксироваться или зафиксироваться некорректно, если не настроены правила межфирменных продаж. В итоге при отгрузке система не увидит резерва и спишет товар как свободный остаток, хотя менеджер был уверен, что бронь установлена.
Для исправления ситуации программисты часто дорабатывают глобальный модуль, в частности процедуру глКонтрольОстатковТМЦ. Рассмотрим пример упрощенной логики, которую можно внедрить для более жесткого контроля резервов:
// Пример логики проверки свободного остатка в глобальном модуле
Процедура глКонтрольОстатков(Контекст, Товар, Склад, Фирма, НужноСписать)
РегОстатки = СоздатьОбъект("Регистр.ОстаткиТМЦ");
РегРезервы = СоздатьОбъект("Регистр.РезервыТоваров");
ФизОстаток = РегОстатки.СводныйОстаток(Фирма, Товар, Склад, , "ОстатокТовара");
Резерв = РегРезервы.СводныйОстаток(,, Товар, Склад, "РезервТовара");
СвободныйОстаток = ФизОстаток - Резерв;
Если СвободныйОстаток < НужноСписать Тогда
Сообщить("Недостаточно свободного остатка для товара: " + Товар.Наименование);
Сообщить("Свободно: " + СвободныйОстаток + ", требуется: " + НужноСписать);
// Здесь может быть статус возврата 0 для отмены проведения
КонецЕсли;
КонецПроцедуры
Такой подход позволяет игнорировать настройки «Продажа в минус», если речь идет о нарушении чужих резервов. Однако внедрение подобного кода требует аккуратности, так как может замедлить работу системы при больших объемах данных.
Если вы не планируете глубоко менять код конфигурации, воспользуйтесь административными мерами, которые помогут минимизировать проблемы:
РезервыТоваров от «мусора» и возвращает товар в свободный остаток.Подведем итог: резервы в 1С 7.7 работают корректно только при строгой дисциплине ведения документов и включенном контроле остатков. Понимание того, как отрицательный резерв математически увеличивает свободный остаток, поможет вам быстрее находить причины ошибок в учете и поддерживать актуальность данных на складе.