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