Как программно записать документ в 1С без проведения и выполнения проверок?

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

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

Зачем нужен режим загрузки данных?

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

  1. Избежать выполнения ресурсоемких процедур при перепроведении.
  2. Записать документ даже если не заполнены некоторые обязательные реквизиты (обход ОбработкаПроверкиЗаполнения).
  3. Предотвратить создание движений по регистрам, если это необходимо.

Разберем основной инструмент для этого — свойство ОбменДанными.Загрузка.

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

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

Алгоритм действий:

  1. Получаем объект документа (или справочника) по ссылке.
  2. Устанавливаем свойство ОбменДанными.Загрузка в значение Истина.
  3. Выполняем запись объекта.

Посмотрим на пример кода:


// Получаем объект из ссылки
ДокументОбъект = СсылкаНаДокумент.ПолучитьОбъект();

// Включаем режим загрузки. 
// Это сигнализирует системе, что проверки выполнять не нужно.
ДокументОбъект.ОбменДанными.Загрузка = Истина;

// Вносим необходимые изменения
ДокументОбъект.Комментарий = "Изменено программно";

// Записываем документ. 
// Важно: обычно используется РежимЗаписиДокумента.Запись, 
// чтобы не инициировать процедуру проведения, если она не нужна.
ДокументОбъект.Записать(РежимЗаписиДокумента.Запись);

Особенности работы с обработчиками событий

Важно понимать, что происходит "под капотом". Когда мы устанавливаем ОбменДанными.Загрузка = Истина, платформа не отключает события полностью, но меняет логику их работы. Подробно управление событиями объектов и способы обхода стандартных механизмов анализируются в специализированных статьях.

В типовых конфигурациях (ERP, Бухгалтерия, УТ) в процедурах ПередЗаписью и ПриЗаписи часто стоит проверка вида:


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

    // Далее идет стандартный код проверок...
КонецПроцедуры

Именно наличие этого условия в коде конфигурации позволяет пропустить проверки. Если вы пишете свою конфигурацию, не забудьте добавить такие условия в модули объектов, иначе флаг Загрузка не даст ожидаемого эффекта.

Как записать документ с проведением, но без проверок?

Иногда требуется не просто записать версию документа, но и провести его, игнорируя при этом отсутствие каких-либо второстепенных данных или блокирующие проверки. Рассмотрим, как это сделать.


ДокументОбъект = СсылкаНаДокумент.ПолучитьОбъект();

// Устанавливаем флаг загрузки
ДокументОбъект.ОбменДанными.Загрузка = Истина;

// Явно указываем режим записи - Проведение
ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);

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

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

Массовая обработка документов

При обработке большого массива данных (например, тысячи накладных) крайне важна оптимизация массовых операций в 1С. Для этого можно использовать как готовые обработки для изменения недоступных реквизитов, так и собственные циклы. Рассмотрим пример для массового изменения атрибута.


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	РеализацияТоваровУслуг.Ссылка КАК Ссылка
    |ИЗ
    |	Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
    |ГДЕ
    |	РеализацияТоваровУслуг.Ответственный = &СтарыйОтветственный";

Запрос.УстановитьПараметр("СтарыйОтветственный", ПарамОтветственный);

Выборка = Запрос.Выполнить().Выбрать();

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

Резюме

Использование ОбменДанными.Загрузка = Истина — мощный инструмент для разработчика 1С. Он позволяет:

  1. Ускорить массовую обработку данных.
  2. Обойти логические проверки прикладного решения.
  3. Исправить «битые» ссылки и данные, которые невозможно перезаписать в обычном режиме.

Используйте этот метод осторожно, так как он позволяет записать в базу данных заведомо некорректные или неполные данные, что в будущем может привести к ошибкам в учете. Для этой задачи есть инструмент для безопасного удаления битых ссылок.

← На главную