Одной из распространенных проблем при ведении складского и управленческого учета в конфигурациях «1С:Управление производственным предприятием 1.3» и «1С:Комплексная автоматизация 1.1» является списание товаров «в минус». Пользователи часто сталкиваются с ситуацией: флажки запрета списания при отсутствии остатка установлены, но документы реализации или перемещения продолжают успешно проводиться при нулевых и отрицательных складских остатках. Разберем по шагам, где находятся необходимые настройки в интерфейсе, выясним архитектурные причины такого поведения программы и рассмотрим способы решения проблемы.
В отличие от более ранних редакций конфигураций на обычных формах, где параметры находились в меню «Сервис > Пользователи > Настройка дополнительных прав пользователей», в типовых УПП и КА 1.1 управление ограничениями перенесено в справочник пользователей и профили полномочий. Проанализируем, как добраться до нужных параметров:
Пользователи (меню «Справочники > Предприятие > Пользователи»).Если эти флаги сняты (или установлены в значение Ложь), система должна блокировать проведение расходных документов при нехватке товара. Однако на практике блокировка часто не срабатывает из-за системных ограничений платформы и конфигурации.
Рассмотрим типовой сценарий: администратор базы данных настраивает запрет отрицательных остатков в дополнительных правах для своей учетной записи, проводит расходную накладную, но документ всё равно проводится без ошибок. В коде типовых конфигураций 1С:УПП и КА 1.1 реализовано жесткое правило: для пользователя с назначенной ролью ПолныеПрава функция проверки дополнительных прав безусловно возвращает разрешение на любые действия. Программный код попросту пропускает проверки превышения остатков склада и организации.
Для проверки работы механизма необходимо тестировать проведение под учетной записью обычного пользователя (например, кладовщика или менеджера по продажам), у которого полностью отсутствуют полные права и права администратора.
Главная архитектурная причина, по которой типовая конфигурация позволяет проводить документы в минус, заключается в разделении проведения на оперативное и неоперативное. Разберем этот механизм детально:
Позиция разработчиков типовых решений заключается в том, что если документ регистрируется задним числом (например, накладная недельной давности), то факт отгрузки в реальности уже произошел. Если запретить проводить такой документ, база данных разойдется с реальной первичной документацией. В результате любые документы, созданные или перепроведенные задним числом, списывают товар без контроля наличия на складе.
Часто пользователи путают контроль физических остатков с механизмами расширенной аналитики учета затрат (РАУЗ). При проведении документа может появляться служебное сообщение: «Для номенклатуры движения сформировались без суммовой оценки по регламентированному учету».
Проанализируем природу этого сообщения:
ТоварыНаСкладах и ТоварыОрганизаций, в то время как стоимостная оценка рассчитывается по регистру УчетЗатрат.Расчет себестоимости выпуска в конце месяца.Важно: регулярное списание товара в минус при включенном РАУЗ критически опасно. Расчет себестоимости в РАУЗ выполняется методом решения системы линейных уравнений (СЛАУ). Отрицательные остатки на счетах учета МПЗ приводят к нарушению сходимости итерационного алгоритма, из-за чего регламентная операция начинает выдавать многомиллионные искажения в себестоимости.
Если специфика учета на предприятии требует полного запрета списания в минус даже задним числом, типовыми настройками обойтись не удастся — потребуется доработка системы. Рассмотрим основные подходы к реализации контроля.
Чтобы не модифицировать типовые модули документов и сохранить простоту обновления конфигурации, оптимально использовать общую подписку на событие. Создадим подписку на событие ОбработкаПроведения для документов списания (РеализацияТоваровУслуг, ТребованиеНакладная, ПеремещениеТоваров).
При реализации контроля «задним числом» критически важно учитывать подводный камень остатков в будущем. Недостаточно просто проверить остаток на дату проводимого документа. Если неделю назад на складе числилось 10 единиц, мы списываем 10 единиц, но позавчера уже было списано еще 5 единиц, то проведение сегодняшней накладной недельной датой уведет в минус остаток позавчерашнего дня. Следовательно, запрос должен контролировать минимальный остаток на всем интервале от даты документа до текущего момента.
Посмотрим на пример логики проверки в модуле подписки на событие:
Процедура ПроверитьОстаткиПриПроведении(Источник, Отказ, РежимПроведения) Экспорт
// Пропускаем проверку, если проведение уже прервано
Если Отказ Тогда
Возврат;
КонецЕсли;
// Исключаем полные права при необходимости жесткого контроля
Если Не РольДоступна("ПолныеПрава") Тогда
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ТаблицаОстатков.Номенклатура,
| ТаблицаОстатков.КоличествоОстаток КАК Остаток
|ИЗ
| РегистрНакопления.ТоварыНаСкладах.Остатки(&ГраницаКонтроля, Склад = &Склад И Номенклатура В (&СписокНоменклатуры)) КАК ТаблицаОстатков
|ГДЕ
| ТаблицаОстатков.КоличествоОстаток < 0";
// Устанавливаем границу на конец текущего дня или момент времени документа
Граница = Новый Граница(Источник.МоментВремени(), ВидГраницы.Включая);
Запрос.УстановитьПараметр("ГраницаКонтроля", Граница);
Запрос.УстановитьПараметр("Склад", Источник.Склад);
Запрос.УстановитьПараметр("СписокНоменклатуры", Источник.Товары.ВыгрузитьКолонку("Номенклатура"));
Результат = Запрос.Выполнить();
Если Не Результат.Пустой() Тогда
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
Сообщить("Недостаточно остатка по товару: " + Выборка.Номенклатура);
КонецЦикла;
Отказ = Истина;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Если документы переносятся из внешних баз (например, «Альфа-Авто» или сторонних систем) через COM-соединение, необходимо настроить процесс интеграции следующим образом:
ПолныеПрава (например, с ролью «Оператор обмена»), которому назначены стандартные права на ввод и проведение документов.Записать(РежимЗаписиДокумента.Проведение, РежимПроведенияДокумента.Оперативный) исключительно в тех случаях, когда дата документа совпадает с текущей датой.-debug) и в конфигураторе не будет активирована отладка внешних соединений.Если внесение изменений в типовую конфигурацию нежелательно, стабилизировать учет можно комбинацией типовых механизмов: