Имя: Пароль:
1C
1C 7.7
v7: ТабличноеПоле: Вылетает 1С при исполнении метода "ПриВыбореФлажка"
,
0 Zhuravlik
 
18.11.12
19:49
Добрый вечер. Помогите с табличным полем, пожалуйста, вот код как я его создаю:


//====================================================
Процедура ФормаПриСоздании(_Форма)

   ТП=_Форма.СоздатьЭлементУправления("ТабличноеПоле", Форма.ТаблПоле_);
   ТП.ПоставщикДанных=СоздатьОбъект("ПоставщикДанныхИТ");
   ТП.ПоставщикДанных.ИндексированнаяТаблица = тзПоставщикДанных;
   
   ТП.ФиксацияСлева = 1;
   ТП.СтильЗаголовков = 1;
   ТП.РежимВыделенияСтроки = 2;
   ТП.ЦветФонаВыделения2 = глПолучитьЦвет(231, 234, 254);    
   
   тзПодвал = СоздатьОбъект("ТаблицаЗначений");
   тзПодвал.НоваяСтрока();
   тзПодвал.НоваяСтрока();
   
   тзПодвал.НоваяКолонка("Флажок");
   тзПодвал.УстановитьЗначение(1, "Флажок", "Выбрано: ");
   тзПодвал.УстановитьЗначение(2, "Флажок", тзПоставщикДанных.Итог("Флажок"));
   
   тзПодвал.НоваяКолонка("НомСтр");
   тзПодвал.УстановитьЗначение(1, "НомСтр", "Всего строк: ");
   тзПодвал.УстановитьЗначение(2, "НомСтр", тзПоставщикДанных.КоличествоСтрок());    
   
   Для счКол=1 По тзПоставщикДанных.КоличествоКолонок() Цикл    
       
       ИмяКол = тзПоставщикДанных.ИмяКолонки(счКол);
       Зг = ИмяКол;

       ТП.Колонки.Добавить(ИмяКол).Данные = ИмяКол;
       ТП.Колонки.Получить(ИмяКол).Заголовок = Зг;
       
       Если ИмяКол = "НомСтр" Тогда
           ТП.Колонки.Получить(ИмяКол).ЗнакУпорядочивания = 1;
       КонецЕсли;
       
       Если счКол < 3 Тогда
           Продолжить;
       КонецЕсли;
       
       тзПодвал.НоваяКолонка(ИмяКол);
       
       Итог = тзПоставщикДанных.Итог(ИмяКол);
       
       Если Итог > 0 Тогда        
           тзПоставщикДанных.ДобавитьИндекс("_" + ИмяКол, "Флажок, " + ИмяКол, 0);    
           зн_Имя = "Итого:";
           зн = Итог;
       Иначе
           //Здесь показываю количество уникальных элементов            
           зн_Имя = "Всего значений: ";
           тзПоставщикДанных.ДобавитьИндекс("_у" + ИмяКол, "Флажок, " + ИмяКол, 1);
           тзПоставщикДанных.ДобавитьИндекс(ИмяКол, ИмяКол, 1);
           
           зн = тзПоставщикДанных.КоличествоСтрок(ИмяКол);
       КонецЕсли;                

       тзПодвал.УстановитьЗначение(1, ИмяКол, зн_Имя);
       тзПодвал.УстановитьЗначение(2, ИмяКол, зн);        
       
   КонецЦикла;

   ТП.Подвал.ПоставщикДанных = СоздатьОбъект("ПоставщикДанныхТЗ");
   ТП.Подвал.ПоставщикДанных.УстТаблицуЗначений(тзПодвал);        
   ТП.Подвал.ЦветФона = глПолучитьЦвет(254, 253, 194);
   
   
   ТП.ОбновитьСтроки();
   ТаблПоле_ПриАктивизацииКолонки(ТП);

КонецПроцедуры


Вот процедура, ПриВыбореФлажка, если выбираю несколько элементов - то 1С вылетает:

//====================================================
Процедура ТаблПоле_ПриВыбореФлажка(ТП, НомерСтроки, Колонка, ТипРегиона, ФлагВыбора)
   
   зн = 1 - тзПоставщикДанных.ПолучитьЗначение(НомерСтроки, "Флажок");
   тзПоставщикДанных.УстановитьЗначение(НомерСтроки, "Флажок", зн);
   
   
   ТП.ОбновитьСтроки();
   
   ИТ_флажок = тзПоставщикДанных.Итог("Флажок");
   
   тзПодвал.УстановитьЗначение(1, "Флажок", "Выбрано: ");
   тзПодвал.УстановитьЗначение(2, "Флажок", ИТ_флажок);    
   
   ТП.Подвал.ОбновитьСтроки();
   
КонецПроцедуры
1 oslokot
 
18.11.12
20:25
двойной вызов ОбновитьСтроки()
у мена тоже при этом падала
2 Zhuravlik
 
18.11.12
20:27
(1) Без обновления строк подвала тоже вылетает.
3 Zhuravlik
 
18.11.12
20:28
(1) + Даже убираю вообще ОбновитьСтроки, и натыкиваю по флажкам - вылет.
4 oslokot
 
18.11.12
20:31
странно, лови отладчиком в процедуре...
другого на ум ничего не приходит

п.с.
у меня такая же задача - не падает
правда содержимое проц ПриВыбореФлажка проще
5 Zhuravlik
 
18.11.12
20:33
(4) А как вы в поставщик данных устанавливаете текущее значение флага? Мне кажется, у меня тут куда уж проще...
6 oslokot
 
18.11.12
20:36
не помню, завтра на работе посмотрю. я дома на выходных изолирован от 1с :)
7 oslokot
 
18.11.12
20:39
Завтра, я думаю, ADirks подтянется, подскажет. Он разработчик
8 Zhuravlik
 
18.11.12
20:41
Буду ждать тогда, спасибо за беспокойство. Я на отпуске, решил вот с 1С++ разобраться, но что-то это крепковатый для меня орех) И доки мало.
9 Zhuravlik
 
18.11.12
22:05
Вот, докину на всякий, просто тут у меня точно есть косяк, только как победить его не знаю, может из-за этого и вылетает?


//====================================================
Процедура ТаблПоле_ПриВыводеСтроки(ТП, ОформлениеСтроки, ДанныеСтроки, ТипРегиона)
   
   ИмяКол = "Флажок";
   Попытка        
       Если ТипРегиона = 3 Тогда
           ОбъектЯчейка=ОформлениеСтроки.Ячейки.Получить(ИмяКол);
           ТекДанные = ДанныеСтроки.Получить(ИмяКол);    
           ОбъектЯчейка.ОтображатьТекст = 0 ;
           ОбъектЯчейка.ОтображатьФлажок = 1 ;
           ОбъектЯчейка.ЗначениеФлажка = ТекДанные;
           
           Если ТекДанные = 1 Тогда
               ОформлениеСтроки.ЦветФона = глПолучитьЦвет(211, 254, 217);
           Иначе
               ОформлениеСтроки.ЦветФона = -1;
           КонецЕсли;
           
       КонецЕсли;
   Исключение
       
       Сообщить(ОписаниеОшибки());
       
   КонецПопытки;
КонецПроцедуры // ТаблПолеПриВыводеСтроки




ОписаниеОшибки() - сообщает "Недопустимый параметр"
10 ADirks
 
19.11.12
07:59
Так на чём вылетает то, не пойму? Вроде криминала нет.
И что значит "выбираю несколько элементов" ? Несколько строк в ТП выделяешь что-ли?
11 oslokot
 
19.11.12
10:14
(0) Вот как у меня:
// ===============================
Процедура тпСрокиПоставки_ПриВыбореФлажка(ТП, НомерСтроки, НомерКолонки, ТипРегиона)
   ТЗ_СрокиПоставки.ПолучитьСтрокуПоНомеру(НомерСтроки);
   ТЗ_СрокиПоставки.Выбор = 1 - ТЗ_СрокиПоставки.Выбор;
   ТП.ОбновитьСтроки();
КонецПроцедуры // тпСрокиПоставки_ПриВыбореФлажка

// ===============================
Процедура тпСрокиПоставки_ПриВыводеСтроки(ТП,ОформлениеСтроки,ДанныеСтроки)
   ОформлениеСтроки.Ячейки.Номер.ОтображатьФлажок = 1;
   Если ТП.ПоставщикДанных.ТаблицаЗначений.ПолучитьЗначение(ДанныеСтроки.НомерСтроки,"Выбор") = 1 Тогда
       ОформлениеСтроки.Ячейки.Номер.ЗначениеФлажка  = 1;
   Иначе
       ОформлениеСтроки.Ячейки.Номер.ЗначениеФлажка  = 0;
   КонецЕсли;
КонецПроцедуры      // тпСрокиПоставки_ПриВыводеСтроки

Колонка "Выбор" невидимая, в ней хранится результат отметки (1,0)
Все работает нормально, не падает.
1с++ свежий релиз (2 мес. давности)
7.7. 25 релиз
12 antoneus
 
19.11.12
12:13
а чего вы УстановитьФлажок() не юзаете?
13 Zhuravlik
 
19.11.12
15:39
(10) Устанавливаю несколько флажков. Обнаружилось, когда я отлаживал и отмечал произвольные значения, несколько раз отметил - вылет, причем даже если не пользуюсь функцией ОбновитьСтроки(). Это наверное из-за того, что пользовался ПоставщикДанныхИТ, сейчас уже переписал на ПоставщикДанныхТЗ, такого вылета нет.
Еще в (9) выходила ошибка, решил ее через попытку-исключение, но это наверное не очень корректно?
Не мог найти доку, как работать с типом значения "ФиксированнаяКоллекция", сделал через ж...
Вот в (11):
ОформлениеСтроки.Ячейки.*Номер*.ЗначениеФлажка - откуда взялся номер? Где можно посмотреть методы?
(12) Просто как-то не дошел еще до него. ТП только начинаю пользоваться, не знаю еще даже как его применять.
14 oslokot
 
19.11.12
16:07
(13) не-не, "Номер" это имя колонки в которой у меня отображается флажок
15 ADirks
 
19.11.12
17:28
Фиксированная коллекция - это коллекция, к элементам которой можно обращаться как по индексу, так и по имени. Например
ДанныеСтроки.Получить("Флажок");
ДанныеСтроки.Получить(0);
ДанныеСтроки.Флажок; //вот это по имени

То же самое с оформлением ячейки. Также у ФК есть полезный
метод .Индес(<Имя>)

Например можно написать так
Если ОформлениеСтроки.Ячейки.Индекс(ИмяКол) <> -1 Тогда
   Яч = ОформлениеСтроки.Ячейки.Получить(ИмяКол);
   ...
КонецЕсли;

На какой строке из (9) ошибка вылетала?
16 Zhuravlik
 
20.11.12
14:18
Извините за молчание, отвлекался на другое.
(15) ОбъектЯчейка=ОформлениеСтроки.Ячейки.Получить(ИмяКол);
Сейчас сделаю как в (11)
17 Ёпрст
 
20.11.12
14:20
(16) 1cpp и формекс какой версии хоть ?
18 Zhuravlik
 
20.11.12
14:22
(11) все выводит, но все-равно есть ошибка
"Поле агрегатного объекта не обнаружено (Номер)", я так понимаю, это потому что при выводе строки проходится по всем колонкам, я просто не могу найти методы, как мне задать условие, чтобы только определенную колонку обрабатывал?
(17) Только недавно все обновлял
1С++ - 3.2.3.20
Formex - 2.05.108
19 Zhuravlik
 
20.11.12
14:24
(11) Тьфу, дурак))) "Номер", я не сразу понял.
20 Zhuravlik
 
20.11.12
14:26
(11) Заменил из вашего примера название колонки "номер" на свой - "флажок", все-равно ошибка
ОформлениеСтроки.Ячейки.Флажок.ОтображатьФлажок = 1;
{Обработка.АДМ_ВыборЗначенияИзМатрицы.Форма.Модуль(174)}: Поле агрегатного объекта не обнаружено (Флажок)
21 Zhuravlik
 
20.11.12
14:29
Если ОформлениеСтроки.Ячейки.Индекс("Флажок") <> -1 Тогда
       
       ОформлениеСтроки.Ячейки.Флажок.ОтображатьФлажок = 1;
       Если ТП.ПоставщикДанных.ТаблицаЗначений.ПолучитьЗначение(ДанныеСтроки.НомерСтроки,"Флажок") = 1 Тогда
           ОформлениеСтроки.Ячейки.Флажок.ЗначениеФлажка  = 1;
       Иначе
           ОформлениеСтроки.Ячейки.Флажок.ЗначениеФлажка  = 0;
       КонецЕсли;        
       
   КонецЕсли;

(11), (15) - спасибо) Долго догонял.
22 Zhuravlik
 
20.11.12
14:42
Окончательный вариант такой:


   Если ОформлениеСтроки.Ячейки.Индекс("Флажок") <> -1 Тогда
       фл = ТП.ПоставщикДанных.ТаблицаЗначений.ПолучитьЗначение(ДанныеСтроки.НомерСтроки,"Флажок");
       Яч = ОформлениеСтроки.Ячейки.Флажок;
       
       ЯЧ.ОтображатьТекст = 0;
       Яч.УстановитьФлажок(фл);
       ОформлениеСтроки.ЦветФона = ?(фл = 1,глПолучитьЦвет(211, 254, 217), -1);
   КонецЕсли;
23 antoneus
 
20.11.12
14:50
(22) фл = ДанныеСтроки.Флажок;

проще надо быть)
24 Zhuravlik
 
20.11.12
14:52
(23) Учел :)
А не подскажете, как мне узнать текущую колонку табличного поля?
25 Zhuravlik
 
20.11.12
14:53
(24) Все, понял...
26 antoneus
 
20.11.12
14:54
ТП.ТекущаяКолонка (атрибут, не метод).

возвращает тип КолонкаТабличногоПоля
27 Zhuravlik
 
20.11.12
15:16
Вылетало из-за моего г****кода в (9), сейчас переписал с ИТЗ, с учетом изменений в (22) все работает отлично.
Спасибо всем за помощь и советы)