Изменение фона строки в табличной части при выполнении запроса (ОБЫЧНАЯ ФОРМА).

1. ShuSU 52 12.04.19 07:11 Сейчас в теме
Всем форумчанам, Привет. Я начал активно изучать язык 1С, до недавних пор от практики на УФ пришлось перейти на ОФ. Начал писать обработку для загрузки из Екселя в С-ку накладных с учетом особенностей наших поставщиков. И на одном из шагов встала задача при поиске выводить данные и выделять их цветом. Вот с ЦветФона у меня и встала проблема. Как реализовать при Запросе выделять данные таблице.
Примеh моего Запроса поиска по Артикулу:

Процедура ПоискПоАртикул(Кнопка)
	Для Каждого СтрокаТ из Товары Цикл
		Запрос= Новый Запрос;
		Если НЕ ЗначениеЗаполнено(СтрокаТ.Номенклатура) И ЗначениеЗаполнено(СтрокаТ.АртикулПос) Тогда
			// Ищем по артикул
			ЗапросА = Новый Запрос;
			ЗапросА.УстановитьПараметр("ВыбАртикул", СтрокаТ.АртикулПос);
			ЗапросА.Текст ="ВЫБРАТЬ
							|	Номенклатура.Артикул,
							|	Номенклатура.Ссылка КАК Номенклатура
							|ИЗ
							|	Справочник.Номенклатура КАК Номенклатура
							|ГДЕ
							|	Номенклатура.Артикул ПОДОБНО &ВыбАртикул
							|	И НЕ Номенклатура.ЭтоГруппа";
						Выборка =  ЗапросА.Выполнить().Выбрать();
						Если Выборка.Следующий() Тогда
							СтрокаТ.Номенклатура=Выборка.Номенклатура;	
						КонецЕсли;
				КонецЕсли;
				
	КонецЦикла;
КонецПроцедуры
Показать
Прикрепленные файлы:
+
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. platonov.e 158 12.04.19 07:25 Сейчас в теме
В событии таблицы, при выводе строки напиши условия расцветки, а красить так:
ОформлениеСтроки.ЦветФона = Новый Цвет(217, 234, 211);
+
3. ShuSU 52 12.04.19 07:36 Сейчас в теме
(2)Я понял что нужно использовать ОформлениеСтроки.ЦветФона. Можно по подробнее пожалуйста. я еще с событиями не разобрался. Я так понимаю нужно дополнительную процедуру писать?
+
4. SedovSU@mail.ru 297 12.04.19 07:41 Сейчас в теме
(3) Событие у таблицы - процедуры ПриПолученииДанных или ПриВыводеСтроки. Да нужно дополнительно написать процедуру
+
5. platonov.e 158 12.04.19 07:49 Сейчас в теме
(3) у объектов есть события? знаешь? под свойствами. на каждое событие цепляется своя процедура. это в УФ тоже есть) вот там есть событие ПриВыводеСтроки. Кликаешь на лупу, он создает событие. Там и пишешь условие и раскраску.
Прикрепленные файлы:
+
6. ShuSU 52 12.04.19 08:00 Сейчас в теме
(5) да я понял. Но при ПриВыводеСтроки в таблицы Товары, в Процессе загрузки Ексельки окрашивается все.
а мне надо что бы только две ячейки в строке таблицы окрашивалось. И что бы это происходило при выполнение обхода запроса.


    Выборка =  ЗапросА.Выполнить().Выбрать();
                        Если Выборка.Следующий() Тогда
                            СтрокаТ.Номенклатура=Выборка.Номенклатура;  // ТОГДА ОКРАШИЛОСЬ  СтрокаТ.АртикулПос и СтрокаТ.Номенклатура
                        КонецЕсли;



вот в чем затык мой
+
7. platonov.e 158 12.04.19 08:04 Сейчас в теме
(6) так напишите условие в событии по которому должно окрашиваься
+
8. platonov.e 158 12.04.19 08:15 Сейчас в теме
(6)
ОформлениеСтроки.Ячейки.Колонка1.ЦветФона = Новый Цвет(217, 234, 211);


У вас ищдет поиск по артикулу. Допустим у вас там 3000 товаров. И вы хотите просто закрасить найденные позиции 3000?
+
11. ShuSU 52 12.04.19 08:29 Сейчас в теме
(8)Идея в том что, допустим загрузили 1000 строк в таблице. Сделали запрос по поиску Артикулов нашли 256 строк(тогда окрасились строка Артикул и строка Номенклатура). Дальше сделали запрос поиска по ШТ нашли 500 строк(тогда окрасили строку ШТ и строка Номенклатура). У нас осталось 244 строки неопределенных. при этом у нас нету в базе 256 ШТ и 500 артикулом не совпадает.
для этого и надо визуально показать результат запросов
+
12. platonov.e 158 12.04.19 08:35 Сейчас в теме
(11) Дак зачем тогда так мудрить? Вы ведь заполняете номенклатуру и штрихкод в цикле? Это и есть ваше условие. А при выводе строки пишите что если номенклатура заполнена, тогда покрасить

Процедура СписокПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
	Если ЗначениеЗаполнено(ДанныеСтроки.Номенклатура) Тогда
		ОформлениеСтроки.Ячейки.Номенклатура.ЦветФона = Новый Цвет(217, 234, 211);
	КонецЕсли;
КонецПроцедуры
+
13. ShuSU 52 12.04.19 08:39 Сейчас в теме
(12)это и так видно так как пусть. А в моей "Мудроте" смысл в том, чтобы видно было что надо дополнить или обновить в базу )))
плюс бывает что поставщик в одну колонку впихивает 2 или 3 штрихкода. вот и надо понять что есть новые ШТ и надо добавить в базу.
+
14. platonov.e 158 12.04.19 09:00 Сейчас в теме
(13) так чем мой пример не подходит я так и не понял?
+
16. ShuSU 52 12.04.19 09:28 Сейчас в теме
(12)50% решает. но блин правило добавить ((

Процедура СписокПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
    Если ЗначениеЗаполнено(ДанныеСтроки.Номенклатура) Тогда
        ОформлениеСтроки.Ячейки.Номенклатура.ЦветФона = Новый Цвет(217, 234, 211);
        если ЗапросА тогда  // как обратиться в типу запроса
                ОформлениеСтроки.Ячейки.АртикулПос.ЦветФона = Новый Цвет(217, 234, 211);
        иначе если ЗапросШ тогда // как обратиться в типу запроса 
                   ОформлениеСтроки.Ячейки.ШтрихКод.ЦветФона = Новый Цвет(217, 234, 211); 
                   КонецЕсли;
        КонецЕсли;
КонецЕсли;
КонецПроцедуры
Показать
+
17. platonov.e 158 12.04.19 09:35 Сейчас в теме
(16) не в коем случае при выводе строки не делайте запросы!!!!!!это нужно выбить на скрижали!
Зачем они вам там?
+
18. ShuSU 52 12.04.19 09:45 Сейчас в теме
(17) я не так выразился. как обратиться к процедуре нажатия кнопки.
ОформлениеСтроки.Ячейки.Номенклатура.ЦветФона = Новый Цвет(217, 234, 211);
ОформлениеСтроки.Ячейки.АртикулПос.ЦветФона = Новый Цвет(217, 234, 211);
или
ОформлениеСтроки.Ячейки.Номенклатура.ЦветФона = Новый Цвет(217, 234, 211);
ОформлениеСтроки.Ячейки.ШтрихКод.ЦветФона = Новый Цвет(217, 234, 211);
+
19. platonov.e 158 12.04.19 09:51 Сейчас в теме
(18) ??? Какой кнопки? Вызвать процедуру которая вызывает кнопка при нажатии.
+
10. platonov.e 158 12.04.19 08:22 Сейчас в теме +0.01 $m
(6) Я правильно понимаю, что вы хотите закрасить ячейки, позиции которых уже созданы в 1с? Т.е. показать что в 1с такая номенклатура уже создана?
+
9. Timic 50 12.04.19 08:18 Сейчас в теме
Добрый день. Выполнение запроса при выводе строки - плохая практика, т.к. запрос выполнится столько раз сколько строк видно на экране. Это существенно скажется на работе с таблицей. По возможности лучше вообще обойтись без запроса, в противном случае вам нужно использовать событие ПриПолученииДанных(<ОформленияСтрок>). В параметре обработчика события коллекция оформлений строк. Каждое оформление строки содержит данные строки. Сначала и данных строк формируете массив, который передаете в запрос чтобы получить результат запроса сразу по всем видимым на экране строкам.
Чтобы оформить одну ячейку в оформлении строки есть свойство Ячейки. Это коллекция оформления ячеек (Описание: Определяет оформление ячейки табличного поля. Используется для определения свойства Ячейки объекта ОформлениеСтроки). Посмотрите подробнее в синтаксис-помощнике
+
15. alalexmix 25 12.04.19 09:13 Сейчас в теме
(9) Поддерживаю, лучше

ПриПолученииДанных:
-------------------------------

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

	// далее запрос на получение требуемых данных
	// ...
	// по Выборке.Следующий() - формирование "Соответствия" - быстрая коллекция,
	// где "Ключ" - ссылка на номенклатуру, а "Значение" - например "Структура" (для каждого значения номенклатуры - необходимо всегда новая Структура, иначе будет переопределять последним набором данных)
	//  - желательно выполнять на стороне сервера и вернуть "Соответствие"
	// Возврат СоответствиеПоНоменклатуре = Новый Соответствие;

	Для Каждого СтрокаТабличногоПоля Из ОформленияСтрок Цикл
		ДанныеСтроки = СтрокаТабличногоПоля.ДанныеСтроки;
        // Получение требуемых данных
		СтруткураДанныхНоменклатуры = СоответствиеПоНоменклатуре.Получить(ДанныеСтроки.Номенклатура);
		Если НЕ СтруткураДанныхНоменклатуры = Неопределено Тогда
			
			// Здесь можно поставить условие, если "да", то..., иначе - "нет"

			// как установить текст
	        СтрокаТабличногоПоля.Ячейки.Артикул.УстановитьТекст(СтруткураДанныхНоменклатуры.Артикул);
	        // как установить цвет фона ячейки
			СтрокаТабличногоПоля.Ячейки.Артикул.ЦветФона = Новый Цвет(255, 248, 220);
			// ...
		КонецЕсли;
	КонецЦикла;
Показать
+
20. oleg-x 26 12.04.19 10:57 Сейчас в теме
Самый быстрый вариант будет, если добавить еще одну колонку с признаком для раскраски. Туда при заполнение таблицы прописывать признак (1,2,3 или название цветов) для цвета и красить при выводе строки по этому признаку.
+
21. ShuSU 52 12.04.19 13:54 Сейчас в теме
(20)Принципе да. Это близко к тому что я задумал. но упираюсь именно в распознование признака. то есть определение что иммено по ШТ или Артиклу нашлось.
даже было бы хорошо если бы все строка таблицы раскрасились в синий если нашлась по ШТ, а в зеленый если бы по Артикула.
+
23. user995537 38 14.04.19 17:12 Сейчас в теме
(21)Я правильно понял, нужно наложить цветовой фильтр и дать возможность пользователю им управлять? Можно в таблицу значений добавить колонку "Фильтр" с типом - например строка, процедура или функция, которая будет заниматься наложением фильтров, в эту колонку будет писать: "синий", "зеленый", "нетцвета". А в процедуру ПриВыводеСтроки или ПриПолученииДанных просто условие Если ДанныеСтроки.Фильтр = "синий" Тогда ... и далее то что нужно сделать по каждому из условий.
+
24. oleg-x 26 15.04.19 01:23 Сейчас в теме
(23) Не правильно. Нужно что бы раскрасилось в зависимости от заполнения таблицы
+
22. meriferi 14.04.19 12:40 Сейчас в теме
Раскрашивать нужно в ПриПолученииДанных, чтобы раскраска происходила не каждый раз, при изменении строки.
+
Внимание! Тема сдана в архив

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот