Как разрешить проведение документа будущей датой из формы списка в УТ 11.5?

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

При доработке типовых конфигураций, таких как Управление Торговлей 11.5, разработчики часто сталкиваются с жесткими ограничениями платформы и встроенной бизнес-логики. Одной из таких проблем является запрет на оперативное проведение документов будущей датой. Если при открытой форме документа эту проверку можно обойти относительно легко, то при попытке провести документ из списка (журнала) возникают сложности: отладчик не останавливается, а платформа выдает ошибку. Разберем детально, почему так происходит и как это исправить.

Суть проблемы: почему не работает код в модуле формы

Рассмотрим типичную ситуацию. Нам необходимо разрешить проведение документа «Приобретение товаров и услуг» будущей датой. Мы создали расширение, добавили туда форму документа и в процедуре ОбработкаПроведения или ПередЗаписью (в модуле формы) прописали нужную логику. Открываем документ, меняем дату на завтрашнюю, нажимаем «Провести» — все работает.

Однако, если мы попытаемся нажать кнопку «Провести» в списке документов (не открывая саму форму), система выдаст ошибку: «Дата документа больше текущей». При этом точки останова, установленные в модуле формы, не срабатывают.

Причина проста: Когда действие выполняется из списка (журнала) документов, модуль формы документа не инициализируется. Форма не создается, события формы не вызываются. Команда списка обращается напрямую к объекту базы данных или к менеджеру объекта.

Следовательно, любые проверки и изменения режимов, написанные в модуле формы, бесполезны для массовой обработки или проведения из списка.

Поведение платформы и оперативное проведение

Вторая часть проблемы кроется в механике самого проведения. В платформе 1С существует два режима проведения:

  1. Оперативное — отражение факта хозяйственной жизни в реальном времени (текущей датой и временем).
  2. Неоперативное — отражение факта прошлым или будущим временем.

Платформа 1С жестко контролирует это правило: Оперативное проведение будущей датой невозможно. Если попытка записи происходит в оперативном режиме, а дата документа больше текущей даты сеанса (даже на секунду), платформа генерирует исключение (ошибку) еще до того, как управление будет передано в процедуру ОбработкаПроведения модуля объекта.

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

Настройка отладки для поиска ошибки

В обсуждении была затронута важная тема: почему не срабатывает отладка. В современных конфигурациях (ERP, КА, УТ) проведение часто выполняется в фоновом режиме. Чтобы «поймать» выполнение кода, необходимо правильно настроить отладчик.

Разберем необходимые действия для включения полноценной отладки:

  1. Отладка на сервере: Убедитесь, что сервер 1С запущен с ключом -debug.
  2. Отладка фоновых заданий: В Конфигураторе перейдите в меню Отладка — Подключение — Автоматическое подключение. Установите галочку напротив пункта «Фоновые задания».
  3. Остановка по ошибке: Если вы не понимаете, откуда вылетает сообщение, перейдите в Отладка — Остановка по ошибке и установите флаг «Останавливаться по ошибке». Это заставит конфигуратор остановиться в момент возникновения исключения платформы (даже если это системная ошибка даты).

Решение задачи: перенос логики в модуль объекта

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

Рассмотрим пошаговое решение через Расширение конфигурации:

1. Добавьте документ (например, ПриобретениеТоваровУслуг) в расширение.
2. Перейдите в Модуль объекта этого документа в расширении.
3. Создайте обработчик события ПередЗаписью с аннотацией &Перед (или &Вместо, если требуется полностью переписать логику, но &Перед безопаснее).

В этой процедуре нам нужно проверить дату и принудительно сменить режим проведения на «Неоперативный». В этом случае платформа пропустит документ с будущей датой.

Пример кода для модуля объекта в расширении:


&Перед("ПередЗаписью")
Процедура Расш1_ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
    
    // Проверяем, что выполняется именно проведение
    Если РежимЗаписи = РежимЗаписиДокумента.Проведение Тогда
        
        // Если дата документа больше текущей даты сеанса
        Если ЭтотОбъект.Дата > ТекущаяДата() Тогда
            
            // Принудительно устанавливаем неоперативный режим.
            // Это предотвратит ошибку платформы.
            РежимПроведения = РежимПроведенияДокумента.Неоперативный;
            
        КонецЕсли;
        
    КонецЕсли;

КонецПроцедуры

Важные нюансы:

Альтернативный вариант: Свойства конфигурации

Существует еще один способ, не требующий написания кода, но он меняет поведение системы глобально. В свойствах объекта конфигурации (документа) есть галочка «Разрешить оперативное проведение».

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

Заключение

Проблема с проведением документов из списка в УТ 11.5 решается переносом логики из модуля формы в модуль объекта. Главная задача — изменить РежимПроведения на Неоперативный в событии ПередЗаписью, если дата документа находится в будущем. Это позволяет обойти платформенное ограничение и корректно отразить документ в учете.

← На главную