При разработке обработок по переносу данных, корректировке реквизитов или массовом изменении документов часто возникает необходимость записать объект так, чтобы не срабатывали типовые механизмы проведения, проверки заполнения реквизитов и сложные алгоритмы, прописанные в событиях модуля объекта — для этого подойдёт обработка групповой перезаписи и проведения документов.
В платформе 1С:Предприятие существует специальный механизм, позволяющий системе понять, что объект записывается не пользователем в интерактивном режиме, а программно (обычно при обмене данными через брокеры или использовании универсальных инструментов выгрузки-загрузки — для этой задачи есть универсальный перенос данных между базами 1С). Использование этого свойства позволяет:
ОбработкаПроверкиЗаполнения).Разберем основной инструмент для этого — свойство ОбменДанными.Загрузка.
Для того чтобы записать объект "тихо", необходимо получить сам объект из ссылки, установить соответствующий флаг и вызвать метод записи. Проанализируем базовый код, который решает эту задачу.
Алгоритм действий:
ОбменДанными.Загрузка в значение Истина.Посмотрим на пример кода:
// Получаем объект из ссылки
ДокументОбъект = СсылкаНаДокумент.ПолучитьОбъект();
// Включаем режим загрузки.
// Это сигнализирует системе, что проверки выполнять не нужно.
ДокументОбъект.ОбменДанными.Загрузка = Истина;
// Вносим необходимые изменения
ДокументОбъект.Комментарий = "Изменено программно";
// Записываем документ.
// Важно: обычно используется РежимЗаписиДокумента.Запись,
// чтобы не инициировать процедуру проведения, если она не нужна.
ДокументОбъект.Записать(РежимЗаписиДокумента.Запись);
Важно понимать, что происходит "под капотом". Когда мы устанавливаем ОбменДанными.Загрузка = Истина, платформа не отключает события полностью, но меняет логику их работы. Подробно управление событиями объектов и способы обхода стандартных механизмов анализируются в специализированных статьях.
В типовых конфигурациях (ERP, Бухгалтерия, УТ) в процедурах ПередЗаписью и ПриЗаписи часто стоит проверка вида:
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
Если ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;
// Далее идет стандартный код проверок...
КонецПроцедуры
Именно наличие этого условия в коде конфигурации позволяет пропустить проверки. Если вы пишете свою конфигурацию, не забудьте добавить такие условия в модули объектов, иначе флаг Загрузка не даст ожидаемого эффекта.
Иногда требуется не просто записать версию документа, но и провести его, игнорируя при этом отсутствие каких-либо второстепенных данных или блокирующие проверки. Рассмотрим, как это сделать.
ДокументОбъект = СсылкаНаДокумент.ПолучитьОбъект();
// Устанавливаем флаг загрузки
ДокументОбъект.ОбменДанными.Загрузка = Истина;
// Явно указываем режим записи - Проведение
ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);
Обратите внимание: при таком подходе движения по регистрам (проводки) могут сформироваться некорректно или не сформироваться вовсе, если алгоритм формирования движений также обернут в условие Если ОбменДанными.Загрузка Тогда Возврат; КонецЕсли;. В большинстве типовых конфигураций движения не формируются, если включен признак загрузки.
Если вам нужно отключить только проверки, но движения сформировать, придется использовать более тонкую настройку, например, через ДополнительныеСвойства объекта, если логика конфигурации это предусматривает.
При обработке большого массива данных (например, тысячи накладных) крайне важна оптимизация массовых операций в 1С. Для этого можно использовать как готовые обработки для изменения недоступных реквизитов, так и собственные циклы. Рассмотрим пример для массового изменения атрибута.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| РеализацияТоваровУслуг.Ссылка КАК Ссылка
|ИЗ
| Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
|ГДЕ
| РеализацияТоваровУслуг.Ответственный = &СтарыйОтветственный";
Запрос.УстановитьПараметр("СтарыйОтветственный", ПарамОтветственный);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Попытка
ДокОбъект = Выборка.Ссылка.ПолучитьОбъект();
ДокОбъект.Ответственный = НовыйОтветственный;
// Отключаем проверки
ДокОбъект.ОбменДанными.Загрузка = Истина;
ДокОбъект.Записать(РежимЗаписиДокумента.Запись);
Исключение
// Обязательно логируем ошибку, так как даже в режиме загрузки
// возможны ошибки уровня СУБД или блокировок
Сообщить("Ошибка при обработке " + Выборка.Ссылка + ": " + ОписаниеОшибки());
КонецПопытки;
КонецЦикла;
Использование ОбменДанными.Загрузка = Истина — мощный инструмент для разработчика 1С. Он позволяет:
Используйте этот метод осторожно, так как он позволяет записать в базу данных заведомо некорректные или неполные данные, что в будущем может привести к ошибкам в учете. Для этой задачи есть инструмент для безопасного удаления битых ссылок.