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