Да, это не первая статья на эту тему. Но нормального готового решения я не нашел, поэтому сделал свой вариант. Если кому-то еще будет полезно - и хорошо!
Хотелось сделать следующую реализацию:
- Пометки должны работать при однократном нажатии. При этом быть картинками, т.к. просто галками, имхо, некрасиво.
- Не использовать решение с параметром запроса. Таким образом не будут генерироваться лишние временные таблицы при большом числе выбранных значений (больше 128)
- Вместо этого использовать быстрое Соответствие.
- Временное хранилище использовать минимально, насколько возможно. Не читать временное хранилище на клиенте.
Минусы решения:
Т.к. используется событие "при активизации ячейки", то если текущая галочка уже выделена, необходимо нажать дважды, чтобы переключить. В остальных случаях достаточно однократного нажатия.
Итого, получилось так:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Список.КомпоновщикНастроек.Настройки.ДополнительныеСвойства.Вставить("ИзменитьПометки", Новый Соответствие);
Список.КомпоновщикНастроек.Настройки.ДополнительныеСвойства.Вставить("АдресПометок"
, ПоместитьВоВременноеХранилище(Новый Соответствие, ЭтаФорма.УникальныйИдентификатор));
КонецПроцедуры
&НаКлиенте
Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
Если Поле = Элементы.СписокПометка Тогда
СтандартнаяОбработка = Ложь;
ПометкаПриИзменении(Элемент, Список);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура СписокПриАктивизацииЯчейки(Элемент)
Если Элемент.ТекущийЭлемент = Элементы.СписокПометка и Элемент.ТекущиеДанные <> Неопределено Тогда
ПометкаПриИзменении(Элемент, Список);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПометкаПриИзменении(Элемент, Список)
ТекДанные = Элемент.ТекущиеДанные;
КлючСтроки = ТекДанные["Ссылка"];
ИзменитьПометки = Новый Соответствие;
ИзменитьПометки.Вставить(КлючСтроки, ТекДанные.Пометка = Истина);
Список.КомпоновщикНастроек.Настройки.ДополнительныеСвойства.Вставить("ИзменитьПометки", ИзменитьПометки);
КонецПроцедуры
&НаСервереБезКонтекста
Процедура СписокПриПолученииДанныхНаСервере(ИмяЭлемента, Настройки, Строки)
ДопСвойства = Настройки.ДополнительныеСвойства;
Пометки = ПолучитьИзВременногоХранилища(ДопСвойства.АдресПометок);
ИсходноеКоличество = Пометки.Количество();
Для каждого КлючЗначение Из ДопСвойства.ИзменитьПометки Цикл
Если КлючЗначение.Значение Тогда
Пометки.Удалить(КлючЗначение.Ключ);
Иначе
Пометки.Вставить(КлючЗначение.Ключ, Истина);
КонецЕсли;
КонецЦикла;
Для каждого СтрокаСписка Из Строки Цикл
КлючСтроки = СтрокаСписка.Значение.Данные["Ссылка"];
СтрокаСписка.Значение.Данные.Пометка = ( Пометки[КлючСтроки] = Истина );
КонецЦикла;
Если ИсходноеКоличество <> Пометки.Количество() Тогда
ПоместитьВоВременноеХранилище(Пометки, ДопСвойства.АдресПометок);
КонецЕсли;
КонецПроцедуры
Важный нюанс:
Колонкой по умолчанию надо установить НЕ колонку с пометкой.
P.S. Да, я в курсе что есть "гиперссылка ячейки" для однократного нажатия, но к сожалению с флажками и картинками оно не работает.
Проверено на следующих конфигурациях и релизах:
- 1С:Библиотека стандартных подсистем, редакция 3.1, релизы 3.1.1.91