Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Хранение данных динамически добавляемых реквизитов

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

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

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

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

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

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

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

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

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

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

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

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

Тогда будет что-то вроде:
Для Каждого СтрокаТовары Из Объект.Товары Цикл
  Для Каждого ЭлСписка Из ДобавленныеРеквизиты Цикл
    СтрокаТЧ = РеальныйОбъектДокумента.СуммыКонтрагентов.Добавить();
    СтрокаТЧ.УИДТовары = СтрокаТовары.УидСтроки;
    СтрокаТЧ.контрагент= ЭлСписка.Значение;
    СтрокаТЧ.Сумма = СтрокаТовары[ЭлСписка.Представление];// ЭлСписка.Представление - имя добавленной колонки.   

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

Список тем форума
Рекламное место пустует  Рекламное место пустует
Независимо от того, куда вы едете — это в гору и против ветра!
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.