Skip to content

Колонки, добавленные через промежуточную переменную, не привязываются к таблице #4359

Description

@nixel2007

Суть

Колонки, добавленные через промежуточную переменную с коллекцией колонок, к таблице не привязываются — строка таблицы о них не знает.

// Возвращаемое значение:
//  ТаблицаЗначений:
//   * Описанная - Строка
//
Функция ТаблицаИзОписания() Экспорт
	Таблица = Новый ТаблицаЗначений;
	Таблица.Колонки.Добавить("Описанная", Новый ОписаниеТипов("Строка"));
	Возврат Таблица;
КонецФункции

Процедура Прямо()
	Табл = ТаблицаИзОписания();
	Табл.Колонки.Добавить("Добавленная", Новый ОписаниеТипов("Число"));
	Строка = Табл.Добавить();
	A = Строка.Добавленная;        // ✅ разрешается
КонецПроцедуры

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

Прямой вызов Табл.Колонки.Добавить(...) работает, в том числе поверх колонок из описания. Не работает только вариант с переменной: разбор операторов-мутаторов ищет вызовы на самой переменной-таблице, а вызов на переменной, в которой лежит Табл.Колонки, к таблице не привязывается.

Где встречается

Приём распространён в «Стандартных подсистемах 3.1»:

// cf/CommonModules/ВариантыОтчетов/Ext/Module.bsl
Колонки = ПользовательскиеВарианты.Колонки;
Колонки.Найти("Отчет").Имя = "ОтчетПолноеИмя";
Колонки.Добавить("Определен", Новый ОписаниеТипов("Булево"));
Для Каждого ОписаниеВарианта Из ПользовательскиеВарианты Цикл
	... ОписаниеВарианта.Определен ...

На SSL из-за этого остаётся часть срабатываний UnknownMember на СтрокаТаблицыЗначений (порядка 70 находок в 16 файлах — вместе со случаями переименования колонок, см. ниже).

Соседний случай: переименование колонки

Там же встречается изменение состава колонок переименованием:

Колонки.Найти("Отчет").Имя = "ОтчетПолноеИмя";

После этого колонки Отчет у таблицы больше нет, а есть ОтчетПолноеИмя. Ни то, ни другое сейчас не учитывается. Случай реже и сложнее (нужно отследить присваивание свойства Имя у найденной колонки), но природа та же — состав колонок меняется в коде.

Как воспроизвести

Проанализировать приведённый выше модуль с включённой UnknownMember ({"diagnostics": {"mode": "except", "parameters": {"Typo": false}}}): находка появится только на Строка.ЧерезПеременную.

Контекст

Обнаружено при разборе результатов #4348, где колонки из описания начали доезжать до строки таблицы. До этого строка не знала вообще ни одной колонки, поэтому подобные обращения не проверялись.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions