Как программно установить флажок на управляемой форме 1С при пакетной обработке данных?

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

При разработке обработок и пакетном обновлении справочников или документов разработчики часто сталкиваются с ситуацией: на управляемой форме элемента отображается флажок (например, Сертификат), однако попытка записать в коде выборки Объект.Сертификат = Истина; приводит к исключению «Поле объекта не обнаружено». Разберем детально, почему так происходит, как устроена связь интерфейса с базой данных и как правильно решить эту задачу программно.

Выясним причину ошибки: реквизиты формы против реквизитов объекта

Проанализируем архитектуру управляемых форм платформы «1С:Предприятие 8.3». В управляемом интерфейсе модель данных строго разделена:

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

В типовых конфигурациях вместо неудобных для пользователя выпадающих списков на форму часто выносят несколько отдельных флажков типа Булево. При открытии формы в процедурах ПриСозданииНаСервере или ПриЧтенииНаСервере типовой код проверяет значение реального реквизита объекта (чаще всего это перечисление) и выставляет галочки. Например:


Сертификат = (Объект.ВидДополнительногоОбучения = Перечисления.ВидыПрофессиональнойПодготовки.Сертификат);

А при интерактивном переключении флажка обработчик события ПриИзменении транслирует выбор пользователя обратно в значение перечисления. Когда же мы запускаем внешнюю обработку и обходим элементы через Выборка.Следующий(), форма не открывается, ее контекста и реквизита Сертификат просто не существует. Экземпляр СправочникОбъект содержит только метаданные самой таблицы базы данных, поэтому обращение к свойству Объект.Сертификат закономерно вызывает ошибку.

Решение 1: Пакетное обновление данных через реальный реквизит объекта

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

Посмотрим на пример кода пакетной обработки справочника:


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

Обратите внимание: обращение к фиктивной переменной или реквизиту формы Сертификат полностью исключено из тела цикла. После выполнения этой обработки при открытии любого измененного элемента типовая форма самостоятельно прочитает значение реквизита ВидДополнительногоОбучения и автоматически отобразит галочку в интерфейсе.

Решение 2: Программная установка значения в контексте самой формы

Если задача заключается не в пакетной обработке через выборку, а в изменении состояния флажка из кода самой открытой формы (например, по нажатию пользовательской кнопки на форме), логика будет другой.

Разберем по шагам, как обратиться к реквизиту в зависимости от того, куда привязан элемент:

  1. Если элемент формы напрямую связан с реквизитом объекта (в свойстве «ПутьКДанным» указано Объект.ИмяРеквизита), то пишем:
    Объект.ИмяРеквизита = Истина;
  2. Если флажок привязан к самостоятельному реквизиту формы (в свойстве «ПутьКДанным» указано просто Сертификат), то обращаемся к нему напрямую по имени без префиксов:
    Сертификат = Истина;
    При этом важно помнить: чтобы изменение сохранилось в базе данных, необходимо также синхронизировать связанный с ним реквизит объекта (Объект.ВидДополнительногоОбучения), иначе при закрытии формы или записи объекта данные будут утеряны.

Оптимизация и важные нюансы при пакетной записи объектов

Рассмотрим дополнительные технические приемы, которые необходимо учитывать при массовой модификации объектов в 1С:

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

Альтернативный вариант: «Групповое изменение реквизитов» без программирования

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

  1. Откройте типовую обработку «Групповое изменение реквизитов» (в большинстве конфигураций доступна в разделе «Администрирование» — «Обслуживание» — «Корректировка данных»).
  2. Выберите целевой справочник и добавьте необходимые условия отбора.
  3. В перечне доступных реквизитов найдите физический реквизит объекта (в нашем случае это Вид дополнительного обучения, а не визуальный реквизит формы).
  4. Установите значение из перечисления (Сертификат) и нажмите кнопку «Изменить выделенные».

Обработка обновит данные на уровне таблиц СУБД, и при последующем открытии карточек элементов все соответствующие флажки на управляемых формах окажутся взведенными автоматически.

← На главную