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