← вся теориятеория к собесу · Проведение документов

ОбменДанными.Загрузка в 1С

разбор писал Даниил, автор Сеньорчика

Зачем это спрашивают

Когда объект приходит обменом, его не нужно ни заполнять, ни пересчитывать: источник уже всё посчитал. Флаг ОбменДанными.Загрузка говорит обработчикам, что запись идёт из обмена. На собесе спрашивают, что флаг отключает, а что нет.

// Так спрашивают: «Что делает ОбменДанными.Загрузка?» «Где проверять этот флаг?» «Отключает ли флаг регистрацию изменений?» «Можно ли ставить Загрузку ради быстрой записи?»

Флаг загрузки

Код обмена ставит ОбменДанными.Загрузка = Истина перед записью. Обработчики записи и удаления проверяют флаг первой строкой и выходят:

Если пересчёт стоит выше проверки, приёмник пересчитает суммы по своим правилам, и узлы разойдутся: в источнике документ на 1 000, в приёмнике на 1 002 из-за другого округления.

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

Что меняется в режиме загрузки

В режиме загрузки набор записей может прийти раньше документа-регистратора, а документ со ссылкой на контрагента раньше самого контрагента. Это нормально: ссылка по GUID (globally unique identifier, уникальный идентификатор объекта) оживёт, когда объект приедет следующим сообщением.

Регистрация и границы

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

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

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

Как отвечать: «Что делает ОбменДанными.Загрузка и где его проверять?»

Флаг говорит, что объект пишется обменом. Обработчики ПередЗаписью, ПриЗаписи, ПередУдалением проверяют его первой строкой и выходят, потому что источник уже всё заполнил и посчитал. Платформа при загрузке не проверяет заполнение и логическую целостность, ссылка может прийти раньше объекта. Регистрацию изменений флаг не отключает, для этого отдельно выключают АвтоЗаполнение получателей. И ставить его ради записи без проверок в обычном коде нельзя.

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

На чём валят

  • −Пересчитывают суммы выше проверки флага. Узлы расходятся. Проверка первой строкой обработчика.
  • −Думают, что флаг отключает регистрацию изменений. Регистрация работает. Отключают Получатели.АвтоЗаполнение.
  • −Ставят Загрузку для быстрой записи в обычной обработке. Объект пишется в обход логики. Методическая поддержка 1С считает это некорректным.

Проверь себя

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

  1. #oc_exchange_load1 / 5
    Обмен загрузил набор записей регистра накопления раньше, чем пришёл его документ-регистратор. Почему платформа не отказала?
    A)Платформа создала пустой документ-регистратор
    B)Регистратор для регистра накопления не обязателен
    C)В режиме загрузки нет проверок целостности
    D)Набор записан в черновики до прихода документа
    показать ответ и разбор
    +C)В режиме загрузки нет проверок целостности

    // разбор: По ИТС в режиме ОбменДанными.Загрузка платформа не выполняет проверок логической целостности данных: обмен должен уметь записать данные в произвольном порядке. Регистратор придёт позже тем же GUID. Прикладной код тоже не должен проверять наличие связанных данных при загрузке.

  2. #oc_exchange_load2 / 5
    Документ загружается обменом с движениями. Нужно ли вызывать его ОбработкаПроведения в приёмнике?
    A)Да: платформа вызывает её при каждой записи
    B)Нет: при загрузке её не вызывают
    C)Да: иначе документ не будет считаться проведённым
    D)Только если в узле другая конфигурация
    показать ответ и разбор
    +B)Нет: при загрузке её не вызывают

    // разбор: В РИБ движения документа переезжают вместе с ним, и проводить его в приёмнике не нужно — получится двойной расчёт. При обмене между разными конфигурациями движения обычно не передают, документ проводят в приёмнике после загрузки отдельным шагом. В обоих случаях ОбработкаПроведения при загрузке не срабатывает.

  3. #oc_exchange_load3 / 5
    Зачем при программной записи объекта передают флаги через ДополнительныеСвойства, а не через реквизиты?
    A)Флаг не попадёт в базу и обмен
    B)Реквизиты объекта нельзя менять из кода
    C)ДополнительныеСвойства записываются быстрее реквизитов
    D)Реквизиты недоступны в обработчике ПередЗаписью
    показать ответ и разбор
    +A)Флаг не попадёт в базу и обмен

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

  4. #oc_exchange_load4 / 5
    Найди проблему (модуль набора записей регистра):
    Процедура ПередЗаписью(Отказ, Замещение)
      ПересчитатьСуммы();
      Если ОбменДанными.Загрузка Тогда
        Возврат;
      КонецЕсли;
      ПроверитьДанные(Отказ);
    КонецПроцедуры
    A)Пересчёт стоит до проверки флага
    B)Проверка флага должна быть в ПриЗаписи
    C)У набора записей нет свойства ОбменДанными
    D)ПроверитьДанные нельзя вызывать с параметром Отказ
    показать ответ и разбор
    +A)Пересчёт стоит до проверки флага

    // разбор: Флаг загрузки проверяют первой строкой, иначе всё, что выше, выполнится и при обмене. Здесь суммы пересчитаются в узле-приёмнике, и данные разойдутся с источником. У наборов записей свойство ОбменДанными есть, как и у объектов.

  5. #oc_exchange_load5 / 5
    Обработка в узле РИБ исправляет реквизит в 50 тыс. документах. Изменения не должны уйти в другие узлы. Что сделать перед записью?
    A)Отключить итоги регистров на время обработки
    B)Установить ОбменДанными.Загрузка = Истина
    C)Записывать документы в привилегированном режиме
    D)ОбменДанными.Получатели.АвтоЗаполнение = Ложь
    показать ответ и разбор
    +D)`ОбменДанными.Получатели.АвтоЗаполнение = Ложь`

    // разбор: Регистрацию изменений делает авторегистрация: перед записью она заполняет коллекцию узлов-получателей. Если выключить АвтоЗаполнение и оставить получателей пустыми, регистрации не будет. Флаг Загрузка регистрацию не отключает, а ИТС прямо называет его использование для иной логики некорректным.

дальше

Теорию прочитал. Навык ставится повторением

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