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