Имя: Пароль:
1C
1С v8
Получение данных строк Табличного поля
, ,
0 Валидатор
 
02.12.13
12:52
Есть справочник номенклатура, у которого есть форма списка, на которой есть табличное поле: список. вот как мне циклом обойти все строки этого Списка? для каждого строка из ЭлементыФормы.Список. тут что только не ставил, не обходит все равно(
1 Валидатор
 
02.12.13
12:54
обычные формы
2 roman844
 
02.12.13
12:58
а для чего ты хочешь обойти этот список??? может просто тупо запрос к справочнику сделать.
3 Валидатор
 
02.12.13
12:59
(2) у каждого из элемента есть поле с числовым типом, и если допустим чилсо в этом поле от 1 до 10, то красить строку в красный цвет
4 Wobland
 
02.12.13
13:01
Процедура СоставПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
    Если ДанныеСтроки.ОсновноеСырьё Тогда
        ОформлениеСтроки.Шрифт=Новый Шрифт(ОформлениеСтроки.Шрифт, , , Истина);
    КонецЕсли;
КонецПроцедуры
5 х86
 
02.12.13
13:01
(4)приПолученииДанных
6 roman844
 
02.12.13
13:01
Процедура ДокументСписокПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
ОформлениеСтроки.ЦветФона = Новый Цвет(255, 0, 0);       //красный
КонецПроцедуры
7 Валидатор
 
02.12.13
13:03
Там просто дополнительное условие есть, как раскрасить строку я знаю, просто цвет берется из РС, в котором следующие измерения:
От
До
Цвет (перечисление)
То есть зашел я в РС, написал что от 1 до 10 цвет красный
Потом зашел в карточку номенклатуры, и в нужный реквизит написал 9, записал карточку, и строка в форме списка покрасилась красным
8 х86
 
02.12.13
13:11
(7)при начале работы системы таблицу цветов из РС пишешь в ТЗ типа кеша
при получении данных раскрашиваешь
9 Валидатор
 
02.12.13
13:16
(8) в общих модулях при начале работы системы? писать запрос, и грузить в ТЗ результат запроса по цветам?
10 Валидатор
 
02.12.13
13:16
(8) так а если у меня есть 5 цветов, пользователь открыл РС, добавил 6й цвет, получается, чтобы строки раскрасились, ему перезаодить опять придется?
11 Валидатор
 
02.12.13
13:22
И если обходить 2мя циклами, первый:
Получаем наш РС, пихаем его в ТЗ
второй: получаем наш список номенклатуры
Для каждого СтрокаПервый из Первый Цикл

Для каждого СтрокаВторой из Второй Цикл


КонецЦикла;
КонецЦикла;
тут только будет проблема, в первом цикле у нас в ТЗ имеется 3 цвета, то есть 3 раза только ведь цикл пройдется?
12 roman844
 
02.12.13
13:24
(11) второй цикл ненужен
13 roman844
 
02.12.13
13:25
Получаешь ТЗ из РС - Цвета
потом в процедурах ПриВыводеСтроки() или ПриПолученииДанных() по условиям раскрашиваешь свои строки.
14 Валидатор
 
02.12.13
13:28
(13)
получаю запрос для цвета:
Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
     |    ттЦвета.ИнтервалОт,
     |    ттЦвета.ИнтервалДо,
     |    ттЦвета.Цвет
     |ИЗ
     |    РегистрСведений.ттЦвета КАК ттЦвета";
    
    Результат = Запрос.Выполнить();
    ДанныеПоЦветамРС = Результат.Выгрузить();

Вот как мне потом получить строку, чтобы проверить ее на условие?
15 Валидатор
 
02.12.13
13:34
Для Каждого Строка из Элемент.ТекущиеДанные Цикл
так получается?
16 Валидатор
 
02.12.13
13:36
Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
     |    ттЦвета.ИнтервалОт,
     |    ттЦвета.ИнтервалДо,
     |    ттЦвета.Цвет
     |ИЗ
     |    РегистрСведений.ттЦвета КАК ттЦвета";
    
    Результат = Запрос.Выполнить();
    ДанныеПоЦветамРС = Результат.Выгрузить();
    
        
    Для Каждого Строка из Элемент.ТекущиеДанные Цикл

КонецЦикла

вот как в условии цикла проверять данные текущихданных на условие соответствия запроса? ведь для ТЗ тоже нужно будет цикл писать?
17 roman844
 
02.12.13
13:37
а метод Найти() или НайтиСтроки() для ТЗ не предлагать???
18 Валидатор
 
02.12.13
13:40
(17) блин, что не так ищу? по сп вроде верно все
Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
     |    ттЦвета.ИнтервалОт,
     |    ттЦвета.ИнтервалДо,
     |    ттЦвета.Цвет
     |ИЗ
     |    РегистрСведений.ттЦвета КАК ттЦвета";
    
    Результат = Запрос.Выполнить();
    ДанныеПоЦветамРС = Результат.Выгрузить();
    
    СтрокаОт  = ДанныеПоЦветамРС.Найти(ДанныеПоЦветамРС.ИнтервалОТ, "ИнтервалОТ");
    СтрокаПДо = ДанныеПоЦветамРС.Найти(ДанныеПоЦветамРС.ИнтервалДо, "ИнтервалДо");
    СтрокаЦвет = ДанныеПоЦветамРС.Найти(ДанныеПоЦветамРС.Цвет, "Цвет");
19 Wobland
 
02.12.13
13:42
(18) _что_ ты ищешь?
20 Валидатор
 
02.12.13
13:44
(19) хочу найти строки, чтобы не писать цикл для ТЗ
21 Wobland
 
02.12.13
13:49
(20) что в строках ты хочешь найти?
22 Валидатор
 
02.12.13
13:51
(21) сделаем так:
1. у меня есть результат запрос в ТЗ, в котором указаны цвета и интервалы, при которых задаются цвета:
Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
     |    ттЦвета.ИнтервалОт,
     |    ттЦвета.ИнтервалДо,
     |    ттЦвета.Цвет
     |ИЗ
     |    РегистрСведений.ттЦвета КАК ттЦвета";
    
    Результат = Запрос.Выполнить();
    ДанныеПоЦветамРС = Результат.Выгрузить();

2. Дальше в процедуре ПриПолученииДанных я хочу проверить, если у строки в реквизите размер скидки есть число, которое входит в один из интервалов поиска моей ТЗ, то красим выбранную строку в цвет соответствующий
23 Валидатор
 
02.12.13
13:52
(21) то есть
в ТЗ мы имеем:
1. от 10 до 20 красный
2. от 15 до 30 зеленый
3. от 40 до 50 желтый

смотрим номенклатуру, у нее в поле размер скидки указано 16, значит строка в форме списка номенклатуры должна вся стать красной
24 roman844
 
02.12.13
13:53
под цифрой 2 ошибка, иначе перекрываются отборы
25 Wobland
 
02.12.13
13:53
(23) а я за зелёный
26 Валидатор
 
02.12.13
13:53
(23) пардон, скидки не могут пересекаться, то есть где зеленый цвет там от 21 до 30)
27 roman844
 
02.12.13
13:53
*интервалы
28 Wobland
 
02.12.13
13:53
(26) ну так что ты будешь искать в ТЗ?
29 Валидатор
 
02.12.13
13:54
(28) ну мне из ТЗ соответствия нужно брать для условий, я так полагаю
30 Wobland
 
02.12.13
13:54
(29) что искать?
31 Валидатор
 
02.12.13
13:55
(28) то есть у меня в ТЗ есть от 1 до 10
я в процедуре приполученииданных проверяю
Если Строка.РазмерСкидки > От и Строка.РазмерСкидки < ДО Тогда
Красим строку
КонецЕсли
32 Wobland
 
02.12.13
13:56
Строка.РазмерСкидки будешь искать в ТЗ?
33 Валидатор
 
02.12.13
13:57
(32) нет, размер скидки ищу у Элемент.ТекущиеДанные
34 roman844
 
02.12.13
13:58
как вариант можно в ПриПолученииДанных в запрос вставлять парамеры своих ОТ и ДО и получать цвет и сразу окрашивать
35 Wobland
 
02.12.13
13:59
(34) один запрос лучше двух
36 Валидатор
 
02.12.13
13:59
(33) Элемент.ТекущаяСтрока.РазмерСкидки тут точнее
37 roman844
 
02.12.13
14:00
(35) и это правильно, просто хочу помочь человеку хоть как то решить задачу, ну а дальше я думаю он найдет истинное решение :)
38 Wobland
 
02.12.13
14:01
(36) ты хочешь найти в ТЗ строку, От которой больше твоего размера, и До которой меньше. так?
39 Wobland
 
02.12.13
14:01
(37) он и без нас хоть как-то делает. пусть хоть на мисте видит, как правильно ;)
40 Валидатор
 
02.12.13
14:03
(38) ну да, у меня данные в реквизите номенклатуры -15, а в ТЗ от 1 до 20, то есть 15 попадает в интервал, значит красим в цвет, который у нас для этого интервала (1-20) задан
41 Wobland
 
02.12.13
14:04
(40) дальше сам?
42 Валидатор
 
02.12.13
14:04
ВЫБРАТЬ
    ттЦвета.ИнтервалОт,
    ттЦвета.ИнтервалДо,
    ттЦвета.Цвет
ПОМЕСТИТЬ &Цвета
ИЗ
    РегистрСведений.ттЦвета КАК ттЦвета
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Номенклатура.РазмерСкидки,
    Номенклатура.Ссылка,
    Цвета.ИнтервалОт,
    Цвета.ИнтервалДо,
    Цвета.Цвет
ИЗ
    &Цвета КАК Цвета,
    Справочник.Номенклатура КАК Номенклатура

вот как мне связать справочник и РС которые никак не связаны вообще
43 Валидатор
 
02.12.13
14:05
(41) ничего нового по моей пробелмы как то я не увидел) все то, что было сделано так и осталось) вопрос как раскрашивать еще актуален)
44 Wobland
 
02.12.13
14:06
тогда (34)
45 Валидатор
 
02.12.13
14:07
(44) так а какие параметры я туда передам? запустался вообще блин короче
46 Wobland
 
02.12.13
14:08
Элемент.ТекущаяСтрока.РазмерСкидки?
47 х86
 
02.12.13
14:10
(43)поищи в типовых с толстым клиентом по приПолученииДанных
48 Валидатор
 
02.12.13
14:11
(46) как то так?
Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
                   |    ттЦвета.ИнтервалОт,
                   |    ттЦвета.ИнтервалДо,
                   |    ттЦвета.Цвет
                   |ПОМЕСТИТЬ Цвет
                   |ИЗ
                   |    РегистрСведений.ттЦвета КАК ттЦвета
                   |ГДЕ
                   |    ттЦвета.ИнтервалОт = &ИнтервалОт
                   |    И ттЦвета.ИнтервалДо = &ИнтервалДо
                   |;
                   |
                   |////////////////////////////////////////////////////////////////////////////////
                   |ВЫБРАТЬ
                   |    Номенклатура.РазмерСкидки,
                   |    Номенклатура.Ссылка,
                   |    Цвета.ИнтервалОт,
                   |    Цвета.ИнтервалДо,
                   |    Цвета.Цвет
                   |ИЗ
                   |    Цвет КАК Цвета,
                   |    Справочник.Номенклатура КАК Номенклатура";
                  
                   Запрос.УстановитьПараметр("ИнтервалОт",Элемент.ТекущаяСтрока.РазмерСкидки);
                   Запрос.УстановитьПараметр("ИнтервалДо",Элемент.ТекущаяСтрока.РазмерСкидки);
                  
                   Результат = Запрос.Выполнить();
                   ДанныеПоЦветам = Результат.Выгрузить();
49 Wobland
 
02.12.13
14:13
нет
50 Валидатор
 
02.12.13
14:13
(48) теперь запрос вообще ничего не возвращает
51 Валидатор
 
02.12.13
14:13
(49) а как тогда?
52 Wobland
 
02.12.13
14:14
ещё разок
найти в ТЗ или в регистре строку, От которой больше твоего размера, и До которой меньше
53 Валидатор
 
02.12.13
14:15
(52) так это же не в запросе тогда нужно делать?
54 Валидатор
 
02.12.13
14:15
точснее это в параметры надо походу указать
55 Валидатор
 
02.12.13
14:16
(54) или нет...(((
56 Валидатор
 
02.12.13
14:19
Тогда запрос нужен получается только на РС что ли? оО
57 Wobland
 
02.12.13
14:23
вижу проблески мыслительных процессов ;)
58 Валидатор
 
02.12.13
14:25
(57) да уже мозг кипит, ну сделал я запрос к РС:
Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
                   |    ттЦвета.ИнтервалОт,
                   |    ттЦвета.ИнтервалДо,
                   |    ттЦвета.Цвет
                   |ИЗ
                   |    РегистрСведений.ттЦвета КАК ттЦвета
                   |ГДЕ
                   |    ттЦвета.ИнтервалОт > &ИнтервалОт
                   |    И ттЦвета.ИнтервалДо < &ИнтервалДо";
                  
                   Запрос.УстановитьПараметр("ИнтервалОТ", Элемент.ТекущаяСтрока.РазмерСкидки);
                   Запрос.УстановитьПараметр("ИнтервалДо", Элемент.ТекущаяСтрока.РазмерСкидки);

    
    Результат = Запрос.Выполнить();
    ДанныеПоЦветамРС = Результат.Выгрузить();

тут пока правильно?)))
59 Валидатор
 
02.12.13
14:26
хотя нетЮ не правильно
60 Wobland
 
02.12.13
14:30
Если бы я владел знанием, то шел бы по большой дороге. Единственная
вещь, которой я боюсь, - это узкие тропинки. Большая дорога совершенно
ровна, но народ любит тропинки.
61 Валидатор
 
02.12.13
14:35
с Запросом разобрался:
Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
                   |    Номенклатура.Ссылка,
                   |    Номенклатура.РазмерСкидки
                   |ПОМЕСТИТЬ ТабНоменклатура
                   |ИЗ
                   |    Справочник.Номенклатура КАК Номенклатура
                   |;
                   |
                   |////////////////////////////////////////////////////////////////////////////////
                   |ВЫБРАТЬ
                   |    ТабНоменклатура.Ссылка,
                   |    ТабНоменклатура.РазмерСкидки,
                   |    ЕСТЬNULL(ттЦвета.Цвет, ""нету цвета для такого интервала"") КАК Цвет
                   |ИЗ
                   |    ТабНоменклатура КАК ТабНоменклатура
                   |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ттЦвета КАК ттЦвета
                   |        ПО ТабНоменклатура.РазмерСкидки >= ттЦвета.ИнтервалОт
                   |            И ТабНоменклатура.РазмерСкидки <= ттЦвета.ИнтервалДо";
                  
    
    Результат = Запрос.Выполнить();
    ДанныеПоЦветамРС = Результат.Выгрузить();

как теперь сделать, чтобы они красились? циклом обходим запрос, и красим строки?
62 Kondarat
 
02.12.13
14:45
Процедура СписокПриПолученииДанных(Элемент, ОформленияСтрок)
    МассивНоменклатуры = Новый Массив;
    Для каждого ОформлениеСтроки Из ОформленияСтрок Цикл
        МассивНоменклатуры.Добавить(ОформлениеСтроки.ДанныеСтроки.Номенклатура);
    КонецЦикла;
    
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
                   |    Номенклатура.Ссылка,
                   |    Номенклатура.РазмерСкидки
                   |ПОМЕСТИТЬ ТабНоменклатура
                   |ИЗ
                   |    Справочник.Номенклатура КАК Номенклатура
                   |ГДЕ
                   |    Номенклатура В (&МассивНоменклатуры)
                   |;
                   |
                   |////////////////////////////////////////////////////////////////////////////////

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

КонецПроцедуры
63 Валидатор
 
02.12.13
14:53
(62) поле не найдено ругается :
|    Номенклатура В (&МассивНоменклатуры) вот тут
64 Kondarat
 
02.12.13
14:55
|    Номенклатура.Ссылка В (&МассивНоменклатуры)
65 Валидатор
 
02.12.13
14:58
(64)  Для каждого ОформлениеСтроки Из ОформленияСтрок Цикл
        МассивНоменклатуры.Добавить(ОформлениеСтроки.ДанныеСтроки.Номенклатура);
    КонецЦикла;
тут он отбирает как группы еще, а как узазать, чтобы без групп было? в запросах ЭтоГруппа = Ложь, а тут?
66 Kondarat
 
02.12.13
15:00
Для каждого ОформлениеСтроки Из ОформленияСтрок Цикл
        Номенклатура = ОформлениеСтроки.ДанныеСтроки.Номенклатура;
        Если НЕ Номенклатура.ЭтоГруппа() Тогда
            МассивНоменклатуры.Добавить(Номенклатура);
        КонецЕсли;    
    КонецЦикла;
67 Валидатор
 
02.12.13
15:02
и еще вопрос, когда мы присваиваем цвет:
ОформлениеСтроки.ЦветТекста = НайденнаяСтрока.Цвет;
у нас в Цветтекста тип - цвет
а в найденная строка цвет - перечисления, поэтому цвет не пишется, как из перечисления сделать цвет? с преобразованием в строки и числа понятно, а вот с цветами нет(
68 Kondarat
 
02.12.13
15:07
Создай соответствие цветов
69 Валидатор
 
02.12.13
15:09
(68) так а тип то как потом присвоить? какой фуункцией?
70 Kondarat
 
02.12.13
15:12
Ну типа:

    СоответствиеЦветов = Новый Соответствие();
    СоответствиеЦветов.Вставить(Перечисления.НаборЦветов.Красный, Новый Цвет(255,0,0));
    СоответствиеЦветов.Вставить(Перечисления.НаборЦветов.Черный, Новый Цвет(0,0,0));



Потом:

        Если НайденнаяСтрока<>Неопределено Тогда
            ЦветСтроки = СоответствиеЦветов.Получить(НайденнаяСтрока.Цвет);
            ОформлениеСтроки.ЦветТекста = ЦветСтроки;            
        КОнецЕсли;
71 Валидатор
 
02.12.13
15:16
а в 1ске самой хранятся коды для сопоставлений? типа вон 255 0 0 и тд?
72 Валидатор
 
02.12.13
15:18
все, нашел, спс
73 Валидатор
 
02.12.13
15:22
{Справочник.Номенклатура.Форма.ФормаСписка.Форма(909)}: Метод объекта не обнаружен (ЭтоГруппа)
        Если НЕ Номенклатура.ЭтоГруппа() Тогда
почему летит ошибка?
74 Валидатор
 
02.12.13
15:23
и когда я снимаю, к примеру просмотр иерархический, валится ошибка теперь: {Справочник.Номенклатура.Форма.ФормаСписка.Форма(958)}: Ошибка при установке значения атрибута контекста (ЦветТекста)
            ОформлениеСтроки.ЦветТекста = ЦветСтроки;              
по причине:
Несоответствие типов
хоть и задал соответствие
75 Валидатор
 
02.12.13
15:24
(74) исправил, спс всем, вроде работает
76 Wobland
 
02.12.13
15:59
я так и знал, что нужно больше молчать ;)
77 hhhh
 
02.12.13
16:22
(76) всё-таки думаю, что он на четырех форумах этот вопрос задал. Где-то раньше ответили, на остальных написал: всё сделал, спс.