Имя: Пароль:
1C
1С v8
получить строка[колонка.имя]
0 cent79
 
15.11.11
20:44
всем привет!
ситуация такая - имеется тз в которой точное имя колонок не известно (добавлял через цикл в зависимости от введенного пользователем)
в процессе работы добавляю в массив через Строка[Колонка.Имя] = Значение
вся проблема когда считываю в цикле
Для каждого Стр из тзСписок
 Для каждого Колонка из тзСписок.Колонки Цикл
   Область.Параметры.Цена = Стр[Колонка.Имя];
   Таблица.Присоединить(Область);
 КонецЦикла;
КонецЦикла;
так вот - если колонок больше 1 - то при выводе значения из всех предыдущих колонок пропадают остаются только в последней
причем в отладке значения в тзСписок есть - и через сообщить я их также получал... просто потом 1с их удаляет чтоли кто ее знает :)
в общем помогите плз понять в чем беда отчет горит :)
спасибо
1 andrewks
 
15.11.11
20:53
это не 1с их удаляет, а твой код
2 cent79
 
15.11.11
20:58
а где конкретно то?
3 Kreont
 
15.11.11
21:03
(0) Поставь в цикл еще строку для получения области
4 cent79
 
15.11.11
21:12
(3) пробовал не помогает
даже больше скажу - если создать к примеру 5 разных областей и каждый раз получать - в 4 предыдущих параметр очищается и остается только в последней...
мистика - я предполагаю что виновата строчка
Область.Параметры.Цена = Стр[Колонка.Имя];
но я не знаю как получить данные из тз если мне имя не известно )
искал по индексу - таже фигня )
5 kosts
 
15.11.11
21:22

Для ч=0 по тзСписок.Количество()-1 цикл
   Для ч1=0 по тзСписок.Колонки.Количество()-1 цикл
       тзСписок[ч][ч1] = Макет.ПолучитьОбласть("Строка|Колонка");
   КонецЦикла;
КонецЦикла;

Для ч=0 по тзСписок.Количество()-1 цикл
   Область = тзСписок[ч][0];
   Таблица.Вывести(Область);
   Для ч1=0+1 по тзСписок.Колонки.Количество()-1 цикл
       Область = тзСписок[ч][ч1];
       Таблица.Присоединить(Область);
   КонецЦикла;
КонецЦикла;
6 kosts
 
15.11.11
21:24
(5)Не лучше так

Если ч1 = 0 Тогда
   Таблица.Вывести(Область);
Иначе
   Таблица.Присоединить(Область);
КонецЕсли;
7 andrewks
 
15.11.11
21:28
(2) ты устанавливаешь параметр у одной и той же области макета
8 acsent
 
15.11.11
21:30
(7) А как же документы тогда печатаются, а отчеты выводятся?
9 andrewks
 
15.11.11
21:31
+(7) не, вру. надо подумать
10 cent79
 
15.11.11
21:48
(5) спасибо но не пашет
провел эксперимент
в цикле задал Область.Параметры.Парам = Колонка.Имя
присоединяет нормально ничего не пропадает )
мыслей нет - походу придется переделывать обрабатывая список параметров от пользователя по одному.
11 andrewks
 
15.11.11
21:55
(10) давай больше кода, где-то у тебя намучено в другом месте
12 cent79
 
15.11.11
22:21
эта функция создает тз с колонками куда закидывает цены

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

а эта функция обрабатывает полученный тз
       Таблица.НачатьАвтогруппировкуСтрок();
       Для Каждого Стр Из тзСписокТоваров Цикл
           Если Стр.ЭтоГруппа Тогда
               ИмяОбласти = Строка("Группа"+Стр.Уровень+"|Номенклатура");
               ОблГруппа = Макет.ПолучитьОбласть(ИмяОбласти);
               ОблГруппа.Параметры.ЦеноваяГруппа = Стр.Номенклатура;
               Таблица.Вывести(ОблГруппа, Стр.Уровень);
               ИмяОбласти = СтрЗаменить(ИмяОбласти, "Номенклатура", "ТипЦен");
               ОблГруппаТипЦен = Макет.ПолучитьОбласть(ИмяОбласти);                
               Для каждого Колонка из тзСписокТоваров.Колонки Цикл
                   НачалоИмени = Лев(Колонка.Имя, 2);
                   Если НачалоИмени = "ТЦ" Тогда
                       Таблица.Присоединить(ОблГруппаТипЦен, Стр.Уровень);
                   КонецЕсли;
               КонецЦикла;
           Иначе
               ОблТоварНоменклатура.Параметры.Ссылка = Стр.Номенклатура;
               Таблица.Вывести(ОблТоварНоменклатура, Стр.Уровень);
               Для каждого Колонка из тзСписокТоваров.Колонки Цикл
                   СтрЦена = 0;
                   НачалоИмени = ЛЕВ(Колонка.Имя, 2);
                   Если НачалоИмени = "ТЦ" Тогда
                       ОблТоварТипЦен.Параметры.Цена = Стр[Колонка.Имя];
                       ОблТоварТипЦен.Параметры.Ед = Стр.Ед;
                       Таблица.Присоединить(ОблТоварТипЦен, Стр.Уровень);
                   КонецЕсли;
               КонецЦикла;
           КонецЕсли;
       КонецЦикла;
       Таблица.ЗакончитьАвтогруппировкуСтрок();        

как то так :)
13 andrewks
 
15.11.11
22:42
эх и намучено у тебя.

проверь, перед формированием таблицы сделай тзСписокТоваров.ВыбратьСтроку() - действительно ли всё корректно в самой ТЗ?
14 cent79
 
15.11.11
22:46
(13) угу первое что проверил - через отладчик и через сообщить удостоверился что значения в строке содержатся
15 andrewks
 
15.11.11
22:48
ну не знаю, механизм рабочий, специально проверил

   Таб=Новый ТабличныйДокумент;
   Макет=ОбработкаОбъект.ПолучитьМакет("ТабОбн");
   Область1=Макет.ПолучитьОбласть("Строка|Колонка");
   Для каждого ТекКол Из СписФайлов.Колонки Цикл
       Область1.Параметры.Значение=ТекКол.Имя;
       Если (СписФайлов.Колонки.Индекс(ТекКол)=0) Тогда
           Таб.Вывести(Область1);
       Иначе
           Таб.Присоединить(Область1);
       КонецЕсли;
   КонецЦикла;
   
   Для каждого ТекСтр Из СписФайлов Цикл
       Для каждого ТекКол Из СписФайлов.Колонки Цикл
           Область1.Параметры.Значение=ТекСтр[ТекКол.Имя];
           Если (СписФайлов.Колонки.Индекс(ТекКол)=0) Тогда
               Таб.Вывести(Область1);
           Иначе
               Таб.Присоединить(Область1);
           КонецЕсли;
       КонецЦикла;
   КонецЦикла;
   
   Таб.ОтображатьСетку = Истина;
   Таб.Защита = Ложь;
   Таб.ТолькоПросмотр = Ложь;
   Таб.ОтображатьЗаголовки = Истина;
   Таб.Показать();



выводит всё корректно
16 cent79
 
15.11.11
22:53
(14) хм
я конечно втыкну в тз на заполненость ... но блин ...
17 cent79
 
15.11.11
23:32
проблема решена
всем спасибо
п.с. 4 часа кода и результат - я невнимательная обезьяна
Я не хочу быть самым богатым человеком на кладбище. Засыпать с чувством, что за день я сделал какую-нибудь потрясающую вещь — вот что меня интересует. Стив Джобс