Суть
Колонки, добавленные через промежуточную переменную с коллекцией колонок, к таблице не привязываются — строка таблицы о них не знает.
// Возвращаемое значение:
// ТаблицаЗначений:
// * Описанная - Строка
//
Функция ТаблицаИзОписания() Экспорт
Таблица = Новый ТаблицаЗначений;
Таблица.Колонки.Добавить("Описанная", Новый ОписаниеТипов("Строка"));
Возврат Таблица;
КонецФункции
Процедура Прямо()
Табл = ТаблицаИзОписания();
Табл.Колонки.Добавить("Добавленная", Новый ОписаниеТипов("Число"));
Строка = Табл.Добавить();
A = Строка.Добавленная; // ✅ разрешается
КонецПроцедуры
Процедура ЧерезПеременную()
Табл = ТаблицаИзОписания();
Колонки = Табл.Колонки;
Колонки.Добавить("ЧерезПеременную", Новый ОписаниеТипов("Число"));
Строка = Табл.Добавить();
B = Строка.ЧерезПеременную; // ❌ «У типа "СтрокаТаблицыЗначений" нет метода или свойства "ЧерезПеременную"»
КонецПроцедуры
Прямой вызов Табл.Колонки.Добавить(...) работает, в том числе поверх колонок из описания. Не работает только вариант с переменной: разбор операторов-мутаторов ищет вызовы на самой переменной-таблице, а вызов на переменной, в которой лежит Табл.Колонки, к таблице не привязывается.
Где встречается
Приём распространён в «Стандартных подсистемах 3.1»:
// cf/CommonModules/ВариантыОтчетов/Ext/Module.bsl
Колонки = ПользовательскиеВарианты.Колонки;
Колонки.Найти("Отчет").Имя = "ОтчетПолноеИмя";
Колонки.Добавить("Определен", Новый ОписаниеТипов("Булево"));
Для Каждого ОписаниеВарианта Из ПользовательскиеВарианты Цикл
... ОписаниеВарианта.Определен ...
На SSL из-за этого остаётся часть срабатываний UnknownMember на СтрокаТаблицыЗначений (порядка 70 находок в 16 файлах — вместе со случаями переименования колонок, см. ниже).
Соседний случай: переименование колонки
Там же встречается изменение состава колонок переименованием:
Колонки.Найти("Отчет").Имя = "ОтчетПолноеИмя";
После этого колонки Отчет у таблицы больше нет, а есть ОтчетПолноеИмя. Ни то, ни другое сейчас не учитывается. Случай реже и сложнее (нужно отследить присваивание свойства Имя у найденной колонки), но природа та же — состав колонок меняется в коде.
Как воспроизвести
Проанализировать приведённый выше модуль с включённой UnknownMember ({"diagnostics": {"mode": "except", "parameters": {"Typo": false}}}): находка появится только на Строка.ЧерезПеременную.
Контекст
Обнаружено при разборе результатов #4348, где колонки из описания начали доезжать до строки таблицы. До этого строка не знала вообще ни одной колонки, поэтому подобные обращения не проверялись.
Суть
Колонки, добавленные через промежуточную переменную с коллекцией колонок, к таблице не привязываются — строка таблицы о них не знает.
Прямой вызов
Табл.Колонки.Добавить(...)работает, в том числе поверх колонок из описания. Не работает только вариант с переменной: разбор операторов-мутаторов ищет вызовы на самой переменной-таблице, а вызов на переменной, в которой лежитТабл.Колонки, к таблице не привязывается.Где встречается
Приём распространён в «Стандартных подсистемах 3.1»:
На SSL из-за этого остаётся часть срабатываний
UnknownMemberнаСтрокаТаблицыЗначений(порядка 70 находок в 16 файлах — вместе со случаями переименования колонок, см. ниже).Соседний случай: переименование колонки
Там же встречается изменение состава колонок переименованием:
После этого колонки
Отчету таблицы больше нет, а естьОтчетПолноеИмя. Ни то, ни другое сейчас не учитывается. Случай реже и сложнее (нужно отследить присваивание свойстваИмяу найденной колонки), но природа та же — состав колонок меняется в коде.Как воспроизвести
Проанализировать приведённый выше модуль с включённой
UnknownMember({"diagnostics": {"mode": "except", "parameters": {"Typo": false}}}): находка появится только наСтрока.ЧерезПеременную.Контекст
Обнаружено при разборе результатов #4348, где колонки из описания начали доезжать до строки таблицы. До этого строка не знала вообще ни одной колонки, поэтому подобные обращения не проверялись.