Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
20 мая 2025, 22:52

Проблема с раскраской календаря по наличию договора у клиента

Автор aaenclr, Вчера в 14:29

0 Пользователей и 2 гостей просматривают эту тему.

aaenclr

 Нужно реализовать окраску вспомогательной колонки календаря в зависимости от наличия у клиента договора определённого вида.

Цель: 
Если у клиента есть договор с видом "Договор основной", то фон вспомогательной колонки должен быть цвета Seagreen (RGB 46,139,87). 
Если такого договора нет — красный цвет (RGB 255,0,0).

Что сделано: 
В обработчике события "Алгоритм расчёта" вспомогательной колонки написан код, который:
- Получает клиента из КлючевойОбъект
- Через запрос выбирает все проведённые договоры клиента
- Перебирает их и проверяет, есть ли среди них договор с нужным видом
- Возвращает цвет через переменную Результат

Проблема: 
Несмотря на наличие договора у клиента, цвет не применяется. Все ячейки остаются без цвета. При этом аналогичный код, но основанный на метках клиента, работает корректно.

Рабочий код на основе меток:

Если КлючевойОбъект.Метаданные().ТабличныеЧасти.Найти("Метки") <> Неопределено Тогда
   
    Если КлючевойОбъект.Метки.Количество() > 0 Тогда
       
        ЕстьДоговор = Ложь;

        Для Каждого Метка Из КлючевойОбъект.Метки Цикл
            Если Метка.Наименование = "Договор" Тогда
                ЕстьДоговор = Истина;
                Прервать;
            КонецЕсли;
        КонецЦикла;

        Если ЕстьДоговор Тогда
            Результат = Новый Цвет(159,190,162);
        Иначе
        КонецЕсли;

    Иначе
        Результат = Новый Цвет(244,138,141);
    КонецЕсли;

КонецЕсли;

Не рабочий код на основе договоров:


Клиент = КлючевойОбъект.Пациент;
Если Клиент.Неопределено() Тогда
    Возврат;
КонецЕсли;

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
    | ДоговорСКлиентом.*
 ИЗ
    | Документ.ДоговорСКлиентом КАК ДоговорСКлиентом
 ГДЕ
    | ДоговорСКлиентом.Клиент = &Клиент
    И ДоговорСКлиентом.Проведен = Истина";

Запрос.УстановитьПараметр("Клиент", Клиент);
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();

ЕстьДоговор  = Ложь;

Пока Выборка.Следующий() Цикл
    Если Выборка.ВидДоговора.Наименование = "Договор основной" Тогда
        ЕстьДоговор  = Истина;
        Прервать;
    КонецЕсли;
КонецЦикла;

Если ЕстьДоговор  Тогда
    Результат = Новый Цвет(46, 139, 87);
Иначе
    Результат = Новый Цвет(255, 0, 0);
КонецЕсли;


Форма календаря: ЖурналЗаписи
Элемент: Вспомогательная колонка 
Тип владельца: Клиент 
Способ вычисления: Условие на языке 1С 
Формат вывода: Фон 


Максим75

aaenclr, Вид договора у Вас это что, какой тип?
возможно условие никогда не выполняется.

sali

aaenclr, лучше мне кажется по типу или виду искать основной договор , через наименование не всегда корректно. вдруг там название "договор основной" , а "Основной договор"? тогда уж если так ищете то через подобно попробуйте
ДоговорСКлиентом.Наименование ПОДОБНО "%основной%"

aaenclr

Максим75, справочник "Виды договоров" предназначен для классификации документов  "Договор с клиентом". Я думаю, что не работает так как к разделе куда этот код пихается Объект это клиент, а это данные про вид договора из другого справочника...

aaenclr

aaenclr, не, у меня получилось


Попытка
   
    Клиент = КлючевойОбъект;

    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ ПЕРВЫЕ 1
    |   ИСТИНА КАК ЕстьОсновнойДоговор
    |ИЗ
    |   Документ.ДоговорСКлиентом КАК Договор
    |ГДЕ
    |   Договор.Клиент = &Клиент
    |   И Договор.Проведен = ИСТИНА
    |   И (Договор.ВидДоговора.Наименование ПОДОБНО ""%основной%""
    |       ИЛИ Договор.ВидДоговора.Наименование = ""Договор основной"")";
   
    Запрос.УстановитьПараметр("Клиент", Клиент);
   
    РезультатЗапроса = Запрос.Выполнить();
   
    Если НЕ РезультатЗапроса.Пустой() Тогда
        /
        Результат = Новый Цвет(46, 139, 87); // Seagreen
    Иначе
       
        Результат = Новый Цвет(255, 0, 0); // Красный
    КонецЕсли;
Исключение
    // В случае любой ошибки - оранжевый цвет для диагностики
    ИнфоОбОшибке = ИнформацияОбОшибке();
    Сообщить("Ошибка: " + ИнфоОбОшибке.Описание + " в строке " + ИнфоОбОшибке.НомерСтроки);
    Результат = Новый Цвет(255, 165, 0); // Оранжевый
КонецПопытки;

aaenclr


Похожие темы (5)

Рейтинг@Mail.ru

Поиск