Имя: Пароль:
1C
1С v8
Проблема с двумя ДС и хождение формы на сервер.
0 Alex174
 
05.06.22
18:31
Всем привет! Есть у меня обработка. В ней на форме 2 динамических списка и два сигнализатора. Первый ДС - Заказы, второй - Материалы. Суть такая: выбираем заказ, потом выбираем материал и если в заказе используется данный материал, то включаем зеленую подсветку элемента, когда материал не используется - выключаем зеленую и включаем красную на втором элементе. Это я победил, немного криво но работает.

Проблема которую не могу решить второй день:
При активизации строки в ДС Заказы, сбрасывается выделение в ДС Материалы. И при этом нужно сделать невидимыми оба квадрата сигнализатора.

Вот скрин https://pastenow.ru/def05e20c8116823b34eeffc2915c68c

Вот код который работает, но не сбрасывает выделение при смене строки в ДС Заказы. Хелп ми плиз! Если добавляю Сброс() в ЗаказыПриАктивизацииСтроки(Элемент) тогда вообще все перестает работать т.к. форма летает с сервере на сервер для отрисовки и при возвращении происходит активизация строки в Заказах.. Какой то замкнутый круг..

&НаКлиенте
Перем МатериалыИзЗаказа_Массив;
&НаКлиенте
Перем СсылкаНаДокумент;


&НаКлиенте
Процедура ПриОткрытии(Отказ)
    ПервоеОткрытие = Истина;
    
    ВклВыкл_МатериалИспользуется("Выкл");
    ВклВыкл_МатериалНЕИспользуется("Выкл");
    
    //ПодключитьОбработчикОжидания("Сброс", 1, Ложь);
    
КонецПроцедуры


&НаКлиенте
Процедура ЗаказыПриАктивизацииСтроки(Элемент)
    СсылкаНаДокумент =  Элементы.Заказы.ТекущиеДанные.Ссылка;
    МатериалыИзЗаказа_Массив = МассивМатериаловИзЗаказа(СсылкаНаДокумент);
    
    Элементы.Материал.ВыделенныеСтроки.Очистить();
КонецПроцедуры


&НаКлиенте
Процедура МатериалПриАктивизацииЯчейки(Элемент)
    Если ПервоеОткрытие Тогда
        Элемент.ВыделенныеСтроки.Очистить();
        ПервоеОткрытие = Ложь;
    Иначе
        Результат = МатериалыИзЗаказа_Массив.Найти(Элементы.Материал.ТекущиеДанные.Ссылка);
        
        Если Результат = Неопределено Тогда
            ВклВыкл_МатериалИспользуется("Выкл");
            ВклВыкл_МатериалНЕИспользуется("Вкл");
        Иначе
            ВклВыкл_МатериалИспользуется("Вкл");
            ВклВыкл_МатериалНЕИспользуется("Выкл");
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры


&НаСервереБезКонтекста
Функция МассивМатериаловИзЗаказа(СсылкаНаДокумент)
    
    МассивМатериалов = Новый Массив;

    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    ЗаказМатериал.Номенклатура КАК Номенклатура
        |ИЗ
        |    Документ.Заказ.Материал КАК ЗаказМатериал
        |ГДЕ
        |    ЗаказМатериал.Ссылка = &Ссылка";
    
    Запрос.УстановитьПараметр("Ссылка", СсылкаНаДокумент);
    
    РезультатЗапроса = Запрос.Выполнить();
    
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        МассивМатериалов.Добавить(ВыборкаДетальныеЗаписи.Номенклатура);
    КонецЦикла;

    Возврат МассивМатериалов
КонецФункции


&НаКлиенте
Процедура ВклВыкл_МатериалИспользуется(ЗначениеТумблера)

    Если ЗначениеТумблера = "Вкл" Тогда
        Элементы.МатериалИспользуется.ЦветФона = Новый Цвет(0, 255, 22);
        Элементы.МатериалИспользуется.ЦветТекста = Новый Цвет(0, 0, 0);
        СостояниеКнопкиИспользуется = Истина;
    ИначеЕсли ЗначениеТумблера = "Выкл" Тогда
        Элементы.МатериалИспользуется.ЦветФона = Новый Цвет(255, 255, 255);
        Элементы.МатериалИспользуется.ЦветТекста = Новый Цвет(255, 255, 255);
        СостояниеКнопкиИспользуется = Ложь;
    КонецЕсли;
    

КонецПроцедуры // ВклВыклМатериалИспользуется()


&НаКлиенте
Процедура ВклВыкл_МатериалНЕИспользуется(ЗначениеТумблера)

    Если ЗначениеТумблера = "Вкл" Тогда
        Элементы.МатериалНеИспользуется.ЦветФона = Новый Цвет(255, 0, 0);                                  
        Элементы.МатериалНеИспользуется.ЦветТекста = Новый Цвет(255, 255, 255);
        СостояниеКнопкиНЕИспользуется = Истина;
    ИначеЕсли ЗначениеТумблера = "Выкл" Тогда
        Элементы.МатериалНеИспользуется.ЦветФона = Новый Цвет(255, 255, 255);
        Элементы.МатериалНеИспользуется.ЦветТекста = Новый Цвет(255, 255, 255);
        СостояниеКнопкиНЕИспользуется = Ложь;
    КонецЕсли;
    

КонецПроцедуры // ВклВыклМатериалИспользуется()

&НаКлиенте
Процедура Сброс()

    ВклВыкл_МатериалИспользуется("Выкл");
    ВклВыкл_МатериалНЕИспользуется("Выкл");
    
КонецПроцедуры
1 Бабрак Кармаль
 
05.06.22
19:19
Надо читать синтакс помощник. Там русским языком написано:

ТаблицаФормы (FormTable)
ПриАктивизацииСтроки (OnActivateRow)

Синтаксис:
ПриАктивизацииСтроки()

Описание:
Вызывается при активизации строки таблицы.

Доступность:
Тонкий клиент, веб-клиент, мобильный клиент, сервер, толстый клиент, мобильное приложение (клиент).

Примечание:
В обработчике данного события нельзя использовать серверные методы формы с директивой компиляции &НаСервере, а также изменять свойства, которые могут привести к серверному вызову
2 Alex174
 
05.06.22
19:22
Точняк... Читал ведь, и что нельзя серверные вызовы использовать читал... Спасибо мил человек)
3 Бабрак Кармаль
 
05.06.22
19:25
(2) Это еще не все

ЦветФона (BackColor)

Использование:
Чтение и запись.

Описание:
Тип: Цвет.
Цвет фона.

Доступность:
Тонкий клиент, веб-клиент, мобильный клиент, сервер, толстый клиент, мобильное приложение (клиент), мобильное приложение (сервер), мобильный автономный сервер.
Изменение свойства на клиенте требует обращения к серверу.
4 Бабрак Кармаль
 
05.06.22
19:26
Регистрируй при активизации однократный обработчик ожидания на минимальное время и из него уже твори что хочешь
5 Бабрак Кармаль
 
05.06.22
19:28
И галочку в конфигураторе включи: https://ibb.co/D9Rh3st
6 Alex174
 
05.06.22
20:55
(4) На спасли обработчики. Такое-же зацикливание происходит... Сделал на списках значений, нифига не поменялось...
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн