Имя: Пароль:
1C
1С v8
Интерактивное изменение подсветки поля в процессе его заполнения
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
Спасибо! Посмотрю завтра, отпишусь как будет работать.
Закон Брукера: Даже маленькая практика стоит большой теории.