Имя: Пароль:
1C
 
Окраска строк в форме списка, обычные формы
0 bebibo
 
02.05.24
08:32
Всем здравствуйте! Подскажите как лучше сделать окрас строк в форме списка обычных форм? Нужно окрасить строки, по которым давно не было движений, условно 200 дней.
При открытии циклом проходить каждую номенклатуру и запросом получать сколько дней не было движений - будет очень долго.
А как по другому - не могу додумать. Подскажите, как бы Вы реализовали.
1 bebibo
 
02.05.24
08:47
(0) Или лучше добавить реквизит, его заполнить нужными данными, а потом просто проверять и окрашивать. Наверное это явно лучше, чем в цикле каждую но-ру проверять
2 Кондер
 
02.05.24
08:51
(1) лучше
3 Галахад
 
гуру
02.05.24
08:57
(1) Почему в цикле? Номенклатуру в список и проверять по списку.
Но с реквизитом будет конечно быстрее.
4 unbred
 
02.05.24
08:59
в чём отличие (1) от (0) ?
не вижу разницы.
в любом случае , если не демонический список, будешь в цикле окрашивать.

ТЗПокрасить = ЗапросКОстаткам();
ПриВыводеСТроки или ПриПолучениии (не знаю, где собрался свой код воткнуть)
Если ТЗПокрасить.НайтиСтроки() Тогда Покрасить()
5 Михаил Козлов
 
02.05.24
09:12
Я бы завел соответствие (ключ, видимо, ссылка на справочник),  в которое по мере необходимости (ПриПолучении) толкал флаг.
Может лучше отчетом?
6 bebibo
 
02.05.24
09:13
(4) Отличие в том, что в первом случае я по каждой номенклатуре ЗАПРОСОМ получаю количество дней без движений+окрашиваю. То есть 1 млн ном-ры - 1 млн запросов.
А во втором случае - я 1 раз запросом в колонку вывел данные по номенклатуре, а потом циклом просто окрашиваю.
7 bebibo
 
02.05.24
09:15
(4) Не могу понять где именно мне заполнять свой реквизит. Чтобы за один раз заполнить когда идет заполнение самой формы списка номенклатуры и в этот момент сразу заполнить свой реквизит
8 DJ Anthon
 
02.05.24
09:27
(2) ещё лучше - как в типовых, связанный регистр
(6) а вы уверены, что динамический список миллион номенклатуры сразу отображает?
(7) периодически изменяемая информация не должна находиться в справочниках, запомни. для этого есть регистры сведений. всё нормально и быстро связывается. обычно считается хорошим тоном сообщать платформу и конфигурацию.
9 lEvGl
 
гуру
02.05.24
09:27
(4) +1
пусть в памяти висит, когда надо обратился, опыт подтверждает оптимальность этого варианта
(7) чтобы что то заполнить, надо чтобы это что то было, а у вас этого нет. для такого варианта нужен реквизит в объекте, форма которого рисуется, либо список в обработке с табличной частью
10 Волшебник
 
02.05.24
09:27
Реквизит заполнять в событии ПриПолученииДанных. Можно завести кэш из Соответствия.
Окрашивать ПриВыводеСтроки (вызывается в цикле для каждой строки).
Проверка должна быть очень быстрой.
11 Asmody
 
02.05.24
09:28
(7) в ПриПолученииДанных() собираешь ссылки из ОформленияСтрок, делаешь по ним свой запрос, по нему там же красишь строки.
Ещё можно замутить какой-нибудь кеш, чтобы 2 раза не пересчитывать
12 lEvGl
 
гуру
02.05.24
09:30
(10)(11) это очень долго, будут тормоза. в случае с кэшем как минимум 1 раз для каждой позиции, пока кэш не заполнится
13 АнализДанных
 
02.05.24
09:31
(0)
1) Делаешь переменную формы "КэшТоварыБезДвижений" (тип соответствие)
2) В событие списка "ПриПолученииДанных" получаешь список товаров. Это событие вызывается при обновлении списка и содержит информацию о товарах, которые сейчас на экране пользователя + 30 строчек дополнительно (это чтобы не делать повторные запросы к базе, когда пользователь прокрутил список всего на одну позицию)
3) В этом же событии, по списку товаров из п.2 ищешь информацию в переменной "КэшТоварыБезДвижений", если в этом кэше каких-то позиций нет, то делаешь по ним запрос и добавляешь в кэш. Потом по данным из переменной кэш выводишь нужную информацию в оформление строк.

Так у тебя будут запросы не для каждой строки, а пакетно сразу для всех номенклатур, которые на экране. Плюс будет кэширование, если пользователь прокрутил список вниз, а потом вернулся наверх, то повторный запрос производится не будет. Из недостатков только, что пользователь будет видеть только закешированные данные, чтобы сбросить кэш надо или переоктрыть форму, или добавить кнопку "обновить", которая этот кэш очищает. Еще можно оповещение добавить, если пользователь провел документ, которые делает движения, то очищать кэш (но в этом случае только события текущего пользователя будут отслеживаться, параллельные записи в другом сеансе система не отловит)

Хороший пример есть на ИТС:
https://its.1c.ru/db/metod8dev/content/2805/hdoc
В этом примере Кэш не используется, там наверное более актуальные данные будут, но чаще запросы будут производится.
14 bebibo
 
02.05.24
09:32
Подскажите пожалуйста, где мне заполнить свой реквизит?
В процедуре "СписокПриПолученииДанных" - он уже заполнен.
Я хочу найти место где этот список заполняется, взять его, в запросе добавить свой реквизит и заполнить его, а потом загрузить это на форму. И далее уже циклом сделать окраску.
15 Asmody
 
02.05.24
09:33
(12) если нормально делать, тормозов не будет.
конечно, если там вычислений на 100 машиночасов, то лучше предрасчитанные данные где-то хранить. Если нужно просто вытащить готовую цифру, то будет нормально.
Главное - не пихать это в ПриВыводеСтроки
16 Asmody
 
02.05.24
09:34
(14) "В процедуре "СписокПриПолученииДанных" - он уже заполнен." - ты втираешь нам какую-то дичь
17 maxab72
 
02.05.24
09:34
(12) Не очень долго. При получении данных обрабатывается только часть списка номенклатуры. Если сделать правильный минимальный запрос (например проверять по регистру в модуле с полными правами, были ли записи за период от сегодня до -200 дней), тормозов практически не будет.
18 Волшебник
 
02.05.24
09:35
(12) Вы не понимаете, как работает кэш. Это ж кэш, а не запрос в цикле
19 lEvGl
 
гуру
02.05.24
09:40
(15)
не пихать это в ПриВыводеСтроки

это однозначно
при этом на налету ходить в регистр с движениями я бы не советовал. Как сейчас помню - нужно просто вывести в список подчиненную счет-фактуру к поступлению, это даже не движения из регистра вытаскивать - тормоза, слишком большая нагрузка при скроле списка. Но возможно это частный случай, пробовать надо
20 Волшебник
 
02.05.24
09:44
(19) в обычных формах вся раскраска сосредоточена в событии ПриВыводеСтроки
21 lEvGl
 
гуру
02.05.24
09:47
(17) (18) безусловно. приполученииданных, кэш - действенные средства оптимизации, но их недостаточно (бывает). Это даже больше грубые ошибки новичка - так не делать. Поэтому получить сразу все, чтобы висело готовое, и там искать при полученииданных
22 lEvGl
 
гуру
02.05.24
09:45
(20) ок
23 Asmody
 
02.05.24
09:54
Вот кусок рабочего кода:

Процедура СписокПриПолученииДанных(Элемент, ОформленияСтрок)
	МассивСсылок = РаботаСДиалогами.СсылкиВСпискеНаЭкране(ОформленияСтрок);
	ОбновитьКеш(МассивСсылок);
	
	Если Раскраска Тогда
		ВыборкаОплаченные = ПостроительЗапросаОплаченные.Результат.Выбрать();
	КонецЕсли;
	
	Для каждого ОформлениеСтроки Из ОформленияСтрок Цикл
		ДанныеСтроки = ОформлениеСтроки.ДанныеСтроки;
		Если Раскраска Тогда
			ВыборкаОплаченные.Сбросить();
			Если ВыборкаОплаченные.НайтиСледующий(ДанныеСтроки.Ссылка, "Сделка") Тогда
				Если ВыборкаОплаченные.ОплаченОтгружен Тогда
					ОформлениеСтроки.ЦветФона = РаскраскаЦвета.ОплаченОтгружен.ЦветФона;
				ИначеЕсли ВыборкаОплаченные.Оплачен Тогда
					ОформлениеСтроки.ЦветФона = РаскраскаЦвета.Оплачен.ЦветФона;
				ИначеЕсли ВыборкаОплаченные.Отгружен Тогда
					ОформлениеСтроки.ЦветФона = РаскраскаЦвета.Отгружен.ЦветФона;
				КонецЕсли;
			КонецЕсли;
		КонецЕсли;
	КонецЦикла; // ОформленияСтрок 
КонецПроцедуры
24 bebibo
 
02.05.24
13:07
(23) Вот эту строку не пойму: "МассивСсылок = РаботаСДиалогами.СсылкиВСпискеНаЭкране(ОформленияСтрок);"
Подскажите подробнее, пожалуйста
25 lEvGl
 
гуру
02.05.24
13:15
топик с таким резонансом был, а он на первой строчке застрял еее

бибобо, как так то
26 bebibo
 
02.05.24
13:18
(25) Да, что то туплю, всё понятно, но как получить массив ссылок моих - не знаю ,ох уж эти ОФ..Не понимаю как из оформлениеСтрок разом выгрузить мои ссылки
27 Мультук
 
гуру
02.05.24
13:22
(24)

Вероятно, там что-то вроде вот этого (см ниже)
Цель: получить массив ссылок, для дальнейшего вызова "ОбновитьКэш"
Вполне может быть есть еще условие на РАЗЛИЧНЫЕ


Функция СсылкиВСпискеНаЭкране(ОформленияСтрок)

   мас = Новый Массив;

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

   Возврат мас;
КонецФункции
28 lEvGl
 
гуру
02.05.24
13:24
(26) разом никак, вернее как, одним циклом, за раз его вызвав
29 ptiz
 
02.05.24
13:27
(26) При прокручивании списка порционно будет кэш обновляться.
30 ptiz
 
02.05.24
13:29
(0) Но в случае данной задачи надо поступить по-другому:
сделать кнопку "Раскрасить строки". Тогда тот, кому это действительно нужно - нажмет и получит данные сразу по всем товарам.
Кроме того, фраза "не было движений" - очень расплывчатая. Для одной организации/склада может и не было движений, а для другой - были.
31 lEvGl
 
гуру
02.05.24
13:32
та не, ну еще кнопку жать...(с) бух/мЕнеджер/юрист/***нист
32 bebibo
 
02.05.24
14:14
Не могу понять, почему на строке:
"Если МойМассивИзЗапроса.Найти(ДанныеСтроки.Ссылка) Тогда"
Возникает ошибка преобразование к типу булево не может быть выполнено?
МойМассивИзЗапроса - сначала был ТЗ
Сейчас переделал на массив, один фиг ошибка с преобразованием, почему?
33 bebibo
 
02.05.24
14:16
(32) МойМассивИзЗапроса  - массив
там находятся строки с номенклатурой
ДанныеСтроки.Ссылка - тоже ссылка на номенклатуру
не понимаю
34 bebibo
 
02.05.24
14:20
Ой, заработался, фигню написал..Проверяю в "Если" возвращаемый индекс)))
Ладно ,всем спасибо ,всё получилось!