При разработке обработок и пакетном обновлении справочников или документов разработчики часто сталкиваются с ситуацией: на управляемой форме элемента отображается флажок (например, Сертификат), однако попытка записать в коде выборки Объект.Сертификат = Истина; приводит к исключению «Поле объекта не обнаружено». Разберем детально, почему так происходит, как устроена связь интерфейса с базой данных и как правильно решить эту задачу программно.
Проанализируем архитектуру управляемых форм платформы «1С:Предприятие 8.3». В управляемом интерфейсе модель данных строго разделена:
ВидДополнительногоОбучения справочника). Только к этим полям можно обращаться через объект при выборке: Объект = Выборка.ПолучитьОбъект();.Объект.Наименование), либо с отдельным реквизитом формы (например, Сертификат).В типовых конфигурациях вместо неудобных для пользователя выпадающих списков на форму часто выносят несколько отдельных флажков типа Булево. При открытии формы в процедурах ПриСозданииНаСервере или ПриЧтенииНаСервере типовой код проверяет значение реального реквизита объекта (чаще всего это перечисление) и выставляет галочки. Например:
Сертификат = (Объект.ВидДополнительногоОбучения = Перечисления.ВидыПрофессиональнойПодготовки.Сертификат);
А при интерактивном переключении флажка обработчик события ПриИзменении транслирует выбор пользователя обратно в значение перечисления. Когда же мы запускаем внешнюю обработку и обходим элементы через Выборка.Следующий(), форма не открывается, ее контекста и реквизита Сертификат просто не существует. Экземпляр СправочникОбъект содержит только метаданные самой таблицы базы данных, поэтому обращение к свойству Объект.Сертификат закономерно вызывает ошибку.
Рассмотрим правильный алгоритм пакетного изменения данных в коде внешней обработки. Нам не нужно искать способ установить флажок на форме или имитировать нажатие интерфейсных кнопок. Достаточно напрямую записать правильное значение в тот реквизит базы данных, от которого зависит этот флажок.
Посмотрим на пример кода пакетной обработки справочника:
Пока Выборка.Следующий() Цикл
Объект = Выборка.ПолучитьОбъект();
// Заполняем физический реквизит объекта нужным значением перечисления
Объект.ВидДополнительногоОбучения = Перечисления.ВидыПрофессиональнойПодготовки.Сертификат;
// Записываем изменения в базу данных
Объект.Записать();
КонецЦикла;
Обратите внимание: обращение к фиктивной переменной или реквизиту формы Сертификат полностью исключено из тела цикла. После выполнения этой обработки при открытии любого измененного элемента типовая форма самостоятельно прочитает значение реквизита ВидДополнительногоОбучения и автоматически отобразит галочку в интерфейсе.
Если задача заключается не в пакетной обработке через выборку, а в изменении состояния флажка из кода самой открытой формы (например, по нажатию пользовательской кнопки на форме), логика будет другой.
Разберем по шагам, как обратиться к реквизиту в зависимости от того, куда привязан элемент:
Объект.ИмяРеквизита), то пишем:Объект.ИмяРеквизита = Истина;Сертификат), то обращаемся к нему напрямую по имени без префиксов:Сертификат = Истина;Объект.ВидДополнительногоОбучения), иначе при закрытии формы или записи объекта данные будут утеряны.Рассмотрим дополнительные технические приемы, которые необходимо учитывать при массовой модификации объектов в 1С:
ПередЗаписью, стандартный вызов метода Записать() может упасть с ошибкой. Чтобы применить обновление как техническую загрузку без вызова избыточной прикладной логики, используют флаг:Объект.ОбменДанными.Загрузка = Истина;ОповеститьОбИзменении(СсылкаНаОбъект);.НачатьТранзакцию() и ЗафиксироватьТранзакцию(). Это существенно ускоряет процесс записи и снижает нагрузку на СУБД.Если вам требуется единоразово установить данное свойство для группы элементов, писать собственный код вовсе не обязательно. Проанализируем, как решить задачу стандартным инструментом:
Вид дополнительного обучения, а не визуальный реквизит формы).Сертификат) и нажмите кнопку «Изменить выделенные».Обработка обновит данные на уровне таблиц СУБД, и при последующем открытии карточек элементов все соответствующие флажки на управляемых формах окажутся взведенными автоматически.