Имя: Пароль:
1C
1С v8
Как организовать ввод данных. Нужен совет. (Управляемая форма).
0 vmprog
 
22.11.11
12:13
Здравствуйте.
Необходимо на форме обработки организовать ввод данных в некую таблицу в которой будет фиксированное количество строк, но не фиксированное количество колонок.

Из идей пока делать через обычную таблицу значений и потом ее возвращать на форму.
Как и куда сохранять данные мне понятно, вот как организовать удобный ввод?
Посоветуйте как правильно делать подобное. Реквизит какого типа лучше использовать на форме?
1 Повелитель
 
22.11.11
12:19
Скажи для чего, может идеи тебе подкинут другие
2 Escander
 
22.11.11
12:27
(0) какого типа - зависит от того что будет вводится. Дайте больше данных иначем ни когда не узнаете оптимальный вариант... самое главное а нафига? Кол-во столбцов при создании формы уже известно или меняется в процессе ввода формы?
3 Grusswelle
 
22.11.11
12:27
(0) "Перевернуть" таблицу на 90°, чтобы было бы фиксированное кол-во колонок, а пользователь добавлял строки.
4 Escander
 
22.11.11
12:33
(0)транспонирования в УФ нет
5 bvg
 
22.11.11
12:47
(0)может строки со столбцами пменять местами ?
6 vmprog
 
22.11.11
12:57
Строки будут заполняться по количеству элементов справочника.
Столбцы будут по количеству пользователей базы данных.
Тип вводимого значения "Число".
7 vmprog
 
22.11.11
12:58
(5) Строки со столбцами я поменяю местами когда это все сохранять буду в табличную часть.
Весь огород нужен для удобного визуального представления таблички для ввода данных.
8 Escander
 
22.11.11
13:03
(6) делаешь реквизит объекта типа таблица, ложишь его на форму, при создании на сервере создаёшь сколько нужно строк и столбцов и заполняешь все чем нужно. На клиенте блокируешь работу обработчиков ПередНачаломДобавления и ПередУдалением (Отказ = Истина;) ну вот типа и вся схема.
9 vmprog
 
23.11.11
15:23
(8) Сделал так:
Создаю реквизит формы с типом ТаблицаЗначений (колонок нет)
Добавляю этот реквизит на форму. НА ФОРМЕ ОН НЕ отображается тк. нет колонок.
В модуле добавляю колонки и возвращаю в реквизит формы:
[code]
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
   ТабСФормы = РеквизитФормыВЗначение("ТабВводаДанных");
   ТабВвода = Новый ТаблицаЗначений;
   ТабВвода.Колонки.Добавить("Сотр1");
   НоваяСтрока       = ТабВвода.Добавить();
   НоваяСтрока.Сотр1 = "Иванов";
   ЗначениеВРеквизитФормы(ТабВвода, "ТабВводаДанных");
   ТабВводаДанных.Загрузить(ТабВвода);
   Элементы.ТабВводаДанных.АктивизироватьПоУмолчанию = истина;
   Элементы.ТабВводаДанных.Обновить();
   Элементы.ТабВводаДанных.Видимость=Истина;    
КонецПроцедуры
[/code]
Проблема в том, что таблица не отображается на форме. Ее вообще нет.
10 vmprog
 
23.11.11
16:17
люди ну помогите же.
11 xReason
 
23.11.11
16:20
Я так понимаю, что изначально на форме есть эта ТЗ "ТабВводаДанных"?
12 vmprog
 
23.11.11
16:33
Да, только визуально ее не видно.
13 Sergeyspb13
 
23.11.11
16:46
почему сразу не добавляете элементы справочника, а потом уже колонки добивать с юзерами?
14 vmprog
 
23.11.11
16:50
(13) не понял.
Надо сначала добавить колонки которые будут соответствовать пользователям, а потом уже добавить строки.

Но сейчас проблема вообще заставить отображаться ТЗ которую я заполнил.

Вот было же в 7.7 такое понятие как таблица для ввода данных. Почему в 8 нет подобного механизма.
15 vmprog
 
23.11.11
17:33
heeeelp
16 xReason
 
23.11.11
17:41
надо примерно так делать

НовоеПоле = Элементы.Добавить("Поле", Тип("ПолеФормы"), Элементы.Таблица);
НовоеПоле.Заголовок = "Поле";
НовоеПоле.ПутьКДанным = "Объект.Таблица.НомерСтроки";
17 vmv
 
23.11.11
19:27
просмотр динамических таблиц на УФ вполне реален, на управляемой форме делаем
реквизит таблицазначений, прописывваем в него постоянные реквизиты(номерстроки,...) или не прописываем, создаем таблицу формы как элемент формы и

&НаКлиенте
Процедура ПросмотрДанныхТзИзХранилища(Команда)
   
   мПредопределенныхКолонок = Новый Массив;  // Преобразуем имена в верхний регистр для регистронезависимого поиска
   мПредопределенныхКолонок.Добавить(ВРег("НомерСтроки"));  
   ИмяТаблицыФормы = "СохраненнаяТаблицаВИ";
   
   ЗагрузитьПроизвольнуюТаблицуЗначенийВТаблицуФормы(ИмяТаблицыФормы, мПредопределенныхКолонок);
   
КонецПроцедуры

&НаСервере
Функция ПолучимОбразТекущейТз()

   ТзИсточника = Новый ТаблицаЗначений;
   
   // ТзИсточника ...код получения динамической Тз откуда угодно
   
   Возврат ТзИсточника;

КонецФункции

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


Замечание: мастер-деталь хрен получишь, но если жамкать на кнопку команды обновления динамической таблицы то видим совершенно разные таблицы в одной и той же таблице формы.

С имена своих преоопределеннных реквизитов(колонок) и самим именем реквизита таблицы поправте и пашет
18 Escander
 
23.11.11
19:40
(10) как вариант посмотрите (16)
(17) да ну! даже на клюшках делал 3-х уровневый мастер-деталь(3 тарблички: 1 - мастер, 2- показывает записи подчинённые 1, 3-записи подчинённые 2), причём изврата не больше чем у вас с хранилищем.
19 Escander
 
23.11.11
19:41
+(18) имхо, хранилище это перебор.
20 vmv
 
23.11.11
20:09
(18) и при активизации строки в однной таблице(мастере) - динамически грузились данные в другую таблицу формы, речь о тонком клиенте, естественно.

на толстом все просто
21 Escander
 
24.11.11
03:56
(20) код из 16 не работает?