Как отключить контроль остатков при отмене проведения документа в 1С:ERP, КА и УТ?

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

Каждый администратор и разработчик систем на базе 1С:ERP Управление предприятием, Комплексная автоматизация (КА 2) или Управление торговлей (УТ 11) рано или поздно сталкивается с ситуацией, когда необходимо срочно отменить проведение старого документа. Однако система упорно отказывается это делать, выдавая ошибку о нехватке остатков организации. Самое неприятное в этой ситуации то, что штатные механизмы (такие как кнопка «Отключить контроль остатков на время сеанса» или отключение контроля обеспечения на складе) просто не срабатывают.

В этой статье мы подробно проанализируем, почему так происходит, разберем логику работы механизмов проведения 1С «под капотом» и рассмотрим несколько надежных практических способов обойти этот контроль — от простых программных скриптов до создания полноценного расширения.

Почему штатные настройки контроля остатков не помогают?

Начиная с современных версий ERP, КА и УТ, фирма «1С» кардинально изменила логику проверки остатков при отмене проведения документов. Ранее для отключения контроля достаточно было использовать параметр сеанса ПроводитьБезКонтроляОстатковТоваровОрганизаций. Теперь же проверка отрицательных остатков выполняется на самом последнем этапе транзакции проведения или ее отмены.

Давайте выясним причину такого поведения системы. Вся проверка сосредоточена в общем модуле ПроведениеСерверУТ, а именно в процедуре ВыполнитьКонтрольРезультатовПроведения. Данный механизм анализирует фактические движения, которые документ уже успел записать в информационную базу. Проблема заключается в том, что разработчики 1С намеренно исключили проверку параметра сеанса ПроводитьБезКонтроляОстатковТоваровОрганизаций в этой процедуре. Сделано это ради безопасности учета: появление «минусов» по организациям мгновенно рушит распределение запасов, ломает партионный учет, расчет себестоимости и механизмы Интеркампани.

Тем не менее бывают экстренные случаи, когда документ отменить необходимо. Рассмотрим подробнее рабочие технические варианты обхода этого жесткого контроля.

Способ 1. Использование расширения конфигурации (Рекомендуемый вариант)

Если вам регулярно требуется отменять проведение документов, лучшим системным решением будет создание небольшого расширения. Мы можем связать штатную кнопку отключения контроля остатков с финальной проверкой в модуле ПроведениеСерверУТ.

Для этого выполним следующие шаги:

  1. Создадим новое расширение конфигурации.
  2. Добавим в расширение общий модуль ПроведениеСерверУТ.
  3. Для метода ВыполнитьКонтрольРезультатовПроведения добавим аннотацию &Перед.
  4. Напишем код, который будет прерывать проверку, если в сеансе пользователя принудительно отключен контроль остатков.

Посмотрим на пример кода, который необходимо поместить в расширение:


&Перед("ВыполнитьКонтрольРезультатовПроведения")
Процедура ИмяРасширения_ВыполнитьКонтрольРезультатовПроведения(ДокументОбъект, Отказ)
    
    // Проверяем, включена ли штатная опция отключения контроля в сеансе
    Если ПараметрыСеанса.ПроводитьБезКонтроляОстатковТоваровОрганизаций Тогда
        // Если контроль отключен пользователем, просто выходим из процедуры, игнорируя дальнейшие проверки
        Возврат; 
    КонецЕсли;
    
КонецПроцедуры

При таком подходе штатная кнопка «Отключить контроль остатков товаров организаций (на время сеанса)» начнет работать корректно и позволит безболезненно распроводить любые проблемные документы.

Способ 2. Использование дополнительных свойств объекта

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

Выполнить этот код можно с помощью любой внешней обработки (например, «Групповое изменение реквизитов» или написав собственную простую обработку в один клик):


// Получаем объект нужного документа по ссылке
ДокументОбъект = СсылкаНаДокумент.ПолучитьОбъект();

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

// Выполняем отмену проведения в обход стандартной транзакции контроля
ДокументОбъект.Записать(РежимЗаписиДокумента.ОтменаПроведения);

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

Способ 3. Имитация режима обновления информационной базы

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

Система проверяет это состояние через параметр сеанса ПараметрыОбработчикаОбновления. Мы можем временно перевести наш сеанс в режим «обновления», отменить проведение документа и вернуть все обратно. Напишем код для внешней обработки:


// Сохраняем текущее состояние параметра сеанса, чтобы ничего не сломать
СтароеЗначение = ПараметрыСеанса.ПараметрыОбработчикаОбновления;

// Формируем структуру, имитирующую монопольный режим обновления
СтруктураПараметров = Новый Структура;
СтруктураПараметров.Вставить("РежимВыполнения", "Монопольно");

// Устанавливаем параметры в сеанс
ПараметрыСеанса.ПараметрыОбработчикаОбновления = СтруктураПараметров;

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

Способ 4. Использование режима загрузки данных

Этот метод часто применяется разработчиками при написании обработок принудительного снятия документов с проведения. При установке свойства ОбменДанными.Загрузка в значение Истина, платформа 1С отключает большинство обработчиков событий уровня объектов.


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

Важное предупреждение: Использование этого метода имеет побочные эффекты. Принудительная запись документа со статусом «Не проведен» в режиме загрузки данных может не очистить связанные регистры сведений и накопления (например, регистр «Резервы товаров организаций» или «Товары организаций»). После применения этого способа вам может потребоваться вручную очистить наборы записей по регистрам с отбором по данному регистратору.

Способ 5. Настройка прав и административной константы

Если перед вами стоит задача не просто разово решить проблему, а выстроить правильный бизнес-процесс в компании, рекомендуется подойти к вопросу организационно. Позволять рядовым пользователям отменять проведение документов задним числом в обход контроля остатков — прямая дорога к хаосу в учете себестоимости.

Проанализируем отличное архитектурное решение:

  1. Создайте новую константу, например, РазрешитьОтменуПроведенияВМинус.
  2. Создайте роль или группу доступа «Разрешить отмену проведения без контроля остатков».
  3. В расширении (в процедуре ВыполнитьКонтрольРезультатовПроведения) пропишите проверку: контроль отключается только в том случае, если у пользователя есть соответствующая роль И в системе включена указанная константа.

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

← На главную