Признак ОбменДанными.Загрузка: когда ставить Истину
Содержание
Когда в 1С идёт загрузка данных через обмен, платформа помечает каждый записываемый объект признаком ОбменДанными.Загрузка = Истина. Этот флаг сообщает конфигурации: данные пришли извне, не пересчитывай и не проверяй их заново.
Разработчики используют тот же приём вручную — чтобы записать документ или регистр в обход контроля, проверок заполнения и части бизнес-логики. Ниже разберём, где живёт признак, зачем он нужен и как не выстрелить себе в ногу.
Что такое ОбменДанными.Загрузка
ОбменДанными — это свойство любого объекта базы (документа, справочника, набора записей регистра). Внутри у него есть флаг Загрузка типа «Булево».
Значение по умолчанию — Ложь. Платформа сама ставит Истина в двух случаях:
- 🔄 идёт загрузка из плана обмена (РИБ, обмен между базами);
- 📥 объект пишется механизмом обмена данными, а не пользователем в форме.
Признак живёт на конкретном экземпляре объекта в памяти. Он не хранится в базе и не «прилипает» к записи — после Записать() про него можно забыть.
Зачем нужен признак загрузки данных
Смысл простой: при загрузке извне повторный контроль не нужен и часто вреден. Данные уже проведены и проверены в исходной базе. Если запускать проверки заново, обмен либо упадёт на чужой специфике, либо начнёт пересчитывать то, что пересчитывать нельзя.
Поэтому в стандартных обработчиках событий контроль оборачивают проверкой флага:
Процедура ПередЗаписью(Отказ)
Если ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;
// Дальше — контроль, автозаполнение, проверки.
// При загрузке сюда не дойдём.
КонецПроцедуры
Такой Возврат в начале — это то, что на форумах называют «режимом ОбменДанными.Загрузка = Истина». Код проверяет флаг и пропускает всю логику ниже.
Контроль записи в стандартных обработчиках 1С
Типовые конфигурации выстроены по этому принципу. Проверку Если ОбменДанными.Загрузка Тогда Возврат вы встретите в обработчиках:
| Обработчик | Что обычно отключается при загрузке |
|---|---|
ПередЗаписью | контроль остатков, проверка дублей |
ПриЗаписи | движения по регистрам, служебные записи |
ОбработкаПроверкиЗаполнения | проверка обязательных реквизитов |
ПередУдалением | контроль ссылочной целостности |
Идея методики фирмы «1С» (стандарт по обработчикам событий): любой контроль, который может помешать обмену, должен уметь молча пропускаться при загрузке. Логику, которая нужна всегда, — под проверку не прячут.
Флаг не отключает запись сам по себе. Платформа всё равно запишет объект — не сработает только тот код, который сам проверяет ОбменДанными.Загрузка. Если в обработчике нет этой проверки, он выполнится и при загрузке.
Как установить режим ОбменДанными.Загрузка программно
Иногда нужно записать объект в обход контроля из своего кода — например, при массовой правке или программной корректировке движений документа. Тогда флаг выставляют руками.
Схема всегда одна: получили объект → подняли флаг → записали → флаг можно опустить.
ПолучитьОбъект() из ссылки или найдите документ: Док = Документы.РеализацияТоваровУслуг.НайтиПоНомеру(Номер, Дата).ПолучитьОбъект();Док.ОбменДанными.Загрузка = Истина; — теперь обработчики с проверкой флага пропустят логику.Док.Записать(); для справочника или Док.Записать(РежимЗаписиДокумента.Запись);, если документ проводить не нужно.Док.ОбменДанными.Загрузка = Ложь; — для того же экземпляра в памяти, если продолжаете с ним работать.Готовый фрагмент для документа:
Объект = Ссылка.ПолучитьОбъект();
Объект.ОбменДанными.Загрузка = Истина;
Объект.Комментарий = "Правка через обработку";
Объект.Записать(РежимЗаписиДокумента.Запись);
Для набора записей регистра — так же, флаг у набора:
Набор = РегистрыНакопления.ТоварыНаСкладах.СоздатьНаборЗаписей();
Набор.Отбор.Регистратор.Установить(Ссылка);
Набор.Прочитать();
// ... правим строки набора ...
Набор.ОбменДанными.Загрузка = Истина;
Набор.Записать();
Так корректируют движения документа, не перепроводя его: читаете набор регистра, меняете суммы, пишете с флагом. Полное перепроведение при этом не запускается.
Типичные ошибки
Признак кажется безобидным, но именно из-за него потом «едут» остатки и всплывают кривые данные.
Записать() в режиме Запись (не Проведение) движения не формируются. Если нужны движения — либо проводите, либо пишите наборы регистров вручную.Загрузка = Истина глушит проверку заполнения. Контроль обязан делать ваш код до записи, а не платформа.ПолучитьОбъект() его нужно ставить заново — старое значение не наследуется.Если ОбменДанными.Загрузка Тогда Возврат. Флаг работает только там, где его читают.Как использовать безопасно
Несколько правил, чтобы не разгребать последствия:
- ✅ Ставьте флаг только на время своей операции и не «глобально».
- ✅ Валидируйте данные в своём коде до записи — платформа этого уже не сделает.
- ✅ Если нужны корректные итоги — пишите движения сами или проводите документ штатно.
- ✅ Не прячьте под флаг логику, которая должна работать всегда.
- ❌ Не используйте признак как способ «продавить» запись, которая честно не проходит контроль.
Если не помогло
Записали с флагом, а данные всё равно ведут себя странно:
- Проверьте режим записи —
Записьне формирует движения, нуженПроведение. - Посмотрите, читает ли проблемный обработчик флаг. Нет проверки — логика отработает.
- Пересчитайте итоги регистра, если правили наборы записей напрямую.
- Убедитесь, что флаг стоит именно на том экземпляре, который записываете, а не на копии.
Что значит ОбменДанными.Загрузка = Истина простыми словами?
Флаг отключает все проверки автоматически?
ОбменДанными.Загрузка. Обработчики без такой проверки выполнятся как обычно.Сохраняется ли признак в базе после записи?
Можно ли так провести документ без контроля?
Записать(РежимЗаписиДокумента.Проведение) с поднятым флагом. Но контроль остатков и заполнения при этом не отработает — отвечаете за данные вы.Чем отличается запись с флагом от `ОбменДанными.Загрузка = Ложь`?
Ложь (по умолчанию) отрабатывают все проверки и автозаполнение. При Истина код, завязанный на флаг, пропускается.