ОбменДанными.Загрузка в 1С
Когда объект приходит обменом, его не нужно ни заполнять, ни пересчитывать: источник уже всё посчитал. Флаг ОбменДанными.Загрузка говорит обработчикам, что запись идёт из обмена. На собесе спрашивают, что флаг отключает, а что нет.
// Так спрашивают: «Что делает ОбменДанными.Загрузка?» «Где проверять этот флаг?» «Отключает ли флаг регистрацию изменений?» «Можно ли ставить Загрузку ради быстрой записи?»
Флаг загрузки
Код обмена ставит ОбменДанными.Загрузка = Истина перед записью. Обработчики записи и удаления проверяют флаг первой строкой и выходят:
Если пересчёт стоит выше проверки, приёмник пересчитает суммы по своим правилам, и узлы разойдутся: в источнике документ на 1 000, в приёмнике на 1 002 из-за другого округления.
Процедура ПередЗаписью(Отказ)
Если ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;
// заполнение, пересчёт сумм, проверки
КонецПроцедурыЧто меняется в режиме загрузки
В режиме загрузки набор записей может прийти раньше документа-регистратора, а документ со ссылкой на контрагента раньше самого контрагента. Это нормально: ссылка по GUID (globally unique identifier, уникальный идентификатор объекта) оживёт, когда объект приедет следующим сообщением.
Регистрация и границы
Флаг загрузки не отключает регистрацию изменений. Чтобы записать объект без регистрации для других узлов, отключают автозаполнение получателей:
Ставить Загрузку ради «записи без проверок» в обычной обработке методическая поддержка 1С считает некорректным: объект запишется в обход бизнес-логики и может нарушить целостность. Исключение одно: данные, которых нет в составе обмена, обработчик может строить и при загрузке, если это решение осознанное и описано в комментарии.
Объект.ОбменДанными.Загрузка = Истина;
Объект.ОбменДанными.Получатели.АвтоЗаполнение = Ложь;
Объект.Записать();Как отвечать: «Что делает ОбменДанными.Загрузка и где его проверять?»
Флаг говорит, что объект пишется обменом. Обработчики ПередЗаписью, ПриЗаписи, ПередУдалением проверяют его первой строкой и выходят, потому что источник уже всё заполнил и посчитал. Платформа при загрузке не проверяет заполнение и логическую целостность, ссылка может прийти раньше объекта. Регистрацию изменений флаг не отключает, для этого отдельно выключают АвтоЗаполнение получателей. И ставить его ради записи без проверок в обычном коде нельзя.
Ответ перечисляет, что флаг выключает и что нет, и предупреждает о злоупотреблении. Именно на регистрации изменений обычно ловят тех, кто знает флаг поверхностно.
На чём валят
- −Пересчитывают суммы выше проверки флага. Узлы расходятся. Проверка первой строкой обработчика.
- −Думают, что флаг отключает регистрацию изменений. Регистрация работает. Отключают
Получатели.АвтоЗаполнение. - −Ставят Загрузку для быстрой записи в обычной обработке. Объект пишется в обход логики. Методическая поддержка 1С считает это некорректным.
Проверь себя
Пять вопросов из банка по этой подтеме. Всего их 12, остальные разбираются в тренажёре.
- Обмен загрузил набор записей регистра накопления раньше, чем пришёл его документ-регистратор. Почему платформа не отказала?A)Платформа создала пустой документ-регистраторB)Регистратор для регистра накопления не обязателенC)В режиме загрузки нет проверок целостностиD)Набор записан в черновики до прихода документа
показать ответ и разбор
+C)В режиме загрузки нет проверок целостности// разбор: По ИТС в режиме ОбменДанными.Загрузка платформа не выполняет проверок логической целостности данных: обмен должен уметь записать данные в произвольном порядке. Регистратор придёт позже тем же GUID. Прикладной код тоже не должен проверять наличие связанных данных при загрузке.
- Документ загружается обменом с движениями. Нужно ли вызывать его
ОбработкаПроведенияв приёмнике?A)Да: платформа вызывает её при каждой записиB)Нет: при загрузке её не вызываютC)Да: иначе документ не будет считаться проведённымD)Только если в узле другая конфигурацияпоказать ответ и разбор
+B)Нет: при загрузке её не вызывают// разбор: В РИБ движения документа переезжают вместе с ним, и проводить его в приёмнике не нужно — получится двойной расчёт. При обмене между разными конфигурациями движения обычно не передают, документ проводят в приёмнике после загрузки отдельным шагом. В обоих случаях ОбработкаПроведения при загрузке не срабатывает.
- Зачем при программной записи объекта передают флаги через
ДополнительныеСвойства, а не через реквизиты?A)Флаг не попадёт в базу и обменB)Реквизиты объекта нельзя менять из кодаC)ДополнительныеСвойства записываются быстрее реквизитовD)Реквизиты недоступны в обработчике ПередЗаписьюпоказать ответ и разбор
+A)Флаг не попадёт в базу и обмен// разбор: ДополнительныеСвойства живут только в памяти экземпляра объекта: флаг «не пересчитывать цены» или «запись из обработки» доходит до обработчиков и пропадает после записи. Служебный реквизит сохранится в базе, попадёт в обмен и сработает при следующей записи, когда его уже никто не ждёт.
- Найди проблему (модуль набора записей регистра):
Процедура ПередЗаписью(Отказ, Замещение) ПересчитатьСуммы(); Если ОбменДанными.Загрузка Тогда Возврат; КонецЕсли; ПроверитьДанные(Отказ); КонецПроцедурыA)Пересчёт стоит до проверки флагаB)Проверка флага должна быть в ПриЗаписиC)У набора записей нет свойства ОбменДаннымиD)ПроверитьДанные нельзя вызывать с параметром Отказпоказать ответ и разбор
+A)Пересчёт стоит до проверки флага// разбор: Флаг загрузки проверяют первой строкой, иначе всё, что выше, выполнится и при обмене. Здесь суммы пересчитаются в узле-приёмнике, и данные разойдутся с источником. У наборов записей свойство ОбменДанными есть, как и у объектов.
- Обработка в узле РИБ исправляет реквизит в 50 тыс. документах. Изменения не должны уйти в другие узлы. Что сделать перед записью?A)Отключить итоги регистров на время обработкиB)Установить
ОбменДанными.Загрузка = ИстинаC)Записывать документы в привилегированном режимеD)ОбменДанными.Получатели.АвтоЗаполнение = Ложьпоказать ответ и разбор
+D)`ОбменДанными.Получатели.АвтоЗаполнение = Ложь`// разбор: Регистрацию изменений делает авторегистрация: перед записью она заполняет коллекцию узлов-получателей. Если выключить АвтоЗаполнение и оставить получателей пустыми, регистрации не будет. Флаг Загрузка регистрацию не отключает, а ИТС прямо называет его использование для иной логики некорректным.
дальше
Теорию прочитал. Навык ставится повторением
В Сеньорчике эта подтема идёт в ежедневных сессиях: движок возвращает её, пока ответы не станут уверенными, и ведёт прогресс отдельно по каждой подтеме. Теория внутри тоже бесплатна, бесплатная часть практики — одна сессия дня в сутки.