Skip to content

[NEW] Дополнительные колонки табличной части, объявленные на форме (<AdditionalColumns>), не попадают в FormAttribute #679

Description

@sfaqer

Описание функциональности

Управляемая форма может добавить свои колонки к табличной части объекта — они существуют только в данных этой формы, в метаданных самого объекта их нет. В Form.xml они лежат в блоке <Columns> основного реквизита, обёрнутые в <AdditionalColumns table="…">:

<Attribute name="Объект" id="1">
  <Type><v8:Type>cfg:DocumentObject.ЗаказПоставщику</v8:Type></Type>
  <MainAttribute>true</MainAttribute>
  <SavedData>true</SavedData>
  <Columns>
    <AdditionalColumns table="Объект.ЭтапыГрафикаОплаты"/>
    <AdditionalColumns table="Объект.Товары">
      <Column name="ТипНоменклатуры" id="2">
        <Title>…</Title>
        <Type><v8:Type>cfg:EnumRef.ТипыНоменклатуры</v8:Type></Type>
      </Column>
      <Column name="ХарактеристикиИспользуются" id="3">
        <Type><v8:Type>xs:boolean</v8:Type></Type>
      </Column>
    </AdditionalColumns>
  </Columns>
</Attribute>

В модель они не попадают: у основного реквизита getColumns() пуст.

Проверено на mdclasses 0.19.0.82-SNAPSHOT, выгрузка Конфигуратора. Приведённый выше блок добавлен в тестовую форму документа, дальше — что отдаёт FormData.getAttributes():

реквизит Объект         main=true  тип=[ДокументОбъект.Документ1]        колонок=0
реквизит Компоновщик    main=false тип=[КомпоновщикНастроекКомпоновкиДанных] колонок=0
реквизит ТаблицаПодбора main=false тип=[ТаблицаЗначений]                 колонок=2
    Номенклатура тип=[СправочникСсылка.Справочник1]
    Количество   тип=[Число]

У реквизита-ТаблицаЗначений колонки видны (это #666), у объектного реквизита с <AdditionalColumns> — ноль.

Почему так выходит

Похоже, дело в FormElementReaderContext.mergeAdditionalColumns(): записи <AdditionalColumns> читаются как FormAttribute с именем вида Объект.Товары (с точкой), а потом вливаются в уже существующую одноимённую колонку реквизита-владельца.

Для реквизита-ТаблицаЗначений это работает: его собственные колонки объявлены тут же, в Form.xml, — есть куда вливать. А у объектного реквизита табличные части в Form.xml не перечислены вовсе (они приходят из метаданных объекта), совпадения не находится, и запись теряется целиком.

Что хотелось бы получить

Доступ к дополнительным колонкам вместе с указанием таблицы, к которой они относятся: значение атрибута table (Объект.Товары) плюс список колонок теми же FormAttribute — с именем, заголовком и типом.

Формой не принципиально: либо отдельный аксессор у FormAttribute (что-то вроде getAdditionalColumns()Map<String, List<FormAttribute>> или список записей «таблица + колонки»), либо оставить их в getColumns() как есть, не пытаясь слить, — тогда потребитель сам разберёт по имени с точкой. Важно, чтобы не пропадали и чтобы было понятно, какой табличной части они принадлежат: у одного реквизита блоков <AdditionalColumns> несколько, по одному на табличную часть.

Зачем

BSL Language Server типизирует данные управляемой формы: за Объект.Товары там стоит не табличная часть объекта, а ДанныеФормыКоллекция со строкой ДанныеФормыЭлементКоллекции, и колонки строки мы берём из табличной части объекта. Дополнительных колонок формы среди них нет, поэтому обращение к ним в модуле формы не резолвится, а диагностика UnknownMember считает их опечаткой:

ДанныеСтроки = Объект.Товары.НайтиПоИдентификатору(Строка);
ДанныеСтроки.ТипНоменклатуры // У типа «ДанныеФормыЭлементКоллекции.ДокументТабличнаяЧасть.ЗаказПоставщику.Товары»
                             // нет метода или свойства «ТипНоменклатуры»

Пример живой: Документ.ЗаказПоставщику.Форма.ФормаДокумента в 1С:ERP. Приём распространённый — на форму добавляют служебные колонки (тип номенклатуры, признаки, расчётные значения), чтобы не гонять их запросом на каждую строку.

Ссылка на близкое: #666 — там та же проблема для колонок реквизита-ТаблицаЗначений, закрыта.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions