Как сбросить значение флажка при копировании документа в 1С

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

При интерактивном копировании документов в 1С часто возникает необходимость очищать определенные реквизиты — например, сбрасывать флаги согласования, проведения ревизии или признака отправки данных во внешние системы. Разберем типичные ошибки разработчиков и правильные способы решения этой задачи в различных сценариях разработки на платформе 1С:Предприятие 8.

Типичные ошибки при очистке реквизитов

Начинающие разработчики нередко сталкиваются с ситуацией, когда код не дает нужного результата. Проанализируем самые распространенные причины ошибок:

  1. Неверный тип данных: присвоение пустой строки "" или числа 0 реквизиту с типом Булево. Для флагов допустимы только значения Истина и Ложь.
  2. Попытка изменения элементов формы вместо данных: обращение вида ЭлементыФормы.Флаг1 = Ложь или Элементы.Флаг1 = Ложь изменяет параметры отображения элемента пользовательского интерфейса, а не значение самого реквизита объекта.
  3. Неправильно выбранный контекст: обработка события копирования должна происходить на уровне бизнес-логики объекта, а не в процедурах модуля формы, так как документ может быть скопирован программно без открытия формы.

Основное решение: модуль объекта документа

Если конфигурация является самописной или снята с поддержки, самым простым и логичным местом для сброса реквизита является модуль объекта документа. Рассмотрим процедуру-обработчик события ПриКопировании.

В модуле объекта переопределим стандартный обработчик события копирования:


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

Обратим внимание на работу контекста: переданный параметр ОбъектКопирования содержит ссылку или исходный объект, откуда берутся данные. Прямое обращение к имени реквизита Флаг1 в модуле объекта неявно ссылается на реквизит нового создаваемого объекта (ЭтотОбъект).

Решение для типовых конфигураций: подписка на события

Если мы дорабатываем типовую конфигурацию (например, 1C:ERP, УТ или Бухгалтерию), находящуюся на поддержке, лучшей практикой является использование механизма подписок на события. Это позволяет не снимать документ с замка и упрощает последующие обновления.

Разберем по шагам создание подписки:

  1. В дереве метаданных найдем ветку Общие → Подписки на события и добавим новую подписку.
  2. В свойстве Источник укажем нужный документ (или тип ДокументОбъект).
  3. В свойстве Событие выберем ПриКопировании.
  4. В свойстве Обработчик создадим процедуру в общем серверном модуле.

Посмотрим на пример кода процедуры в общем модуле:


Процедура ОбработкаПриКопированииДокумента(Источник, ОбъектКопирования) Экспорт
    
    // Проверяем наличие реквизита и сбрасываем его
    Источник.Флаг1 = Ложь;
    
КонецПроцедуры

Сброс реквизита формы в управляемом приложении

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

Для инициализации таких реквизитов используем обработчик ПриСозданииНаСервере в модуле формы документа:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Проверяем, создается ли форма в режиме копирования существующего документа
    Если Параметры.Свойство("ЗначениеКопирования") И ЗначениеЗаполнено(Параметры.ЗначениеКопирования) Тогда
        Флаг1 = Ложь;
    КонецЕсли;
    
КонецПроцедуры

Очистка флагов в строках табличной части

Если булев реквизит расположен не в шапке документа, а в строках табличной части, сбрасывать его значение во всех строках можно без использования циклов. Для этого в процедуре ПриКопировании воспользуемся методом ЗаполнитьЗначения:


Процедура ПриКопировании(ОбъектКопирования)
    
    // Быстрая установка значения Ложь для всех строк указанной колонки
    Товары.ЗаполнитьЗначения(Ложь, "Флаг1");
    
КонецПроцедуры

Особенности программного копирования

Проанализируем важный нюанс: платформа 1С автоматически вызывает событие ПриКопировании только при интерактивном копировании пользователем из списка или при программном вызове метода Скопировать().

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

← На главную