При доработке типовых конфигураций, таких как Управление Торговлей 11.5, разработчики часто сталкиваются с жесткими ограничениями платформы и встроенной бизнес-логики. Одной из таких проблем является запрет на оперативное проведение документов будущей датой. Если при открытой форме документа эту проверку можно обойти относительно легко, то при попытке провести документ из списка (журнала) возникают сложности: отладчик не останавливается, а платформа выдает ошибку. Разберем детально, почему так происходит и как это исправить.
Рассмотрим типичную ситуацию. Нам необходимо разрешить проведение документа «Приобретение товаров и услуг» будущей датой. Мы создали расширение, добавили туда форму документа и в процедуре ОбработкаПроведения или ПередЗаписью (в модуле формы) прописали нужную логику. Открываем документ, меняем дату на завтрашнюю, нажимаем «Провести» — все работает.
Однако, если мы попытаемся нажать кнопку «Провести» в списке документов (не открывая саму форму), система выдаст ошибку: «Дата документа больше текущей». При этом точки останова, установленные в модуле формы, не срабатывают.
Причина проста: Когда действие выполняется из списка (журнала) документов, модуль формы документа не инициализируется. Форма не создается, события формы не вызываются. Команда списка обращается напрямую к объекту базы данных или к менеджеру объекта.
Следовательно, любые проверки и изменения режимов, написанные в модуле формы, бесполезны для массовой обработки или проведения из списка.
Вторая часть проблемы кроется в механике самого проведения. В платформе 1С существует два режима проведения:
Платформа 1С жестко контролирует это правило: Оперативное проведение будущей датой невозможно. Если попытка записи происходит в оперативном режиме, а дата документа больше текущей даты сеанса (даже на секунду), платформа генерирует исключение (ошибку) еще до того, как управление будет передано в процедуру ОбработкаПроведения модуля объекта.
Именно поэтому стандартная кнопка «Провести» в списке, которая по умолчанию пытается выполнить оперативное проведение (если оно разрешено в свойствах документа), вызывает ошибку до срабатывания вашего кода.
В обсуждении была затронута важная тема: почему не срабатывает отладка. В современных конфигурациях (ERP, КА, УТ) проведение часто выполняется в фоновом режиме. Чтобы «поймать» выполнение кода, необходимо правильно настроить отладчик.
Разберем необходимые действия для включения полноценной отладки:
-debug.Чтобы разрешить проведение будущей датой из списка, нам нужно перехватить управление до того, как платформа выполнит проверку на соответствие даты и режима проведения. Единственное место, где это можно сделать гарантированно для всех сценариев (форма, список, программное создание) — это событие ПередЗаписью в модуле объекта.
Рассмотрим пошаговое решение через Расширение конфигурации:
1. Добавьте документ (например, ПриобретениеТоваровУслуг) в расширение.
2. Перейдите в Модуль объекта этого документа в расширении.
3. Создайте обработчик события ПередЗаписью с аннотацией &Перед (или &Вместо, если требуется полностью переписать логику, но &Перед безопаснее).
В этой процедуре нам нужно проверить дату и принудительно сменить режим проведения на «Неоперативный». В этом случае платформа пропустит документ с будущей датой.
Пример кода для модуля объекта в расширении:
&Перед("ПередЗаписью")
Процедура Расш1_ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
// Проверяем, что выполняется именно проведение
Если РежимЗаписи = РежимЗаписиДокумента.Проведение Тогда
// Если дата документа больше текущей даты сеанса
Если ЭтотОбъект.Дата > ТекущаяДата() Тогда
// Принудительно устанавливаем неоперативный режим.
// Это предотвратит ошибку платформы.
РежимПроведения = РежимПроведенияДокумента.Неоперативный;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Важные нюансы:
РежимПроведения, доступный в событии ПередЗаписью. Именно его изменение влияет на то, как платформа будет обрабатывать документ дальше.&Вместо для стандартных методов, будьте осторожны: вы отключаете типовую логику проверок, что может привести к нарушению целостности данных. Лучше использовать &Перед для изменения параметров или &После для доп. действий. В данном случае &Перед идеально подходит.Существует еще один способ, не требующий написания кода, но он меняет поведение системы глобально. В свойствах объекта конфигурации (документа) есть галочка «Разрешить оперативное проведение».
Если в расширении изменить это свойство (снять галочку), документ всегда будет проводиться в неоперативном режиме, независимо от даты. Это решит проблему ошибки, но лишит пользователей возможности оперативного проведения (что может быть критично для контроля остатков «здесь и сейчас»). Поэтому программный метод через ПередЗаписью является более гибким и предпочтительным.
Проблема с проведением документов из списка в УТ 11.5 решается переносом логики из модуля формы в модуль объекта. Главная задача — изменить РежимПроведения на Неоперативный в событии ПередЗаписью, если дата документа находится в будущем. Это позволяет обойти платформенное ограничение и корректно отразить документ в учете.