При интерактивном копировании документов в 1С часто возникает необходимость очищать определенные реквизиты — например, сбрасывать флаги согласования, проведения ревизии или признака отправки данных во внешние системы. Разберем типичные ошибки разработчиков и правильные способы решения этой задачи в различных сценариях разработки на платформе 1С:Предприятие 8.
Начинающие разработчики нередко сталкиваются с ситуацией, когда код не дает нужного результата. Проанализируем самые распространенные причины ошибок:
"" или числа 0 реквизиту с типом Булево. Для флагов допустимы только значения Истина и Ложь.ЭлементыФормы.Флаг1 = Ложь или Элементы.Флаг1 = Ложь изменяет параметры отображения элемента пользовательского интерфейса, а не значение самого реквизита объекта.Если конфигурация является самописной или снята с поддержки, самым простым и логичным местом для сброса реквизита является модуль объекта документа. Рассмотрим процедуру-обработчик события ПриКопировании.
В модуле объекта переопределим стандартный обработчик события копирования:
Процедура ПриКопировании(ОбъектКопирования)
// Сбрасываем значение булевого реквизита для нового документа
Флаг1 = Ложь;
КонецПроцедуры
Обратим внимание на работу контекста: переданный параметр ОбъектКопирования содержит ссылку или исходный объект, откуда берутся данные. Прямое обращение к имени реквизита Флаг1 в модуле объекта неявно ссылается на реквизит нового создаваемого объекта (ЭтотОбъект).
Если мы дорабатываем типовую конфигурацию (например, 1C:ERP, УТ или Бухгалтерию), находящуюся на поддержке, лучшей практикой является использование механизма подписок на события. Это позволяет не снимать документ с замка и упрощает последующие обновления.
Разберем по шагам создание подписки:
ДокументОбъект).ПриКопировании.Посмотрим на пример кода процедуры в общем модуле:
Процедура ОбработкаПриКопированииДокумента(Источник, ОбъектКопирования) Экспорт
// Проверяем наличие реквизита и сбрасываем его
Источник.Флаг1 = Ложь;
КонецПроцедуры
Встречаются ситуации, когда флажок не хранится в реквизитах самого документа, а является реквизитом управляемой формы. В этом случае модуль объекта не имеет к нему доступа.
Для инициализации таких реквизитов используем обработчик ПриСозданииНаСервере в модуле формы документа:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Проверяем, создается ли форма в режиме копирования существующего документа
Если Параметры.Свойство("ЗначениеКопирования") И ЗначениеЗаполнено(Параметры.ЗначениеКопирования) Тогда
Флаг1 = Ложь;
КонецЕсли;
КонецПроцедуры
Если булев реквизит расположен не в шапке документа, а в строках табличной части, сбрасывать его значение во всех строках можно без использования циклов. Для этого в процедуре ПриКопировании воспользуемся методом ЗаполнитьЗначения:
Процедура ПриКопировании(ОбъектКопирования)
// Быстрая установка значения Ложь для всех строк указанной колонки
Товары.ЗаполнитьЗначения(Ложь, "Флаг1");
КонецПроцедуры
Проанализируем важный нюанс: платформа 1С автоматически вызывает событие ПриКопировании только при интерактивном копировании пользователем из списка или при программном вызове метода Скопировать().
Если в коде используется ручное создание объекта через метод СоздатьДокумент() с последующим вызовом ЗаполнитьЗначенияСвойств(), событие ПриКопировании вызвано не будет. В таких алгоритмах очистку реквизита необходимо указывать в коде заполнения явно либо использовать процедуру ОбработкаЗаполнения.