Имя: Пароль:
1C
 
Программное удаление таблицы с формы
,
0 NIGHTHUNTER
 
05.08.21
09:37
На форме, программно создаю таблицу. По нажатию на кнопку, с заполнением данных.
Хочу проверять существует ли она, что бы была возможность повторного нажатия на кнопку.

Изначально этой таблицы не существует.

Что нужно добавить в коде удаления, почему ошибка повторяется?

    //
    НайденнаяТаблицаНаФорме = Элементы.Найти("ТаблицаНаФорме");
    Если Не НайденнаяТаблицаНаФорме = Неопределено Тогда
        Элементы.Удалить(НайденнаяТаблицаНаФорме);
    КонецЕсли;
    //


Неуникальное имя реквизита. Имя: "ТаблицаНаФорме"
{ВнешняяОбработка.ЗаменаВБазеУУ.Форма.Форма.Форма(63)}:    ИзменитьРеквизиты(Реквизиты);
{ВнешняяОбработка.ЗаменаВБазеУУ.Форма.Форма.Форма(95)}:    ПрочитатьФайлXLSНаСервере();

по причине:
Неуникальное имя реквизита. Имя: "ТаблицаНаФорме"
1 ДенисЧ
 
05.08.21
09:39
потому что ты удаляешь элемент формы, а не реквизит
2 Адинэснег
 
05.08.21
09:40
еще и кусок вытащил, не на который платформа ругнулась
3 NIGHTHUNTER
 
05.08.21
09:43
(2)

&НаСервере
Процедура ПрочитатьФайлXLSНаСервере()
    //
    НайденнаяТаблицаНаФорме = Элементы.Найти("ТаблицаНаФорме");
    Если Не НайденнаяТаблицаНаФорме = Неопределено Тогда
        Элементы.Удалить(НайденнаяТаблицаНаФорме);
    КонецЕсли;
    //
    ТДсXLS = Новый ТабличныйДокумент;
    ТДсXLS.Прочитать(Объект.ВыборФайла, СпособЧтенияЗначенийТабличногоДокумента.Значение);
    //
    ТЗсТД = Новый ТаблицаЗначений;
    НомерСтроки  = 1;
    Пока НомерСтроки <= 1 Цикл
        Сообщить(">>> Строка: " + НомерСтроки);
        НомерСтолбца = 1;
        Пока НомерСтолбца < ТДсXLS.ШиринаТаблицы + 1 Цикл
            Сообщить("      Столбец: " + НомерСтолбца);
            Сообщить(ТДсXLS.Область("R" + НомерСтроки + "C" + НомерСтолбца).Текст);
            ТЗсТД.Колонки.Добавить(ТДсXLS.Область("R" + НомерСтроки + "C" + НомерСтолбца).Текст);
            НомерСтолбца = НомерСтолбца + 1;
        КонецЦикла;    
        НомерСтроки = НомерСтроки + 1;
    КонецЦикла;
    //
    НомерСтроки  = 2;
    Пока НомерСтроки < ТДсXLS.ВысотаТаблицы Цикл
        Сообщить(">>> Строка: " + НомерСтроки);
        НоваяСтрокаТз = ТЗсТД.Добавить();
        НомерСтолбца = 1;
        Пока НомерСтолбца < ТДсXLS.ШиринаТаблицы + 1 Цикл
            Сообщить("      Столбец: " + НомерСтолбца);
            Сообщить(ТДсXLS.Область("R" + НомерСтроки + "C" + НомерСтолбца).Текст);
            НоваяСтрокаТз[ТЗсТД.Колонки[НомерСтолбца - 1].Имя] = ТДсXLS.Область("R" + НомерСтроки + "C" + НомерСтолбца).Текст;
            НомерСтолбца = НомерСтолбца + 1;
        КонецЦикла;    
        НомерСтроки = НомерСтроки + 1;
    КонецЦикла;
    //
    // 2).
    Реквизиты = Новый Массив;
    Реквизиты.Добавить(Новый РеквизитФормы("ТаблицаНаФорме", Новый ОписаниеТипов("ТаблицаЗначений")));
    Для каждого Ст Из ТЗсТД.Колонки Цикл
        Реквизиты.Добавить(Новый РеквизитФормы(Ст.Имя, Ст.ТипЗначения, "ТаблицаНаФорме"));                  
    КонецЦикла;                      
    // 3).
    ИзменитьРеквизиты(Реквизиты);
    // 4).
    // СОЗДАНИЕ ГРУППЫ НА ФОРМЕ -------------------------------------------->>
    ПрограммноСозданнаяГруппаДляТаблиц             = Элементы.Добавить("ПрограммноСозданнаяГруппаДляТаблиц", Тип("ГруппаФормы"), Элементы.ГруппаТаблицы);    // Добавляет группу на форму
    ПрограммноСозданнаяГруппаДляТаблиц.Заголовок   = "Программно созданная группа для таблиц";    
    ПрограммноСозданнаяГруппаДляТаблиц.Вид         = ВидГруппыФормы.ОбычнаяГруппа;
    ПрограммноСозданнаяГруппаДляТаблиц.Группировка = ГруппировкаПодчиненныхЭлементовФормы.Вертикальная;  
    // << --------------------------------------------------------------------
    Таб                          = Элементы.Добавить("ТаблицаНаФорме", Тип("ТаблицаФормы"), ПрограммноСозданнаяГруппаДляТаблиц);
    Таб.ПутьКДанным              = "ТаблицаНаФорме";
    Таб.ИзменятьСоставСтрок      = Ложь;
    Таб.ИзменятьПорядокСтрок     = Ложь;
    Таб.ПоложениеКоманднойПанели = ПоложениеКоманднойПанелиЭлементаФормы.Нет;
    Для каждого Ст Из ТЗсТД.Колонки Цикл
        Рек             = Элементы.Добавить("Колонка" + Ст.Имя, Тип("ПолеФормы"), Таб);
        Рек.Вид         = ВидПоляФормы.ПолеНадписи;
        Рек.ПутьКДанным = "ТаблицаНаФорме" + "." + Ст.Имя;
        Рек.Заголовок   = Ст.Имя;
    КонецЦикла;
    // 5).
    ЗначениеВРеквизитФормы(ТЗсТД, "ТаблицаНаФорме");
    // 6). Создание кнопки
    ПереборТаблицыНаФорме                      = ЭтаФорма.Команды.Добавить("ПереборТаблицыНаФорме");
    ПереборТаблицыНаФорме.Действие            = "ПереборТаблицыНаФорме";
    //
    КнопкаПеребораТаблицыНаФорме               = Элементы.Добавить("ПереборТаблицыНаФорме", Тип("КнопкаФормы"), ПрограммноСозданнаяГруппаДляТаблиц);
    КнопкаПеребораТаблицыНаФорме.Заголовок  = "Перебор таблицы на форме";
    КнопкаПеребораТаблицыНаФорме.ИмяКоманды = "ПереборТаблицыНаФорме";
КонецПроцедуры
//
4 NIGHTHUNTER
 
05.08.21
09:43
(1) Ну и как должно быть????
5 acht
 
05.08.21
09:46
(4) Должно быть правильно, Андрей.
6 ДенисЧ
 
05.08.21
09:46
(4) Удалять реквизит формы, а не только элемент формы.
Да! Это разные вещи...

ЗЫ. В ИзменитьРеквизиты() есть второй параметр...
7 ДенисЧ
 
05.08.21
09:47
(4) Ты представь, что будет, если он начнёт писать правильно??
8 Адинэснег
 
05.08.21
09:50
(7) главное упорный, 189 тем за 11 месяцев, пару лет и будет ЧСВшить на мисте в таких же ветках
9 NIGHTHUNTER
 
05.08.21
09:54
сейчас такая ошибка

    //
    НайденнаяТаблицаНаФорме = Элементы.Найти("ТаблицаНаФорме");
    Если Не НайденнаяТаблицаНаФорме = Неопределено Тогда
        УдаляемыеРеквизиты = Новый Массив;
        УдаляемыеРеквизиты.Добавить(Новый РеквизитФормы("ТаблицаНаФорме", Новый ОписаниеТипов("ТаблицаЗначений")));
        Для каждого Ст Из Элементы.ТаблицаНаФорме.Колонки Цикл
            УдаляемыеРеквизиты.Добавить(Новый РеквизитФормы(Ст.Имя, Ст.ТипЗначения, "ТаблицаНаФорме"));                  
        КонецЦикла;                      
        ИзменитьРеквизиты(,УдаляемыеРеквизиты);
    КонецЕсли;
    //


Поле объекта не обнаружено (Колонки)
{ВнешняяОбработка.ЗаменаВБазеУУ.Форма.Форма.Форма(24)}:        Для каждого Ст Из Элементы.ТаблицаНаФорме.Колонки Цикл
{ВнешняяОбработка.ЗаменаВБазеУУ.Форма.Форма.Форма(100)}:    ПрочитатьФайлXLSНаСервере();
10 acht
 
05.08.21
09:54
(8) Это ты только по одному его нику посчитал...
11 ДенисЧ
 
05.08.21
09:55
(9) Удалил, молодец. А добавлять - Барак будет?
12 NIGHTHUNTER
 
05.08.21
09:57
(11) Я пока не удалял. На этот код идет такая ошибка, -

    //
    НайденнаяТаблицаНаФорме = Элементы.Найти("ТаблицаНаФорме");
    Если Не НайденнаяТаблицаНаФорме = Неопределено Тогда
        УдаляемыеРеквизиты = Новый Массив;
        УдаляемыеРеквизиты.Добавить(Новый РеквизитФормы("ТаблицаНаФорме", Новый ОписаниеТипов("ТаблицаЗначений")));
        Для каждого Ст Из НайденнаяТаблицаНаФорме.Колонки Цикл
            УдаляемыеРеквизиты.Добавить(Новый РеквизитФормы(Ст.Имя, Ст.ТипЗначения, "ТаблицаНаФорме"));                  
        КонецЦикла;                      
        ИзменитьРеквизиты(,УдаляемыеРеквизиты);
    КонецЕсли;
    //


Поле объекта не обнаружено (Колонки)
{ВнешняяОбработка.ЗаменаВБазеУУ.Форма.Форма.Форма(24)}:        Для каждого Ст Из НайденнаяТаблицаНаФорме.Колонки Цикл
{ВнешняяОбработка.ЗаменаВБазеУУ.Форма.Форма.Форма(100)}:    ПрочитатьФайлXLSНаСервере();
13 Галахад
 
гуру
05.08.21
09:57
Конструктора 1С на (0) кастую. Операции чтение из файлов и отображение надо изолировать...
14 acht
 
05.08.21
10:00
(12) > Я пока не удалял.
> ИзменитьРеквизиты(,УдаляемыеРеквизиты);

Ну не трынди, Андрей. Неприлично уже.
15 NIGHTHUNTER
 
05.08.21
10:03
пока ничего не получается, пробую всяко разно

    //
    НайденнаяТаблицаНаФорме = Элементы.Найти("ТаблицаНаФорме");
    Если Не НайденнаяТаблицаНаФорме = Неопределено Тогда
        УдаляемыеРеквизиты = Новый Массив;
        УдаляемыеРеквизиты.Добавить("ПрограммноСозданнаяГруппаДляТаблиц");        
        УдаляемыеРеквизиты.Добавить("ТаблицаНаФорме");
        //Для каждого Ст Из НайденнаяТаблицаНаФорме.Колонки Цикл
        //    УдаляемыеРеквизиты.Добавить(Новый РеквизитФормы(Ст.Имя, Ст.ТипЗначения, "ТаблицаНаФорме"));                  
        //КонецЦикла;                      
        ИзменитьРеквизиты(,УдаляемыеРеквизиты);
        //
        Элементы.Удалить( Элементы["ТаблицаНаФорме"]);         
    КонецЕсли;
    //
16 NIGHTHUNTER
 
05.08.21
10:04
(14) до этого не доходит, там ошибка шла (12)
17 NIGHTHUNTER
 
05.08.21
10:08
как вот это программно удалить?

    ПрограммноСозданнаяГруппаДляТаблиц             = Элементы.Добавить("ПрограммноСозданнаяГруппаДляТаблиц", Тип("ГруппаФормы"), Элементы.ГруппаТаблицы);    // Добавляет группу на форму
18 NIGHTHUNTER
 
05.08.21
10:09
Сейчас удаляю таблицу вот так

    НайденнаяТаблицаНаФорме = Элементы.Найти("ТаблицаНаФорме");
    Если Не НайденнаяТаблицаНаФорме = Неопределено Тогда
        УдаляемыеРеквизиты = Новый Массив;
        //УдаляемыеРеквизиты.Добавить("ПрограммноСозданнаяГруппаДляТаблиц");        
        УдаляемыеРеквизиты.Добавить("ТаблицаНаФорме");
        //Для каждого Ст Из НайденнаяТаблицаНаФорме.Колонки Цикл
        //    УдаляемыеРеквизиты.Добавить(Новый РеквизитФормы(Ст.Имя, Ст.ТипЗначения, "ТаблицаНаФорме"));                  
        //КонецЦикла;                      
        ИзменитьРеквизиты(,УдаляемыеРеквизиты);
        //
        //Элементы.Удалить( Элементы["ПрограммноСозданнаяГруппаДляТаблиц"]);         
        Элементы.Удалить( Элементы["ТаблицаНаФорме"]);         
        
    КонецЕсли;


Как удалять программно созданную группу?
19 NIGHTHUNTER
 
05.08.21
10:21
Вот так стало отрабатывать, все ли правильно?

    //
    НайденнаяТаблицаНаФорме = Элементы.Найти("ТаблицаНаФорме");
    Если Не НайденнаяТаблицаНаФорме = Неопределено Тогда
        УдаляемыеРеквизиты = Новый Массив;
        УдаляемыеРеквизиты.Добавить("ТаблицаНаФорме");
        ИзменитьРеквизиты(,УдаляемыеРеквизиты);
        Элементы.Удалить( Элементы["ТаблицаНаФорме"]);         
        //
        НайденнаяГруппа = Элементы.Найти("ПрограммноСозданнаяГруппаДляТаблиц");
        Если НЕ НайденнаяГруппа = Неопределено Тогда
            Элементы.Удалить(НайденнаяГруппа);
        КонецЕсли;
        //
        НайденнаяКнопка = ЭтаФорма.Команды.Найти("ПереборТаблицыНаФорме");
        Если НЕ НайденнаяКнопка = Неопределено Тогда
            ЭтаФорма.Команды.Удалить(НайденнаяКнопка);
        КонецЕсли;
    КонецЕсли;
    //
20 hhhh
 
05.08.21
11:43
(19) вьобще-то удалять - это дебилизм. Просто убери видимость и всё.
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан