Разработка на платформе 1С:Предприятие 7.7 часто сопряжена с необходимостью обходить ограничения штатного функционала. Одной из таких задач является обработка события "галкования" — момента, когда пользователь ставит или снимает пометку (галочку) у элемента в объекте СписокЗначений, размещенном на форме. В отличие от современных версий платформы, в 7.7 у элемента управления "Список значений" отсутствует предопределенное событие ПриИзмененииПометки. Штатное событие "ПриВыборе" срабатывает только при двойном клике или нажатии Enter, что не подходит для интерактивного подсчета отмеченных позиций.
В данной статье мы подробно разберем, как реализовать мгновенную реакцию системы на клик по галочке, проанализируем основные методы и рассмотрим примеры кода.
Самый популярный и эффективный способ решения этой задачи без использования внешних компонент основан на особенности движка отрисовки форм 1С 7.7. Платформа пересчитывает формулы всех видимых текстовых элементов на форме при любом интерактивном действии пользователя: клике мышью, нажатии клавиш или даже простом перемещении фокуса.
Рассмотрим пошагово реализацию этого метода:
ОбновитьИндикаторПометок().Теперь проанализируем код функции, которую необходимо добавить в модуль формы:
Функция ОбновитьИндикаторПометок()
Перем Колво;
Колво = 0;
// Проходим циклом по всему списку значений
Для Инд = 1 По СЗ_Данные.РазмерСписка() Цикл
// Метод Пометка() возвращает 1, если галочка установлена
Если СЗ_Данные.Пометка(Инд) = 1 Тогда
Колво = Колво + 1;
КонецЕсли;
КонецЦикла;
// Обновляем текстовую переменную на форме для визуализации счета
ТекстКолво = "Отмечено элементов: " + Колво;
// Функция в текстовом поле должна возвращать строку (можно пустую)
Возврат "";
КонецФункции
Важный нюанс: если в вашем списке тысячи элементов, такой перебор при каждом клике может привести к заметным задержкам (интерфейс начнет "подтормаживать"). В этом случае стоит добавить проверку на активность нужного элемента формы.
Зачастую нам недостаточно просто знать общее количество пометок. Мы хотим понимать, на какой именно строке пользователь нажал галочку. Поскольку штатных средств для этого нет, нам придется использовать механизм сравнения состояний.
Разберем, как это реализовать. Нам понадобится вспомогательный список значений, который будет хранить "предыдущее" состояние пометок. Мы будем сравнивать его с текущим состоянием при каждом вызове функции из текстового поля.
// Вне процедур в начале модуля формы
Перем СЗ_ПредыдущееСостояние;
Процедура ПриОткрытии()
// Инициализируем вспомогательный список
СЗ_ПредыдущееСостояние = СоздатьОбъект("СписокЗначений");
// Заполняем его актуальными данными
СЗ_Данные.Выгрузить(СЗ_ПредыдущееСостояние);
КонецПроцедуры
Функция ОбработкаКликовПоСписку()
// Проверяем, что пользователь работает именно со списком
Если Форма.АктивныйЭлемент() = "СЗ_Данные" Тогда
Для Инд = 1 По СЗ_Данные.РазмерСписка() Цикл
ТекущаяПометка = СЗ_Данные.Пометка(Инд);
СтараяПометка = СЗ_ПредыдущееСостояние.Пометка(Инд);
Если ТекущаяПометка <> СтараяПометка Тогда
// Мы нашли измененный элемент!
Сообщить("Изменена пометка в строке: " + Инд);
// Здесь вызываем вашу логику обработки
МояПроцедураОбработки(Инд);
// Обновляем эталонное состояние
СЗ_ПредыдущееСостояние.Пометка(Инд, ТекущаяПометка);
Прервать; // Выходим из цикла, так как за один клик меняется одна галка
КонецЕсли;
КонецЦикла;
КонецЕсли;
Возврат "";
КонецФункции
Использование метода Форма.АктивныйЭлемент() позволяет значительно снизить нагрузку на систему, так как основной цикл сравнения будет срабатывать только тогда, когда фокус находится на списке значений.
Если проект позволяет отойти от использования стандартного СпискаЗначений, профессиональные разработчики рекомендуют использовать ТаблицуЗначений, размещенную на форме. Это дает гораздо больше контроля:
ВыводитьИконки() можно визуализировать эту колонку как настоящие чекбоксы (используя картинку с галочкой).Однако, если задача стоит именно в работе со списком значений, метод с текстовым полем остается единственным надежным способом в рамках стандартной конфигурации без использования внешнего программного обеспечения.
Проанализируем возможные проблемы при использовании описанных методов:
Вопрос()), это может сбить фокус или вызвать некорректную перерисовку формы.Таким образом, мы выяснили, что отсутствие прямого события изменения пометки в 1С 7.7 — не приговор. Комбинация текстового поля с формулой и механизма сравнения списков позволяет создать интерактивный и удобный интерфейс для пользователя, обеспечивая мгновенную реакцию системы на его действия.