![]() |
![]() |
![]() |
|
Интерактивное изменение подсветки поля в процессе его заполнения | ☑ | ||
---|---|---|---|---|
0
RED_HD
13.02.23
✎
18:54
|
На форме есть ТаблицаЗначений СписокПолучившихДубликатСПК, которая содержит элемент ПредыдущийНомерБСО. Тип элемента строка длинною 6 символов, которые должны заполняться по маске только цифрами. При добавлении строк в ТаблицуЗначений СписокПолучившихДубликатСПК добавляется условное оформление поля элемента ПредыдущийНомерБСО и оно окрашивается в WebЦвета.Сливовый. В обработчике события ИзменениеТекстаРедактирования получаю вводимые на стороне клиента данные по значениям которых хотелось сразу же менять цвет фона ячейки. Если заполнено 6 цифр фон ячейки становится белым, если цифр стало пять и менее, то цвет фона ячейки опять становится сливовым и всё это должно происходить на стороне клиента до фиксации данных в ТаблицеЗначений. Можно ли на 1с реализовать такой функционал? При нажатии ввода (при завершении редактирования) условное оформление строк в ТаблицеЗначений настраивается и отображается корректно (условное оформление для строк ТаблицыЗначений настраивается програмнно на стороне сервера). Я даже пробую менять цвета в элементах условного оформления на стороне сервера, но в процессе редактирования строки можно ли обновить изменённое условное оформление для редактируемого поля? Или я много хочу от 1с 8.3.13.1644?
|
|||
1
Donkey_hot
13.02.23
✎
19:26
|
(0) Что-то типа такого не подойдет?
&НаКлиенте Процедура ТаблицаРеквизитИзменениеТекстаРедактирования(Элемент, Текст, СтандартнаяОбработка) Если СтрДлина(Текст) = 6 тогда ЦветОформления = WebЦвета.Зеленый; ИначеЕсли СтрДлина(Текст) = 0 тогда ЦветОформления = WebЦвета.Серый; Иначе ЦветОформления = WebЦвета.Желтый; КонецЕсли; Элемент.ЦветФона = ЦветОформления; КонецПроцедуры |
|||
2
RED_HD
13.02.23
✎
19:51
|
Данный код пробовал, он рабочий но работает не правильно когда в ТаблицеЗначений несколько строк с разным условным оформлением, выполненным на стороне сервера. До окончания ввода значения при редактировании строки, когда добавляю цвет фона, происходит окрашивание всех колонок с элементами ПредыдущийНомерБСО в один цвет, который мной добавляется по условию. После нажатия на ввод, условное оформление на стороне сервера срабатывает и колонки раскрашиваются корректно. Такое добавление цвета на клиенте по факту влияет на весь столбец, поэтому я попробовал обхитрить систему и внести корректировки в существующее условное оформление на стороне сервера.
|
|||
3
RED_HD
13.02.23
✎
19:58
|
&НаКлиенте
Процедура СписокПолучившихДубликатСПКПредыдущийНомерБСОИзменениеТекстаРедактирования(Элемент, Текст, СтандартнаяОбработка) // Задаём цвета Сливовый = WebЦвета.Сливовый; Белый = WebЦвета.Белый; // Получаем порядковый номер ЭлементаУсловногоОформления у текущего элемента ПорядковыйНомерЭлементаУсловногоОформления = Число(Элемент.Родитель.ТекущиеДанные.ПорядковыйНомерЭлементаУсловногоОформления); // Получаем цвет фона текущего элемента, заданный в условном оформлении ЦветФонаЭлемента = ПолучитьЦветФонаЭлементаУсловногоОформления(ПорядковыйНомерЭлементаУсловногоОформления); // Строка в переменной 'Текст' может содержать пробелы, так как при использовании заполнения по маске поля с типом данных строка, все незаполненные символы заменяются пробелами Если СтрЧислоВхождений(Текст, " ") > 0 Тогда // Поэтому удаляем все пробелы из строки Текст = СтрЗаменить(Текст, " ", ""); КонецЕсли; // Получаем количество символов в строке ДлинаСтроки = СтрДлина(Текст); // Настраиваем условное оформление цвета фона у поля 'пред. № БСО' в выбранной строке в форме 'ФормаПодбораПолучившихДубликатСПК' справочника 'ФизическиеЛица' Если ДлинаСтроки < 6 и ЦветФонаЭлемента = Белый Тогда // Изменяем у элемента условного оформления заданный цвет фона ИзменитьЦветФонаЭлементаУсловногоОформления(ПорядковыйНомерЭлементаУсловногоОформления, Сливовый); // Как-то нужно обновить отображение условного оформление на отрытой форме ????????? ИначеЕсли ДлинаСтроки = 6 И ЦветФонаЭлемента = Сливовый Тогда // Изменяем у элемента условного оформления заданный цвет фона ИзменитьЦветФонаЭлементаУсловногоОформления(ПорядковыйНомерЭлементаУсловногоОформления, Белый); // Как-то нужно обновить отображение условного оформление на отрытой форме ????????? КонецЕсли; КонецПроцедуры &НаСервере Функция ПолучитьЦветФонаЭлементаУсловногоОформления(ПорядковыйНомерЭлементаУсловногоОформления) ЦветФонаЭлемента = Неопределено; Счётчик = 1; Если УсловноеОформление.Элементы.Количество() > 0 Тогда Для Каждого ЭлементОформления ИЗ УсловноеОформление.Элементы Цикл Если Счётчик = ПорядковыйНомерЭлементаУсловногоОформления Тогда ЦветФонаЭлемента = ЭлементОформления.Оформление.Элементы[0].Значение; КонецЕсли; Счётчик = Счётчик + 1; КонецЦикла; КонецЕсли; Возврат ЦветФонаЭлемента; КонецФункции &НаСервере Процедура ИзменитьЦветФонаЭлементаУсловногоОформления(ПорядковыйНомерЭлементаУсловногоОформления, ЦветФонаЭлемента) Счётчик = 1; Если УсловноеОформление.Элементы.Количество() > 0 Тогда Для Каждого ЭлементОформления ИЗ УсловноеОформление.Элементы Цикл Если Счётчик = ПорядковыйНомерЭлементаУсловногоОформления Тогда ЭлементОформления.Оформление.Элементы[0].Значение = ЦветФонаЭлемента; Сообщить("Изменили цвет фона"); КонецЕсли; Счётчик = Счётчик + 1; КонецЦикла; КонецЕсли; КонецПроцедуры |
|||
4
Donkey_hot
13.02.23
✎
19:59
|
(2) Я сделал в таблице дополнительное поле типа "Число", по нему настраиваю условное оформление. При изменении текста редактирования записываю текущую длину строки в это поле. Вам же надо если пустая или меньше 6, сливовый, если ровно 6 - белый?
|
|||
5
Donkey_hot
13.02.23
✎
20:05
|
&НаКлиенте
Процедура ТаблицаРеквизитИзменениеТекстаРедактирования(Элемент, Текст, СтандартнаяОбработка) ДлинаВведенногоТекста = СтрДлина(Текст); Если ДлинаВведенногоТекста = 6 тогда ЦветОформления = WebЦвета.Белый; Иначе ЦветОформления = WebЦвета.Сливовый; КонецЕсли; Элемент.ЦветФона = ЦветОформления; Элементы.Таблица.ТекущиеДанные.КоличествоСимволов = ДлинаВведенногоТекста; КонецПроцедуры Вот такой вариант у меня работает нормально. Правда, условное оформление создавал интерактивно, но думаю при программном создании ничего не поменяется. |
|||
6
RED_HD
13.02.23
✎
20:08
|
А когда срабатывает окрашивание? При нажатии Enter все корректно. Хотелось бы интерактивности, то есть в процессе редактирования ячейки. Ваш вариант работает, но у меня реализован подбор и в ТЗ добавляется много строк. Так вот когда начинаешь из заполнять и менять окрашивание, происходит некорректная окраска полей до завершения редактирования текстового поля. Система отрабатывает очень своеобразно.
|
|||
7
Donkey_hot
13.02.23
✎
20:11
|
(6) При каждом нажатии перекрашивается. На строках, где уже заполнено поле "количество символов", остается корректное условное оформление. При подборе это поле изначально пустое в добавляемых строках?
|
|||
8
RED_HD
13.02.23
✎
20:16
|
Процедура задаёт условное оформление
&НаСервере Процедура НастроитьУсловноеОформлениеСтрок() // Очищение условного оформления УсловноеОформление.Элементы.Очистить(); // Задаём счётчик порядкового номера для элемента условного оформления ПорядковыйНомер = 1; // Перебираем строки в ТаблицеЗначений 'СписокПолучившихДубликатСПК' формы 'ФормаПодбораПолучившихДубликатСПК' справочника 'ФизическиеЛица' Для Счётчик = 1 По СписокПолучившихДубликатСПК.Количество() Цикл // Обращаемся через индекс строки СписокПолучившихДубликатСПК[Счётчик - 1] к полю в колонке 'пред. № БСО' и считываем из него значение ПредыдущийНомерБСО = СписокПолучившихДубликатСПК[Счётчик - 1].ПредыдущийНомерБСО; // Строка в переменной 'ПредыдущийНомерБСО' может содержать пробелы, так как при использовании заполнения по маске поля с типом данных строка, все незаполненные символы заменяются пробелами Если СтрЧислоВхождений(ПредыдущийНомерБСО, " ") > 0 Тогда // Поэтому удаляем все пробелы из строки ПредыдущийНомерБСО = СтрЗаменить(ПредыдущийНомерБСО, " ", ""); КонецЕсли; // Если выполняется условие Если (НЕ ЗначениеЗаполнено(ПредыдущийНомерБСО)) ИЛИ (ЗначениеЗаполнено(ПредыдущийНомерБСО) И СтрДлина(ПредыдущийНомерБСО) < 6) Тогда СписокПолучившихДубликатСПК[Счётчик - 1].ПорядковыйНомерЭлементаУсловногоОформления = ПорядковыйНомер; ПорядковыйНомер = ПорядковыйНомер + 1; // Настраивает условное оформление в текущей сроке Элемент = УсловноеОформление.Элементы.Добавить(); ПолеЭлемента = Элемент.Поля.Элементы.Добавить(); ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.СписокПолучившихДубликатСПК.ПодчиненныеЭлементы.СписокПолучившихДубликатСПКПредыдущийНомерБСО.Имя); Элемент.Использование = Истина; ПолеЭлемента.Использование = Истина; ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("СписокПолучившихДубликатСПК.ПредыдущийНомерБСО"); ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; ОтборЭлемента.ПравоеЗначение = ПредыдущийНомерБСО; ОтборЭлемента.Использование = Истина; // Задаём цвет фона Элемент.Оформление.УстановитьЗначениеПараметра("ЦветФона", WebЦвета.Сливовый); КонецЕсли; КонецЦикла; КонецПроцедуры Я сейчас видео запишу и ссылку скину, так будет нагляднее. Я уже неделю с этим мучаюсь. |
|||
9
Donkey_hot
13.02.23
✎
20:55
|
(8) Что-то мудрите Вы, коллега. Зачем каждый раз генерировать условное оформление, оно у Вас всегда одинаковое: если длина строки в поле меньше 6, то сливовый, если ровно 6 - то белый. Можно создать его программно (и даже нужно, если речь о типовом решении), но один раз, при создании формы. Можно, как писал выше, хранить значение для вычисления условного оформления в отдельном поле (например числовом), но для даанной конкретной задачи достаточно использовать вид сравнения "Соответствует шаблону", если конечно я эту задачу изначально верно понимаю.
|
|||
10
RED_HD
13.02.23
✎
21:54
|
вот ссылка https://youtu.be/eIvAPoUInNE посмотрите, станет понятно.
|
|||
11
Donkey_hot
13.02.23
✎
22:06
|
(10) Похоже, что задачу понял правильно. Соответственно, и предложение в силе. Настроить условное оформление один раз при создании формы, красить при изменении текста редактирования. https://disk.yandex.ru/d/bL__uYC00PVkuQ - вот здесь обработка, работает, на мой взгляд, именно так, как Вам нужно. Сначала реализовал через дополнительное служебное поле для хранения количества символов в текущей строке, потом переделал на шаблон. Работает в обоих вариантах. Условное оформление задано интерактивно, но ничто не мешает Вам воспроизвести его программно.
|
|||
12
RED_HD
13.02.23
✎
22:15
|
Спасибо! Посмотрю завтра, отпишусь как будет работать.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |