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