Полноценное использование галочек для типа Булево в табличной части
Предлагаю более удобный способ использования галочек в табличном поле, чем тот, до которого можно докопаться по умолчанию.
- Описание
- Подробнее
Описание
Пока, так сказать, первая попытка, посему прошу не судить строго. Надеюсь, кому-то пригодится…
Штатная работа с булевым значением в табличном поле крайне неудобна, приходится выбирать либо информативное и понятное отображение, либо удобство управления с контролем изменения значения. А очень хочется и то и другое.
Но если ставим все красиво, исчезает возможность контролировать изменение этой ячейки… Исчезает возможность задать процедуру «ПриИзменении».
Но есть возможность всё-же реализовать такую возможность.
Описываю процедуру по шагам (есть ньюансы, поэтому прошу строго придерживаться порядка, а после получения результата уже можно «поэкспериментировать»):
1. Создаем в нужном табличном поле реквизит типа Булево, назовем его, к примеру, Имя_реквизита. Можно реквизит не создавать, а использовать переменную, если галочку не нужно хранить в документе (С) webester
2. Создаем колонку на форме в табличном поле
3. Указываем Имя=Имя_реквизита
4. Пропускаем поле Данные (поле должно оставаться пустым, это важно!)
5. Указываем ЭлементУправления=Флажок, появится поле «ДанныеФлажка»
6. Указываем ДанныеФлажка=Имя_реквизита
7. Указываем РежимРедактирования=Непосредственно
Как мы видим, возможность перехватить событие «ПриИзменении» исчезает из свойств… что же делать? Смотрим дальше…
8. Заходим в свойства табличного поля
9. Создаем процедуру на событие ПриОкончанииРедактирования с таким текстом:
Если Элемент.ТекущаяКолонка.Имя="Имя_реквизита" Тогда
Имя_реквизита_ПриИзменении();
КонецЕсли;
9а. Как вариант (С) Yashazz, можно использовать процедуру ПриИзмененииФлажка, тогда Элемент.ТекущаяКолонка.Имя при желании можно сократить до Колонка.Имя,
но в таком случае мы не сможем использовать флаг ОтменаРедактирования (например, если нужно динамически задать условия изменения, например, доступность).
Если Колонка.Имя="Имя_реквизита" ТогдаИмя_реквизита_ПриИзменении();КонецЕсли;Вот мой пример использования для сравнения обеих процедур:
Процедура УслугиПриОкончанииРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования)Если НачисленияСотрудникам.Найти(Элемент.ТекущаяСтрока.НомерСтроки, "НомерУслуги")=Неопределено ТогдаНачислитьЗаРаботу(Элемент.ТекущаяСтрока);КонецЕсли;Если Элемент.ТекущаяКолонка.Имя="РаботаВкл" или Элемент.ТекущаяКолонка.Имя="МатериалВкл" ТогдаУслугиСуммаПриИзменении();КонецЕсли;КонецПроцедурыПроцедура УслугиПриИзмененииФлажка(Элемент, Колонка)Если НачисленияСотрудникам.Найти(Элемент.ТекущаяСтрока.НомерСтроки, "НомерУслуги")=Неопределено ТогдаНачислитьЗаРаботу(Элемент.ТекущаяСтрока);КонецЕсли;Если Колонка.Имя="РаботаВкл" или Колонка.Имя="МатериалВкл" ТогдаУслугиСуммаПриИзменении();КонецЕсли;КонецПроцедуры10. Создаем процедуру Имя_реквизита_ПриИзменении(), где, например, производим пересчет текущей строки в зависимости от значения реквизита Имя_реквизита.
*к примеру, лично у меня в зависимости от показания меняется сумма услуги в текущей строке:
Стр=ЭлементыФормы.Услуги.ТекущаяСтрока;Стр.СуммаМатериала= ?(Стр.МатериалВкл,Стр.ЦенаМатериала* Стр.Количество, 0);Стр.СуммаРаботы= ?(Стр.РаботаВкл,Стр.ЦенаРаботы* Стр.Количество, 0);П.С. если кто нибудь из старожилов может уделить мне пару минут внимания и объяснить, как правильно и грамотно публиковать свои наработки, буду очень благодарен. Мой скайп — valhalla_resa.
