Описание функциональности
Управляемая форма может добавить свои колонки к табличной части объекта — они существуют только в данных этой формы, в метаданных самого объекта их нет. В 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 — там та же проблема для колонок реквизита-ТаблицаЗначений, закрыта.
Описание функциональности
Управляемая форма может добавить свои колонки к табличной части объекта — они существуют только в данных этой формы, в метаданных самого объекта их нет. В
Form.xmlони лежат в блоке<Columns>основного реквизита, обёрнутые в<AdditionalColumns table="…">:В модель они не попадают: у основного реквизита
getColumns()пуст.Проверено на mdclasses 0.19.0.82-SNAPSHOT, выгрузка Конфигуратора. Приведённый выше блок добавлен в тестовую форму документа, дальше — что отдаёт
FormData.getAttributes():У реквизита-
ТаблицаЗначенийколонки видны (это #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 — там та же проблема для колонок реквизита-
ТаблицаЗначений, закрыта.