Как записать элемент справочника в 1С без вызова процедур формы и менеджера

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

Часто в практике разработки на платформе 1С возникает задача: необходимо изменить и сохранить элемент справочника или документ, но при этом сделать так, чтобы не срабатывали различные проверки, обработчики при записи и бизнес-логика. Проанализируем ситуацию подробнее и разберем по шагам, как правильно обойти процедуры формы, модуля объекта и менеджера при записи данных.

Программная запись и процедуры формы

Начнем с самого простого. Как справедливо отмечают разработчики, процедуры формы (такие как ПередЗаписьюНаСервере, ПослеЗаписи или ПередЗаписью на клиенте) срабатывают исключительно при интерактивной работе пользователя. Если пользователь нажимает кнопку «Записать» или «Записать и закрыть» в интерфейсе, платформа инициирует весь цикл событий формы.

Если же мы выполняем запись программно, используя метод Объект.Записать(), то ни один обработчик модуля формы вызван не будет. Платформа полностью их игнорирует. Таким образом, чтобы обойти логику формы, достаточно просто сохранить объект кодом, а не интерактивным действием.

Использование свойства ОбменДанными.Загрузка

Разберем основной механизм, который используется для обхода проверок в модуле объекта и модуле менеджера. У каждого объекта базы данных (справочника, документа и т.д.) есть системное свойство ОбменДанными.Загрузка.

Посмотрим на пример установки этого свойства перед программной записью:


ОбъектСправочника = СсылкаНаЭлемент.ПолучитьОбъект();
ОбъектСправочника.Наименование = "Новое наименование";
ОбъектСправочника.ОбменДанными.Загрузка = Истина;
ОбъектСправочника.Записать();

Установка этого флага в значение Истина на уровне самой платформы 1С отключает встроенные системные проверки. Например, платформа не будет проверять уникальность кода справочника и проигнорирует платформенную проверку заполнения обязательных реквизитов. Благодаря этому, процедура ОбработкаПроверкиЗаполнения, которая располагается в модуле менеджера, даже не будет инициирована.

Важный нюанс: установка этого свойства магическим образом не отключает выполнение вашего собственного кода в модуле объекта. Чтобы бизнес-логика в процедурах ПередЗаписью или ПриЗаписи действительно не выполнялась, в самом начале этих процедур разработчик должен явно прописать конструкцию:


Процедура ПередЗаписью(Отказ)
    Если ОбменДанными.Загрузка Тогда
        Возврат;
    КонецЕсли;
    
    // Дальнейшая логика проверок...
КонецПроцедуры

Согласно стандартам разработки 1С, это правило является строго обязательным. Однако в нетиповых конфигурациях или доработках программисты могут забыть добавить эту проверку, поэтому иногда "не все процедуры на это смотрят".

Скрытая угроза: Подписки на события

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

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

Использование коллекции ДополнительныеСвойства

Рассмотрим альтернативный, более точечный метод отключения проверок. Если вы не хотите устанавливать глобальный режим загрузки (или если он не помогает из-за отсутствия проверок в чужом коде подписок), можно использовать коллекцию ДополнительныеСвойства. В нее можно передать любой произвольный параметр-флаг непосредственно перед записью.

Посмотрим на пример внедрения такого флага:


ОбъектСправочника = СсылкаНаЭлемент.ПолучитьОбъект();
ОбъектСправочника.ДополнительныеСвойства.Вставить("ПропуститьМоиПроверки", Истина);
ОбъектСправочника.Записать();

Далее в самом модуле объекта (или в нужной подписке на событие) мы добавляем условие, которое заблокирует выполнение конкретного куска кода, оставляя остальные механизмы рабочими:


Если ЭтотОбъект.ДополнительныеСвойства.Свойство("ПропуститьМоиПроверки") Тогда
    Возврат; 
КонецЕсли;

Этот подход активно используется в типовых конфигурациях на базе Библиотеки стандартных подсистем (БСП). Например, чтобы элемент записался, но его изменения не зарегистрировались для планового обмена с другими узлами, применяется стандартный параметр БСП:


ОбъектСправочника.ДополнительныеСвойства.Вставить("ОтключитьМеханизмРегистрацииОбъектов");
ОбъектСправочника.Записать();

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

← На главную