Имя: Пароль:
   
1C
1С v8
Хранение данных динамически добавляемых реквизитов
0 K1RSAN
 
naïve
15.10.20
09:34
Добрый день.
Появился новый документ (таблица заказов), в нем табличная часть с заранее неопределенным количеством колонок. Колонки - количество, заказанное по продукции контрагентом (продукция хранится в регистре сведений, может быть изменено).
Так как количество реквизитов не определено на уровне конфигуратора - решил добавлять их при формировании формы.

Так же на основании этого документа будут формироваться реализации.

Теперь надо организовать хранение этих данных. Как лучше организовать?
1 ДенисЧ
 
15.10.20
09:35
Разверни таблицу вертикально. Типа контрагент-количество.
При выводе разворачивай обратно
2 K1RSAN
 
naïve
15.10.20
09:39
(1) Не понял.
Да еще возможно я сделал принципиальную ошибку - добавляю реквизиты в табличную часть - объект.товары
Может надо делать реквизит формы типа "Таблица значений" и ее с нуля заполнять?

Код грубый пока

    Пока Выборка.Следующий() Цикл
        
        нРеквизиты = Новый Массив;
        нРеквизиты.Добавить(Новый РеквизитФормы("Номенклатура"+Выборка.Номенклатура.Код, Новый ОписаниеТипов("СправочникСсылка.Номенклатура"), "Объект.Товары", Выборка.Номенклатура, Истина));
        ИзменитьРеквизиты(нРеквизиты);
        нРеквизиты = Выборка.Номенклатура;
        
        нГруппа = Элементы.Вставить("Номенклатура"+Выборка.Номенклатура.Код, Тип("ГруппаФормы"), Элементы.Товары,Элементы.ТоварыГруппаИтог);
        нГруппа.Вид = ВидГруппыФормы.ГруппаКолонок;
        нГруппа.Заголовок = Выборка.Номенклатура;
        нГруппа.ОтображатьВШапке = Истина;
        нГруппа.Группировка=ГруппировкаКолонок.Горизонтальная;

        нРеквизиты = Новый Массив;
        нРеквизиты.Добавить(Новый РеквизитФормы("КоличествоЯщиков"+Выборка.Номенклатура.Код, Новый ОписаниеТипов("Число"), "Объект.Товары", "Ящики", Истина));
        ИзменитьРеквизиты(нРеквизиты);

        нЭлемент = Элементы.Добавить("КоличествоЯщиков"+Выборка.Номенклатура.Код, Тип("ПолеФормы"), нГруппа);
        нЭлемент.Вид = ВидПоляФормы.ПолеВвода;
        нЭлемент.ПутьКДанным = "Объект.Товары.КоличествоЯщиков"+Выборка.Номенклатура.Код;

        нРеквизиты = Новый Массив;
        нРеквизиты.Добавить(Новый РеквизитФормы("Количество"+Выборка.Номенклатура.Код, Новый ОписаниеТипов("Число"), "Объект.Товары", "Количество", Истина));
        ИзменитьРеквизиты(нРеквизиты);

        нЭлемент = Элементы.Добавить("Количество"+Выборка.Номенклатура.Код, Тип("ПолеФормы"), нГруппа);
        нЭлемент.Вид = ВидПоляФормы.ПолеВвода;
        нЭлемент.ПутьКДанным = "Объект.Товары.Количество"+Выборка.Номенклатура.Код;
                
    КонецЦикла;
3 K1RSAN
 
naïve
15.10.20
09:40
(2)+ добавление реквизитов подсмотрел где-то, возможно не оптимальный вариант
4 K1RSAN
 
naïve
15.10.20
09:42
И получается при открытии уже созданного документа - надо подхватывать эти уже записанные данные.
5 youalex
 
15.10.20
09:51
В колонках - Контрагенты, в строках - Номенклатура?

>> добавляю реквизиты в табличную часть - объект.товары
можно и так, но учти, что после записи документа данные сумм в добавленных колонках нужно будет обновлять (т.к. Объект обновляется)

Стандартно, получается три ТЧ:
1) Товары - исходная
2) Контрагенты - с одной колонкой Контрагент (если нужно состав Контрагентов хранить)
3) СуммыКонтрагентов - здесь ключ из ТЧ.Товары + ключ из ТЧ.Контрагенты + Сумма.

В качестве ключа в ТЧ товары - лучше добавить УИД (тип уникальный идентификатор), для ТЧ.Контрагенты - сгодится просто ссылка на Контрагента.
6 K1RSAN
 
naïve
15.10.20
09:53
(5) структура табличной части
Колонки: контрагент (в каждой строке свой) - добавляемые колонки с количеством по каждой номенклатуре - итоги
7 K1RSAN
 
naïve
15.10.20
09:54
(5) Да, обратил внимание, что при записи очищаются поля. В принципе то же самое при открытии происходить будет.
8 K1RSAN
 
naïve
15.10.20
10:00
(5) Спасибо, теперь надо прописать, как перед записью перезаполнять эти 3 ТЧ и при открытии заполнять видимую пользователем ТЧ данными
9 youalex
 
15.10.20
10:21
(8) ну я не знаю доподлинно, какая у тебя логика документа.
Но вообще, перезаполнять нужно только одну ТЧ - составную.
Т.к. ТЧ.Товары у тебя и так будет на форме в Объект.Товары,
ТЧ.Контрагенты - тоже будет незримо в Объект.Товары)

сделай две функции - одну для изменения реквизитов формы (элементы можно там же создавать)
вторую - для заполнения добавленных колонок.
Для удобства инфу о добавленных реквизитах можно хранить в реквизите формы, например, в списке значений (в Значении - ключ ТЧ.Контрагенты, в Представлении - имя добавленного реквизита.

Тогда будет что-то вроде:

Для Каждого СтрокаТовары Из Объект.Товары Цикл
  Для Каждого ЭлСписка Из ДобавленныеРеквизиты Цикл
    СтрокаТЧ = РеальныйОбъектДокумента.СуммыКонтрагентов.Добавить();
    СтрокаТЧ.УИДТовары = СтрокаТовары.УидСтроки;
    СтрокаТЧ.контрагент= ЭлСписка.Значение;
    СтрокаТЧ.Сумма = СтрокаТовары[ЭлСписка.Представление]; // ЭлСписка.Представление - имя добавленной колонки.  
  Конец Цикла
КонецЦикла;
10 K1RSAN
 
naïve
15.10.20
11:16
(9) Хотя вообще сейчас подумал - а что мешает сделать одну ТЧ - контрагент товар количество, и только для видимости в видимом реквизите формы их превращать в подобие кросс-таблицы?
11 ДенисЧ
 
15.10.20
11:17
(10) Прошло почти два часа. И ты наконец понял, что я написал в (1) )))))
12 K1RSAN
 
naïve
15.10.20
11:17
(11) Я ходил на обед)
13 Вафель
 
15.10.20
11:17
проще добавить десяток реквизитов
Реквизит1...Реквизит2 в ТЧ.
имена рисовать нужные
14 K1RSAN
 
naïve
15.10.20
11:18
(12) + но начало доходить только там, после прочтения (5)
15 K1RSAN
 
naïve
15.10.20
11:19
(13) Необходимо дать возможность пользователям сами добавлять номенклатуру. В среднем позиций больше десятка, но может стать больше или меньше. так что не вариант
16 K1RSAN
 
naïve
15.10.20
11:19
(15)+ железно прибивать реквизиты - менее всего хочу. Тем более, что там для каждой позиции 2 числа - количество ящиков и количество штук
17 youalex
 
15.10.20
11:23
(10) А если у тебя, например, не будет контрагентов, как ты через одну таблицу сохранишь данные Номенклатуры. С пустым Контрагентом? Ну, такое.
Плюс, если у тебя  в ТЧ.Номенклатура куча доп. данных, их, получается,  придется дублировать для каждого Контрагента
18 K1RSAN
 
naïve
15.10.20
11:25
(17)
1) контрагент будет всегда. Это же заявка на заказ.
2) да, в реальных реквизитах будет заполнено для каждой пары контрагент-продукция
19 youalex
 
15.10.20
11:27
Плюс, в развернутом виде тебе придется хранить всю матрицу, а в варианте с тремя таблицами - нулевые значения можно не записывать.
20 K1RSAN
 
naïve
15.10.20
11:33
(19) НУ в чем-то плюс, в чем-то минус. Оба варианта хороши, спасибо)
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн