Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Цветовое оформление формы списка
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 8.1 (8.0)
agav
Помогите оптимально решить следующую задачу.
Конфигурация УПП.

Менеджеры нуждаются в цветовом оформлении формы списка Заказов покупателей.
Причем им хочется приблизительно такое:

Цвет текста строки должен быть
зеленым - для закрытого (полностью отгруженного) заказа
черным - для незакрытого заказа
красным - для заказа по которому отгружено больше чем заказано

Цвет текста фона колонки "Картинка" должен быть
красным - для неоплаченного заказа
желтым - для частично оплаченного заказа
зеленым - для полностью оплаченного заказа.

Самое примитивное решение - выполнять запросы по определению состояний отгрузки и оплаты заказов в процедуре "ПриВыводеСтроки" работает чересчур долго ибо в системе тысячи заказов.

Добавлять реквизиты в документы нельзя.
Fynjy
Юзай при получении данных.
zetovich
например в журнале


Процедура ЖурналДокументовСписокПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
Если ХотимПерсиковый Тогда
ОформлениеСтроки.ЦветФона = WebЦвета.Персиковый;
КонецЕслИ;
КонецПроцедуры

agav
Цитата(zetovich @ 13.08.09, 12:01) необходимо зарегистрироваться для просмотра ссылки
например в журнале


Процедура ЖурналДокументовСписокПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
Если ХотимПерсиковый Тогда
ОформлениеСтроки.ЦветФона = WebЦвета.Персиковый;
КонецЕслИ;
КонецПроцедуры



Та это понятно. Я же написал, чтобы определить ХотимПерсиковый или ХотимЖелтый нужно выполнить запрос, а для тысячи строк запрос работает долго - меня менеджеры порежут.


Цитата(Fynjy @ 13.08.09, 11:58) необходимо зарегистрироваться для просмотра ссылки
Юзай при получении данных.


Уже лучше, но все равно тормозит страшно
zetovich
ой...не дочитал доконца вопрос...извеняюсь.
...я так пологаю запрос не упростишь?
agav
Цитата(zetovich @ 13.08.09, 12:15) необходимо зарегистрироваться для просмотра ссылки
ой...не дочитал доконца вопрос...извеняюсь.
...я так пологаю запрос не упростишь?


В принципе, как вариант, можно создать регистры сведений "СостоянияЗаказаПоОтгрузке" и "СостоянияЗаказаПоОплате", и писать запрос к ним - тогда, конечно, запрос упростишь.

Но, в этом случае нужно перелопатить очень много кода, чтобы правильно и вовремя заполнять эти регистры. Слишком много гемороя ради такой фуфельной задачки.
gryphus
Цитата(agav @ 13.08.09, 11:10) необходимо зарегистрироваться для просмотра ссылки
Та это понятно. Я же написал, чтобы определить ХотимПерсиковый или ХотимЖелтый нужно выполнить запрос, а для тысячи строк запрос работает долго - меня менеджеры порежут.




Уже лучше, но все равно тормозит страшно

ИМХО запросом решить это оптимальный вариант. Обычный перебор займет гораздо больше времени и ресурсов, а с регистрами -геморой.
Fynjy
Что то не так делаешь. Код покажи.
agav
Цитата(Fynjy @ 13.08.09, 12:32) необходимо зарегистрироваться для просмотра ссылки
Что то не так делаешь. Код покажи.


Промежуточный вариант, особенно тормозит при нажатии Page Up / Page Down. 2-3 секунды на нажатие:



Процедура СписокПриПолученииДанных(Элемент, ОформленияСтрок)

    Для Каждого ОформленияСтроки Из ОформленияСтрок Цикл

        ТекущийЗаказ = ОформленияСтроки.ДанныеСтроки.Ссылка;

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

        ЗапросСостоянияЗаказа.УстановитьПараметр("ЗаказПокупателя", ТекущийЗаказ);
        РезультатЗапрос = ЗапросСостоянияЗаказа.Выполнить();
        ЗаказЗакрыт = Ложь;
        ЗаказПереОтгружен = Ложь;
        Если РезультатЗапрос.Пустой() Тогда
            ЗаказЗакрыт = Истина;
        Иначе
            Выборка = РезультатЗапрос.Выбрать();
            Выборка.Следующий();
            ЗаказПереОтгружен = Выборка.КоличествоОстаток < 0;
        КонецЕсли;
        Если ЗаказЗакрыт Тогда
            ОформлениеСтроки.ЦветТекста = ЦветЗакрытыхЗаказов;
        ИначеЕсли ЗаказПереОтгружен Тогда
            ОформлениеСтроки.ЦветТекста = ЦветПереотгруженныхЗаказов;
        КонецЕсли;
    КонецЦикла;

КонецПроцедуры
Fynjy
Перепиши:
1. Обход строк получение всех заказов
2. Выполнение одного запроса
3. Обход строк и установка значений исходя из данных запроса.
Fynjy
Это не совсем корректно, но ... Можно переписать и изменять строки только не окрашенные ...
zetovich
1. если можно то
"&ЗаказПокупателя"
засунуть в
"РегистрНакопления.ЗаказыПокупателей.Остатки(&ДатаКон, куданить сюда)" (получается выбриатеся вся таблица..а потом на нее условие....если туды...то таблица выберится сразу с условием)
2. Дату в условие
Fynjy
Да запрос не правильный условие должно накладываться на виртуальную таблицу, как сказал Зетович
zetovich
+



Выборка = ЗапросСостоянияЗаказа.Выполнить().Выбрать();
Если Выборка.Количество() = 0 Тогда
ОформлениеСтроки.ЦветТекста = ЦветЗакрытыхЗаказов;
ИначеЕсли Выборка.Количество() > 0 Тогда
ОформлениеСтроки.ЦветТекста = ЦветПереотгруженныхЗаказов;
КонецЕсли;


и не нужно обходить выборку
ну, саму мысль уловили...


ой...цикл не увидел..
колонку ТЗ...в запрос...
а там после разобрать.
agav
Цитата(Fynjy @ 13.08.09, 12:43) необходимо зарегистрироваться для просмотра ссылки
Перепиши:
1. Обход строк получение всех заказов
2. Выполнение одного запроса
3. Обход строк и установка значений исходя из данных запроса.



Цитата(zetovich @ 13.08.09, 12:52) необходимо зарегистрироваться для просмотра ссылки
1. если можно то
"&ЗаказПокупателя"
засунуть в
"РегистрНакопления.ЗаказыПокупателей.Остатки(&ДатаКон, куданить сюда)" (получается выбриатеся вся таблица..а потом на нее условие....если туды...то таблица выберится сразу с условием)
2. Дату в условие



Спасибо, в таком виде работает ПОЧТИ без тормозов.





Процедура СписокПриПолученииДанных(Элемент, ОформленияСтрок)

Если ЗапросСостоянияЗаказа = Неопределено Тогда

ЗапросСостоянияЗаказа = Новый Запрос;

ЗапросСостоянияЗаказа.Текст =
"ВЫБРАТЬ
| ЗаказыПокупателейОстатки.ЗаказПокупателя КАК ЗаказПокупателя,
| ЗаказыПокупателейОстатки.КоличествоОстаток КАК КоличествоОстаток
|ИЗ
| РегистрНакопления.ЗаказыПокупателей.Остатки(, ЗаказПокупателя В (&ЗаказыПокупателя)) КАК ЗаказыПокупателейОстатки";

КонецЕсли;


ВыводимыеЗаказы = Новый Массив;
Для Каждого Строка Из ОформленияСтрок Цикл
ВыводимыеЗаказы.Добавить(Строка.ДанныеСтроки.Ссылка);
КонецЦикла;

ЗапросСостоянияЗаказа.УстановитьПараметр("ЗаказыПокупателя", ВыводимыеЗаказы);

Выборка = ЗапросСостоянияЗаказа.Выполнить().Выбрать();


СтруктураПоиска = Новый Структура("ЗаказПокупателя");
Для Каждого ОформлениеСтроки Из ОформленияСтрок Цикл

СтруктураПоиска.ЗаказПокупателя = ОформлениеСтроки.ДанныеСтроки.Ссылка;
СтрокаНайдена = Выборка.НайтиСледующий(СтруктураПоиска);
Если Не СтрокаНайдена Тогда
ОформлениеСтроки.ЦветТекста = ЦветЗакрытыхЗаказов;
ИначеЕсли Выборка.КоличествоОстаток < 0 Тогда
ОформлениеСтроки.ЦветТекста = ЦветПереотгруженныхЗаказов;
КонецЕсли;

КонецЦикла;
КонецПроцедуры

zetovich


ВыводимыеЗаказы = Новый Массив;
Для Каждого Строка Из ОформленияСтрок Цикл
ВыводимыеЗаказы.Добавить(Строка.ДанныеСтроки.Ссылка);
КонецЦикла;

ЗапросСостоянияЗаказа.УстановитьПараметр("ЗаказыПокупателя", ВыводимыеЗаказы);

заменить на:



ЗапросСостоянияЗаказа.УстановитьПараметр("ЗаказыПокупателя", ДанныеСтроки.ВыгрузитьКолнку("Ссылка"));
agav
Цитата(zetovich @ 13.08.09, 13:44) необходимо зарегистрироваться для просмотра ссылки


ВыводимыеЗаказы = Новый Массив;
Для Каждого Строка Из ОформленияСтрок Цикл
ВыводимыеЗаказы.Добавить(Строка.ДанныеСтроки.Ссылка);
КонецЦикла;

ЗапросСостоянияЗаказа.УстановитьПараметр("ЗаказыПокупателя", ВыводимыеЗаказы);

заменить на:



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


ДанныеСтроки это что??? Помоему Вы увлеклись.
zetovich
ой перепутал, нужно "ОформленияСтрок"...smile.gif
т.е.
ЗапросСостоянияЗаказа.УстановитьПараметр("ЗаказыПокупателя", ОформленияСтрок.ВыгрузитьКолнку("Ссылка"));
.........а мож в буфер не то скопировал...бывает.
agav
Цитата(zetovich @ 13.08.09, 15:10) необходимо зарегистрироваться для просмотра ссылки
ой перепутал, нужно "ОформленияСтрок"...smile.gif
т.е.
ЗапросСостоянияЗаказа.УстановитьПараметр("ЗаказыПокупателя", ОформленияСтрок.ВыгрузитьКолнку("Ссылка"));
.........а мож в буфер не то скопировал...бывает.


Было бы здорово, но так оно не работает. У объекта ОформленияСтрок есть только два метода "Получить()" и "Количество()".

От цикла здесь не отделаешься.
Batchir
А если попробывать что то типа Элемент.Значение.ВыгрузитьКолонку("Ссылка")?
agav
Цитата(Batchir @ 13.08.09, 16:25) необходимо зарегистрироваться для просмотра ссылки
А если попробывать что то типа Элемент.Значение.ВыгрузитьКолонку("Ссылка")?


Во-первых так невозможно, я когда-то для другой задачи хотел получить список отображенных на экране данных (с учетом отборов и периодов). Так вот, единственный метод это сделать -



ПостроительОтчета = Новый ПостроительОтчета;
ПостроительОтчета.ИсточникДанных = Новый ОписаниеИсточникаДанных(Элемент.Значение);
ПостроительОтчета.Выполнить();
ТаблицаРезультат = ПостроительОтчета.Результат.Выгрузить();


Во-вторых - объект ОформленияСтрок содержит список не всех строк, которые отображены в списке, а только тех, которые стали видимыми пользователю при текущем действии, т.е. если он нажал скролинг один раз, то этот объект будет содержать одну единственную строку - новую строчку вылзшую из невидимой области формы в видмую.
Никакой другой объект не может предоставить этих данных.
Scorpion9
Подскажите пожалуйста , как раскрасить мне строчки журнала:
Процедура СписокПриПолученииДанных(Элемент, ОформленияСтрок)
    //перем построитель,раскраска;

    // Вставить содержимое обработчика.

    СписокДокументов=Новый Массив;
    Для каждого ОформлениеСтроки из ОформленияСтрок Цикл
        СписокДокументов.Добавить(ОформлениеСтроки.ДанныеСтроки.Ссылка);    
    КонецЦикла;
    
    запрос=новый запрос;
       Запрос.Текст =
    "ВЫБРАТЬ
    |    ИСТИНА КАК Переносить,
    |    ВЫБОР
    |        КОГДА ЕСТЬNULL(ЗаказыПокупателейОстатки.КоличествоОстаток, 0) > 0
    |            ТОГДА ЗаказыПокупателейОстатки.КоличествоОстаток
    |        ИНАЧЕ 0
    |    КОНЕЦ КАК ЗаказыКоличество,
    |    ВЫБОР
    |        КОГДА ЕСТЬNULL(ТоварыВРезервеНаСкладахОстатки.КоличествоОстаток, 0) > 0
    |            ТОГДА ТоварыВРезервеНаСкладахОстатки.КоличествоОстаток
    |        ИНАЧЕ 0
    |    КОНЕЦ КАК РезервыКоличество,
    |    ВЫБОР
    |        КОГДА ЕСТЬNULL(РазмещениеЗаказовПокупателейОстатки.КоличествоОстаток, 0) > 0
    |            ТОГДА ИСТИНА
    |        ИНАЧЕ 0
    |    КОНЕЦ КАК РазмещенияКоличество,
    |    ВЫБОР
    |        КОГДА ЕСТЬNULL(РасчетыСКонтрагентамиОстатки.СуммаВзаиморасчетовОстаток, 0) > 0
    |            ТОГДА РасчетыСКонтрагентамиОстатки.СуммаВзаиморасчетовОстаток
    |        ИНАЧЕ 0
    |    КОНЕЦ КАК РасчетыОстаток,
    |    ДокументыЗаказПокупателя.Ссылка как документ,
    |    ДокументыЗаказПокупателя.Дата,
    |    ДокументыЗаказПокупателя.Номер,
    |    ДокументыЗаказПокупателя.Контрагент,
    |    ДокументыЗаказПокупателя.ДоговорКонтрагента,
    |    ДокументыЗаказПокупателя.КонтактноеЛицоКонтрагента,
    |    ДокументыЗаказПокупателя.Организация,
    |    ДокументыЗаказПокупателя.Подразделение,
    |    ДокументыЗаказПокупателя.СкладГруппа,
    |    ДокументыЗаказПокупателя.Ответственный,
    |    ДокументыЗаказПокупателя.СуммаДокумента как СуммаДокумента,
    |    ДокументыЗаказПокупателя.ВалютаДокумента,
    |    ДокументыЗаказПокупателя.ТипЦен,
    |    ДокументыЗаказПокупателя.ДатаОплаты,
    |    ДокументыЗаказПокупателя.ДатаОтгрузки,
    |    ДокументыЗаказПокупателя.УсловиеПродаж,
    |    ДокументыЗаказПокупателя.Грузополучатель,
    |    ДокументыЗаказПокупателя.ДисконтнаяКарта,
    |    ДокументыЗаказПокупателя.Проведен
    |ИЗ
    |    Документ.ЗаказПокупателя КАК ДокументыЗаказПокупателя
    |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ЗаказыПокупателей.Остатки КАК ЗаказыПокупателейОстатки
    |        ПО ДокументыЗаказПокупателя.Ссылка = ЗаказыПокупателейОстатки.ЗаказПокупателя
    |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.РасчетыСКонтрагентами.Остатки КАК РасчетыСКонтрагентамиОстатки
    |        ПО ДокументыЗаказПокупателя.Ссылка = РасчетыСКонтрагентамиОстатки.Сделка
    |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыВРезервеНаСкладах.Остатки КАК ТоварыВРезервеНаСкладахОстатки
    |        ПО ДокументыЗаказПокупателя.Ссылка = ТоварыВРезервеНаСкладахОстатки.ДокументРезерва
    |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.РазмещениеЗаказовПокупателей.Остатки КАК РазмещениеЗаказовПокупателейОстатки
    |        ПО ДокументыЗаказПокупателя.Ссылка = РазмещениеЗаказовПокупателейОстатки.ЗаказПокупателя
    |ГДЕ
    |    ДокументыЗаказПокупателя.Проведен
    |    И ДокументыЗаказПокупателя.СуммаДокумента > 0
    |
    |УПОРЯДОЧИТЬ ПО
    |    ДокументыЗаказПокупателя.Дата,
    |    ДокументыЗаказПокупателя.Номер";

    результат=запрос.Выполнить().Выбрать();
    пока результат.Следующий() цикл
    
    Если Раскраска Тогда
        Результат.Отбор.Документ.Значение.ЗагрузитьЗначения(СписокДокументов);
        Построитель.Выполнить();
        Выборка=Построитель.Результат.Выбрать();
    КонецЕсли;
    
    Если Выборка.НайтиСледующий(ОформлениеСтроки.ДанныеСтроки.Ссылка, "Документ") Тогда
      Если выборка.Расчетыостаток<>выборка.суммадокумента Тогда
          ОформлениеСтроки.ЦветТекста=WebЦвета.БледноЗеленый;
      КонецЕсли;
      Если выборка.Заказыколичество<>выборка.РазмещенияКоличество Тогда
           ОформлениеСтроки.ЦветТекста=WebЦвета.БледноЗолотистый;
      КонецЕсли;
      Если (выборка.Расчетыостаток<>выборка.суммадокумента)  И  (выборка.Заказыколичество<>выборка.РазмещенияКоличество) Тогда
           ОформлениеСтроки.ЦветТекста=WebЦвета.Голубой;
       КонецЕсли;
   Конецесли;
   конецЦикла;
КонецПроцедуры
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.