Как очистить реквизиты документа при копировании в 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Часто перед разработчиками 1С встает задача: при копировании существующего документа (например, "Реализация товаров и услуг" или "Поступление на расчетный счет") необходимо очищать определенные поля. Это могут быть данные, уникальные для каждой операции, такие как ответственный сотрудник, конкретное подразделение или комментарий. Давайте подробно разберем, как правильно реализовать такую логику, где разместить код и какие нюансы стоит учесть для создания надежного и универсального решения.

Выбор правильного места: Модуль Объекта vs. Модуль Формы

Первый и самый важный вопрос, который задал автор темы: где именно нужно писать код для очистки? Инструмент Изучение событий 1С наглядно показывает последовательность вызовов. Есть два основных варианта: модуль формы документа и модуль объекта документа. Проанализируем оба.

  1. Модуль Формы (событие ПриСозданииНаСервере): На первый взгляд, это кажется логичным. Форма создается, мы проверяем, является ли объект новым или скопированным, и очищаем нужные поля. Однако у этого подхода есть критический недостаток. Код в модуле формы сработает только тогда, когда пользователь интерактивно создает копию документа через интерфейс. Если же копия будет создаваться программно (например, обработкой или в результате обмена данными) с помощью метода Скопировать(), код в форме не будет выполнен. Это приведет к тому, что в базу запишется документ с "грязными", не очищенными данными.
  2. Модуль Объекта (событие ПриКопировании): Это правильный и рекомендуемый подход. Обработчик события ПриКопировании располагается непосредственно в модуле объекта и срабатывает в момент создания копии объекта в памяти, еще до его записи и до открытия формы. Этот метод универсален: он будет вызван как при интерактивном копировании пользователем, так и при программном создании копии. Это гарантирует целостность данных и предсказуемое поведение системы.

Вывод: Логику по инициализации и очистке данных при копировании всегда следует размещать в обработчике события ПриКопировании в модуле объекта. Это гарантирует чистоту данных и исключает потребность в ручном удалении документов с неверными реквизитами.

Реализация очистки в обработчике `ПриКопировании`

Теперь рассмотрим саму реализацию. Автор темы предоставил работающий код, который является хорошей отправной точкой.

Вот корректный код, который решает поставленную задачу:


Процедура ПриКопировании(ОбъектКопирования)
    // Очищаем реквизиты шапки документа
    РаботникОрганизации = Справочники.ФизическиеЛица.ПустаяСсылка();
    ПодразделениеОрганизации = Справочники.ПодразделенияОрганизации.ПустаяСсылка();

    // Очищаем реквизиты в каждой строке табличной части
    Для каждого СтрокаТЧ ИЗ ТаблицаПоступление Цикл
        СтрокаТЧ.РаботникОрганизацииТЧ = Справочники.ФизическиеЛица.ПустаяСсылка();
        СтрокаТЧ.ПодразделениеТЧ = Справочники.ПодразделенияОрганизации.ПустаяСсылка();
    КонецЦикла;
КонецПроцедуры

Разберем по шагам:

Способы очистки реквизитов: `ПустаяСсылка`, `Неопределено` или `0`?

В теме обсуждались разные способы "обнуления" полей. Давайте выясним, какой из них и когда лучше использовать.

Профессиональный подход: Учет обмена данными

В реальных проектах часто используются механизмы обмена данными между разными базами 1С. Когда объект загружается в базу в процессе обмена, он должен быть создан в точности таким, каким он был в источнике. Наша логика очистки полей в этот момент может навредить, удалив нужные данные.

Чтобы избежать этого, в начало процедуры ПриКопировании добавляют специальную проверку:


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

    // ... остальной код очистки реквизитов ...

    РаботникОрганизации = Справочники.ФизическиеЛица.ПустаяСсылка();
    ПодразделениеОрганизации = Справочники.ПодразделенияОрганизации.ПустаяСсылка();

    Для каждого СтрокаТЧ ИЗ ТаблицаПоступление Цикл
        СтрокаТЧ.РаботникОрганизацииТЧ = Справочники.ФизическиеЛица.ПустаяСсылка();
        СтрокаТЧ.ПодразделениеТЧ = Справочники.ПодразделенияОрганизации.ПустаяСсылка();
    КонецЦикла;
КонецПроцедуры

Свойство ОбменДанными.Загрузка принимает значение Истина, когда система находится в режиме загрузки данных. Добавив эту проверку, мы гарантируем, что наша логика очистки сработает только при интерактивных или "внутренних" программных действиях, но не помешает корректной работе обменов. Это признак качественного и надежного кода.

← На главную