Почему управляемая форма не запрашивает режим проведения документа в течение дня и как это изменить

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

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

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

Выясним причину разного поведения платформ

Проанализируем алгоритмы, заложенные разработчиками платформы 1С для свойства ИспользоватьРежимПроведения со значением Автоматически в формах обоих типов:

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

Ограничения управляемых форм и тонкого клиента

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

  1. Невозможность использования значения Запрашивать: Если попытаться установить свойство формы ИспользоватьРежимПроведения = ИспользованиеРежимаПроведения.Запрашивать, то при попытке проведения документа в тонком или веб-клиенте платформа вызовет критическую ошибку: «Интерактивный выбор режима проведения документа не поддерживается».
  2. Контекст доступа к свойству: Свойство ИспользоватьРежимПроведения доступно для изменения только на сервере (например, в обработчиках ПриСозданииНаСервере или ПередЗаписьюНаСервере). На клиенте изменить это свойство прямой записью нельзя.

Способы эмуляции поведения обычной формы в управляемом интерфейсе

Разберем по шагам практические способы, позволяющие настроить поведение управляемой формы аналогично обычным формам.

Вариант 1. Программный вызов пользовательского диалога на клиенте

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

В модуле управляемой формы реализуем следующую логику:


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

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

&НаКлиенте
Процедура ПослеВыбораРежимаПроведения(Результат, ДополнительныеПараметры) ВариантАсинхронный
    
    Если Результат = Неопределено Тогда
        Возврат; // Пользователь отменил диалог
    КонецЕсли;
    
    // Фиксируем выбор и возобновляем запись
    ДополнительныеПараметры.Вставить("РежимПроведенияВыбран", Истина);
    ДополнительныеПараметры.Вставить("ВыбранныйРежимПроведения", Результат);
    
    ЭтотОбъект.Записать(ДополнительныеПараметры);

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

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

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

Вариант 2. Фиксация времени уже проведенного документа

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

В процедуре ПриСозданииНаСервере или ПередЗаписьюНаСервере установим для проведенных документов неоперативный режим проведения по умолчанию:


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

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

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

Вариант 3. Управление позиционированием времени через свойство АвтоВремя

Посмотрим на дополнительный инструмент платформы — свойство АвтоВремя. Оно задает правила установки времени документа при его проведении и записи.

Для свойства доступны следующие варианты значения системного перечисления АвтоВремя:

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

← На главную