8.х Как программно добавить в табличное поле документа колонки и инициализировать значения по ним

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем leha, 10 авг 2010.

  1. TopicStarter Overlay
    leha
    Offline

    leha

    Регистрация:
    9 июн 2009
    Сообщения:
    31
    Симпатии:
    0
    Баллы:
    1
    Передо мной стоит следующая задача.
    Есть документ.
    У документа есть табличная часть "Товары".
    По нажатию кнопки на форме документа мне надо, чтобы в табличной части появились информационные колонки. Данные для них будут браться...ну например из поля "СтрокаДоставки" табличной части "Товары". Количество полей будет зависеть от того, что у нас в этом поле указано указано.
    Почитал форум. Принял к сведению алгоритм:
    1. выгружаем таблицу Товары в ТаблицуЗначений.
    2. добавляем в ТаблицуЗначений необходимые колонки.
    3. пробегаем по её строкам и инициализируем значения этих колонок нужным нам способом.
    4. добавляем в ЭлементыФормы.Товары новые колонки
    5. осуществляем привязку ЭлементыФормы.Товары к ТаблицеЗначений
    6. вызываем метод создания колонок.
    В результате у меня получился следующий код:
    ТаблицаПолучатель = Товары.Выгрузить();

    Код:
    ТаблицаПолучатель.Колонки.Вставить(ТаблицаПолучатель.Колонки.Количество()+1,"КоличествоДоставка1",,,);
    ТаблицаПолучатель.Колонки.Вставить(ТаблицаПолучатель.Колонки.Количество()+1,"ДатаДоставка1",,,);
    
    Для Каждого СтрокаТаблицаПолучатель Из ТаблицаПолучатель Цикл
    Сообщить(СтрокаТаблицаПолучатель.Номенклатура);
    СтрокаТаблицаПолучатель.КоличествоДоставка1 = СтрокаТаблицаПолучатель.Количество;
    СтрокаТаблицаПолучатель.ДатаДоставка1 = Дата;
    КонецЦикла;	
    
    ЭлементыФормы.Товары.Колонки.Добавить("КоличествоДоставка1", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(25)));
    ЭлементыФормы.Товары.Колонки.Добавить("ДатаДоставка1", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(25)));
    ЭлементыФормы.Товары.Колонки.ДатаДоставка1.Положение = ПоложениеКолонки.НаСледующейСтроке;
    
    ЭлементыФормы.Товары.Значение = ТаблицаПолучатель;
    ЭлементыФормы.Товары.СоздатьКолонки();
    
    Сообщить("После переброски ТЧ");
    Для Каждого СтрокаТовары Из Товары Цикл
    Сообщить(СтрокаТовары.Номенклатура);
    КонецЦикла;	
    
    В результате на форме у меня таблица Товары перерисовывается, т.е. колонки выводятся по новому, появляются новые колонки, НО нет строк.
    Вопрос:
    1. чего я недопонял, почему нет строк.
    2. как сохранить прежний вид таблицы. Т.е. ширину, порядок, видимость колонок и т.д.
  2. has
    Offline

    has Опытный в 1С

    Регистрация:
    18 июн 2009
    Сообщения:
    708
    Симпатии:
    0
    Баллы:
    26
    а почему бы не добавить колонки сразу и просто скрыть их?
  3. TopicStarter Overlay
    leha
    Offline

    leha

    Регистрация:
    9 июн 2009
    Сообщения:
    31
    Симпатии:
    0
    Баллы:
    1
    Вы имеете ввиду добавление новых реквизитов табличной части документа? Количество колонок заранее неизвестно.
  4. alexburn
    Offline

    alexburn Модераторы Команда форума Модератор

    Регистрация:
    5 янв 2009
    Сообщения:
    14.750
    Симпатии:
    509
    Баллы:
    204
    А у вас в сообщении Сообщить(СтрокаТовары.Номенклатура); выводит номенклатуру?
  5. TopicStarter Overlay
    leha
    Offline

    leha

    Регистрация:
    9 июн 2009
    Сообщения:
    31
    Симпатии:
    0
    Баллы:
    1
    выводит вполне нормально
  6. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    leha предлагаю вам попробовать другой вариант: в ТЗ ничего выгружать не надо. При нажатии на вашу кнопку добавляете новые колонки, а данные в эти колонки пишите в событии "ПриВыводеСтроки()".
  7. TopicStarter Overlay
    leha
    Offline

    leha

    Регистрация:
    9 июн 2009
    Сообщения:
    31
    Симпатии:
    0
    Баллы:
    1
    И всё таки я немного неправильно написал - сейчас проверил - колонок новых нет на форме после перерисовки таблицы. Т.е. этот код
    Код:
    	ЭлементыФормы.Товары.Колонки.Добавить("КоличествоДоставка1", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(25)));
    ЭлементыФормы.Товары.Колонки.Добавить("ДатаДоставка1", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(25)));
    
    по сути затирается при выполнении
    Код:
    ЭлементыФормы.Товары.Значение = ТаблицаПолучатель;
    ЭлементыФормы.Товары.СоздатьКолонки();
    
    и на форме документа таблица то выводится заново (вижу по сбившейся настройки таблицы), но при этом всё-таки без новых колонок и без строк.
    При этом попытка просмотреть СтрокаТовары.КоличествоДоставка1 в отличии от СтрокаТовары.Номенклатура при водит к ошибке "Поле объекта не обнаружено"


    Интересное проедложение! сейчас попробую - отпишусь!
  8. uza
    Offline

    uza 1С, VBA (EXCEL), VB (.NET + WEB)

    Регистрация:
    10 июл 2007
    Сообщения:
    1.845
    Симпатии:
    1
    Баллы:
    29
    А перед добавление колонок пробежаться так:

    Код:
    Для каждого Колонка Из ЭлементыФормы.ТабличноеПоле1.Колонки Цикл
    Колонка.Ширина
    Колонка.Видимость
    
    ОбработкаПрерыванияПользователя();
    КонецЦикла;
    
    
    и позапоминать кудато то значения видимости и ширины?
  9. uza
    Offline

    uza 1С, VBA (EXCEL), VB (.NET + WEB)

    Регистрация:
    10 июл 2007
    Сообщения:
    1.845
    Симпатии:
    1
    Баллы:
    29
    Ибо смотри метод элемента формы ТабличноеПоле "СоздатьКолонки()"

    Пример для посмотреть:
    Код:
    Процедура КнопкаВыполнитьНажатие(Кнопка)
    тзКолонки = Новый ТаблицаЗначений(); //порядок, видимость и ширина колонок
    
    тзКолонки.Колонки.Добавить("Наименование");
    тзКолонки.Колонки.Добавить("Ширина");
    тзКолонки.Колонки.Добавить("Видимость");
    
    //считаем праметры колонок
    Для каждого Колонка Из ЭлементыФормы.ТабличноеПоле1.Колонки Цикл
    СтрокаТЗКолонок = тзКолонки.Добавить();
    СтрокаТЗКолонок.Наименование = Колонка.Имя;
    СтрокаТЗКолонок.Ширина        = Колонка.Ширина;
    СтрокаТЗКолонок.Видимость    = Колонка.Видимость;
    
    ОбработкаПрерыванияПользователя();
    КонецЦикла; 
    
    //добавляем новые колонки
    Попытка
    КолонкаТЗ = ТабличноеПоле1.Колонки.Добавить("Колонка3");
    Исключение
    //такая колонка уже есть
    КонецПопытки;
    
    //заполняем данными новую колонку
    Сч = 0;
    Для каждого СтрокаТЗ Из ТабличноеПоле1 Цикл
    Сч = Сч + 1;
    СтрокаТЗ["Колонка3"]    = "3."+Сч;        
    
    ОбработкаПрерыванияПользователя();
    КонецЦикла;
    
    ЭлементыФормы.ТабличноеПоле1.СоздатьКолонки();
    //ЭлементыФормы.ТабличноеПоле1.Данные = "ТабличноеПоле1";
    //ЭтаФорма.Обновить();
    //ЭлементыФормы.ТабличноеПоле1.ОбновитьСтроки();
    //ЭтаФорма.Обновить();
    
    А = 100;
    КонецПроцедуры
    
    Процедура ПриОткрытии()
    //инициирую начальные данные, чтобы руками не забивать для экспериментов
    Для Сч = 0 По 5 Цикл
    СтрокаТЗ = ТабличноеПоле1.Добавить();
    СтрокаТЗ.Колонка1    = "1."+Сч;
    СтрокаТЗ.Колонка2    = "2."+Сч;
    
    ОбработкаПрерыванияПользователя();
    КонецЦикла;
    КонецПроцедуры
    
    
    Т.е. СоздатьКолонки - синхронизирует структуру того, что лежит в ЭлементыФормы.ТабличноеПоле1.Значение с тем, что отображается на экране (т.е состав ЭлементыФормы.ТабличноеПоле1.Колонки и ЭлементыФормы.ТабличноеПоле1.Значение.Колонки становятся одинаковыми)
  10. TopicStarter Overlay
    leha
    Offline

    leha

    Регистрация:
    9 июн 2009
    Сообщения:
    31
    Симпатии:
    0
    Баллы:
    1
    Ну так не получается на этапе
    Код:
        //добавляем новые колонки
    Попытка
    КолонкаТЗ = ТабличноеПоле1.Колонки.Добавить("Колонка3");
    Исключение
    //такая колонка уже есть
    КонецПопытки;
    
    поскольку ТабличноеПоле1 не имеет реквизита "Колонки"....
  11. uza
    Offline

    uza 1С, VBA (EXCEL), VB (.NET + WEB)

    Регистрация:
    10 июл 2007
    Сообщения:
    1.845
    Симпатии:
    1
    Баллы:
    29
    А куда колонки иптыть делись из табличного поля? И вообще что у Вас есть табличное поле? У меня все работает. Ибо ТабличноеПоле - это "поле табличного докуменат" положенное на форму.

    Да и нафига весь мой пример грузить то? Главно прочесть и суть понять.
    А суть простая как валенок - У элемента формы есть такие поля как Значение и Данные. Вот в том, что прописанно в Данные - добавляем/удаляем/переименовываем колонки.
    далее выполняем метод ЭлементаФормы СОЗДАТЬКОЛОНКИ

    Да и нафиге репостить ответом мой кусман кода?
  12. TopicStarter Overlay
    leha
    Offline

    leha

    Регистрация:
    9 июн 2009
    Сообщения:
    31
    Симпатии:
    0
    Баллы:
    1
    Возможно я туплю, зная себя, не исключаю такой факт :), но я не могу понять КАК добавить программно новую колонку в ТабличнуюЧасть документа. Посмотрев в стандартном хелпе 1С, я не нашёл такого метода. Буду признателен, если ткнёте меня носом.
  13. TopicStarter Overlay
    leha
    Offline

    leha

    Регистрация:
    9 июн 2009
    Сообщения:
    31
    Симпатии:
    0
    Баллы:
    1
    Или же под ТабличноеПоле1 вы понимаете переменную с типом ТаблицаЗначений куда нам предварительно надо выгрузить ТабличнуюЧасть документа?
  14. has
    Offline

    has Опытный в 1С

    Регистрация:
    18 июн 2009
    Сообщения:
    708
    Симпатии:
    0
    Баллы:
    26
    ТабличноеПоле это элемент управления расположенный на форме, чтобы добавить колонки пишем
    Код:
    ЭлементыФормы.ТабличноеПоле1.Колонки.Добавить("Колонка1");
    
    
  15. uza
    Offline

    uza 1С, VBA (EXCEL), VB (.NET + WEB)

    Регистрация:
    10 июл 2007
    Сообщения:
    1.845
    Симпатии:
    1
    Баллы:
    29
    В Табличную Часть документа добавить колонку вы не сможете. Нельзя программно менять Метаданные конфигурации!!!
    (иначе бы такого можно было наворотить... это как блин калибр стволя в танке менять, на ходу, во время боя, без замены калибра боеприпасов)

    Вот в табличную часть ФОРМЫ - можно, но при условии, что эта табличная часть ФОРМЫ автоматом не связанна с табличной частью ДОКУМЕНТА.
    Т.е. таб.часть формы заполняется и обрабатывается только программно (например при открытии формы)
  16. TopicStarter Overlay
    leha
    Offline

    leha

    Регистрация:
    9 июн 2009
    Сообщения:
    31
    Симпатии:
    0
    Баллы:
    1
    Т.е. получается, что от привязки Табличной части документа к элементу формы документа Табличное поле придётся отказаться полностью и программно вырисовывать ТабличноеПоле при открытии и в дальнейшем при изменении?
  17. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    leha а с моим предложением у вас что? чего так долго то? :)
    Вот вам пример:
    Код:
    Перем мМоиКолонкиКоличество;
    
    Процедура Кнопка1Нажатие(Элемент)
    КоличествоКолонок = 10;
    Для индекс=1 По КоличествоКолонок Цикл
    Колонка = ЭлементыФормы.Товары.Колонки.Добавить("Колонка" + Строка(Индекс));
    КонецЦикла;
    мМоиКолонкиКоличество = КоличествоКолонок;
    КонецПроцедуры
    
    Процедура ТоварыПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
    
    Если мМоиКолонкиКоличество > 0 Тогда
    Для индекс=1 По мМоиКолонкиКоличество Цикл
    ОформлениеСтроки.Ячейки["Колонка"+Строка(индекс)].УстановитьТекст("Мое значение в колонке " + Строка(ДанныеСтроки.Номенклатура));
    КонецЦикла;
    КонецЕсли;
    КонецПроцедуры // ТоварыПриВыводеСтроки()
    
    ////////////////////////////////////////////////////////////////////////////////
    // ОПЕРАТОРЫ ОСНОВНОЙ ПРОГРАММЫ
    мМоиКолонкиКоличество = 0;
    
    
  18. TopicStarter Overlay
    leha
    Offline

    leha

    Регистрация:
    9 июн 2009
    Сообщения:
    31
    Симпатии:
    0
    Баллы:
    1
    Ваша вариант мне понравился. Наверное он оптимален для моей задачи, но пака столкнулся с ошибкой при
    Код:
    Колонка = ЭлементыФормы.Товары.Колонки.Добавить("Колонка" + Строка(Индекс));
    
    
    Вроде всё тут верно и в хелпе пример аналогичный описан, но у меня выдает ошибку "Ошибка при вызове метода контекста (Добавить): Недопустимое значение параметра ("Ошибка при вызове метода контекста (Добавить): Недопустимое значение параметра по причине:Недопустимое значение параметра (параметр номер '1'))".... Сижу, разбираюсь)
  19. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    А у вас уже нет случаем добавленных этих колонок (остатки от предыдущего кода)?
    Попробуйте
    Код:
    ЭлементыФормы.Товары.Колонки.Добавить();
    
    т.е. без указания имени колонки.

    З.Ы. Код рабочий. Проверял.
  20. TopicStarter Overlay
    leha
    Offline

    leha

    Регистрация:
    9 июн 2009
    Сообщения:
    31
    Симпатии:
    0
    Баллы:
    1
    Вы прорецатель :) Мой косяк. Только чно нашёл - справил: были остатки от старых попыток с теме же именами колонок. Примного благодарен! :unsure:

Поделиться этой страницей