Как исправить ошибку «Документ был исправлен, отмена проведения документа запрещена!» в 1С:ЗУП и 1С:УПП?

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

Каждый бухгалтер-расчетчик или администратор систем на базе 1С:Зарплата и Управление Персоналом 2.5 или 1С:Управление производственным предприятием 1.3 рано или поздно сталкивается со специфической проблемой взаимной блокировки документов. Типичный сценарий: был зарегистрирован отпуск сотрудника, затем расчетчик создал к нему документ-исправление («исправил» исходный отпуск в текущем периоде), а позже возникла необходимость откатить операцию назад. При попытке распровести документы система выдает жесткое предупреждение: «Документ был исправлен, отмена проведения документа запрещена!».

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

Выясняем причину: как устроен «замкнутый круг» блокировки?

Давайте разберем логику работы системы, которая приводит к возникновению этой ошибки. В программах 1С реализован строгий контроль последовательности проведения документов учета времени и расчетов. Когда вы пытаетесь отменить цепочку исправлений отпуска при наличии проведенного табеля, система выстраивает следующую цепочку блокировок:

  1. Блокировка исходного отпуска. Исходное (первое) Начисление отпуска жестко блокируется, так как на него ссылается созданный документ-исправление через внутренний реквизит связи ПерерассчитываемыйДокумент. Попытка его распроведения напрямую сразу выдает ошибку о запрете отмены проведения исправленного документа.
  2. Блокировка через кнопку отмены исправления. Чтобы снять эту блокировку, в исходном документе предусмотрена кнопка «Отменить исправление». При ее нажатии система пытается программно пометить документ-исправление на удаление и очистить ссылку. Однако в этот момент программа выдает ошибку «Удалить не удалось».
  3. Блокировка со стороны Табеля. Причина отказа в удалении исправления кроется в том, что за этот расчетный период уже проведен документ Табель учета рабочего времени. Этот документ зафиксировал фактически отработанные дни и невыходы сотрудника.
  4. Невозможность распровести Табель. Пользователь пытается зайти в Табель и отменить его проведение, но система блокирует и это действие! Модуль проведения табеля содержит алгоритм контроля: нельзя распровести табель, если по сотрудникам в этом периоде проведены расчетные документы (в данном случае — то самое проведенное начисление-исправление отпуска).

Таким образом, круг замыкается: «Табель» не распроводится из-за проведенного исправления отпуска, а исправление отпуска нельзя пометить на удаление из-за проведенного «Табеля». Выяснив причину блокировки, рассмотрим эффективные варианты выхода из этого тупика.

Способ 1. Использование штатной кнопки «Отменить исправление»

Рассмотрим базовое решение, заложенное разработчиками 1С. В форме документа Начисление отпуска работникам организаций в левом нижнем углу интерфейса предусмотрена специальная кнопка.

Если в системе нет дополнительных блокирующих документов (например, табель еще не проведен или период открыт), последовательность действий следующая:

  1. Откройте исходный (самый первый, который был исправлен) документ Начисление отпуска работникам организаций.
  2. В левом нижнем углу формы найдите и нажмите кнопку «Отменить исправление».
  3. Программа автоматически найдет подчиненный документ-исправление, снимет его с проведения, пометить на удаление и очистит связь между ними.
  4. После успешного выполнения этой процедуры исходный документ станет доступен для редактирования или отмены проведения.

Если же кнопка выдает ошибку удаления, переходим к альтернативным методам.

Способ 2. Временное удаление сотрудника из Табеля (Решение без программирования)

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

  1. Откройте проведенный документ Табель учета рабочего времени организации за тот месяц, в котором производились начисления.
  2. Найдите в табличной части строку с проблемным сотрудником, по которому возник «замкнутый круг».
  3. Удалите строку с этим сотрудником из табличной части документа (или временно замените его дни невыходов на обычные рабочие дни с кодом «Я»).
  4. Запишите и проведите документ Табель. Поскольку данные по сотруднику из табеля временно исключены, система снимет блокировку с его расчетных документов.
  5. Откройте исходный документ Начисление отпуска и нажмите кнопку «Отменить исправление». Процедура пройдет штатно: документ-исправление пометится на удаление, а связь разорвется.
  6. Теперь отмените проведение исходного начисления отпуска.
  7. Вернитесь в документ Табель, добавьте сотрудника обратно (или восстановите исходные коды невыходов), перезаполните его данные и заново проведите документ.

Способ 3. Принудительный разрыв связи через обработку (Для администраторов)

Связь между исходным документом и исправлением удерживает реквизит ПерерассчитываемыйДокумент, расположенный в документе-исправлении. Если мы очистим этот реквизит, система перестанет считать исходный отпуск исправленным, что позволит легко его распровести.

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

  1. Откройте стандартную обработку «Групповое изменение реквизитов» (в старых редакциях — «Универсальный подбор и обработка объектов»).
  2. В качестве изменяемого типа данных выберите документ Начисление отпуска работникам организаций.
  3. Настройте отбор: укажите ссылку конкретно на ваш документ-исправление (или сделайте фильтр, где реквизит ПерерассчитываемыйДокумент равен вашему исходному документу отпуска).
  4. В списке реквизитов найдите поле ПерерассчитываемыйДокумент и установите напротив него флаг изменения, оставив значение **пустым**.
  5. Нажмите кнопку «Изменить реквизиты».

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

Способ 4. Программное распроведение в обход проверок (Для программистов)

Большинство транзакционных блокировок и проверок в 1С срабатывают исключительно при интерактивной работе пользователя через формы интерфейса. Если выполнить операцию отмены проведения программно, проверки проведения можно обойти.

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


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

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

Способ 5. Решение проблемы при обновлении конфигурации

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

Чтобы успешно завершить обновление, выполните следующие действия:

  1. Временно откройте период редактирования для исправления ошибок прошлых лет.
  2. Найдите по журналу регистрации или по коду ошибки обновления конкретную проблемную пару документов.
  3. Используйте Способ 2 или Способ 3, чтобы разорвать некорректные связи в документах.
  4. Запустите процесс обновления конфигурации повторно в режиме «Конфигуратор» или через предприятие.
  5. После успешного завершения обновления обязательно закройте периоды обратно, чтобы исключить случайное изменение исторических данных пользователями.

Профилактика проблемы: методологические рекомендации

Для того чтобы полностью исключить появление подобных «замкнутых кругов» в будущем, рассмотрим методологию учета рабочего времени, рекомендуемую разработчиками фирмы 1С.

В программах линейки 1С:ЗУП реализован удобный метод отклонений. Это означает, что если у ваших сотрудников стандартные графики работы (например, обычная пятидневка), вам нет необходимости ежемесячно создавать документы «Табель учета рабочего времени». Система автоматически рассчитывает фактически отработанное время на основании назначенных графиков за вычетом зарегистрированных документов отклонений (отпусков, больничных, командировок). Если вы откажетесь от ручного ввода документов Табель там, где это возможно, проблема взаимных блокировок исчезнет сама собой.

← На главную