При разработке в среде 1С:Предприятие 8.3, особенно в крупных типовых решениях вроде УТ 11, программисты часто сталкиваются с ситуацией: в расширении добавлен новый реквизит или вычисляемое поле в запрос динамического списка, но в пользовательском режиме колонка упорно не появляется. Даже в меню «Изменить форму» поле отсутствует, хотя все права и видимость настроены верно. Рассмотрим подробно, почему это происходит и как решить данную проблему, проанализировав как стандартные механизмы платформы, так и специфические нюансы расширений.
Прежде чем приступать к написанию кода, нам необходимо понять, на каком этапе «теряется» наше поле. Существует три основных уровня, где может возникнуть сбой:
Первым делом нам нужно убедиться, что поле действительно присутствует в итоговом запросе, который платформа отправляет к СУБД. В типовых конфигурациях (УТ, ERP, КА) текст запроса динамического списка часто переопределяется программно в процедуре ПриСозданииНаСервере.
Рассмотрим, как проверить реальное состояние запроса. Установим точку останова в конце процедуры ПриСозданииНаСервере в модуле формы (в расширении, используя метод &После). В окне «Вычислить выражение» проверим свойство:
Список.ТекстЗапроса
Если в полученном тексте вы не видите конструкции " " КАК ИмяВашейКолонки, значит, основной код конфигурации полностью перезаписывает свойство ТекстЗапроса, игнорируя ваши изменения в визуальном редакторе расширения. В этом случае нам необходимо принудительно добавить поле программно:
&НаСервере
Процедура Расш1_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
// Добавляем наше поле в текст запроса, если его там нет
Если Найти(Список.ТекстЗапроса, "ИмяВашейКолонки") = 0 Тогда
ТекстЗапроса = Список.ТекстЗапроса;
// Простейшая замена для демонстрации, логика зависит от структуры запроса
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ВЫБРАТЬ", "ВЫБРАТЬ "" "" КАК ИмяВашейКолонки, ");
Список.ТекстЗапроса = ТекстЗапроса;
КонецЕсли;
КонецПроцедуры
В конфигурации Управление торговлей 11 механизмы функциональных опций работают очень агрессивно, ограничивая видимость реквизитов справочников. Если ваше поле в запросе каким-то образом связано с реквизитами, которые отключены в настройках программы, платформа может автоматически исключить колонку из списка доступных полей.
Выясним причину через свойства динамического списка. Убедитесь, что в расширении для вашего поля в списке «Поля» динамического списка не выбрана никакая функциональная опция в свойстве «Функциональные опции». Если вы просто добавили " " КАК МоеПоле, проверьте, не установлена ли ФО на саму форму или на группу элементов, в которую вы пытаетесь поместить колонку.
Иногда визуальное добавление элемента в расширении не срабатывает из-за особенностей платформы 8.3.27 и выше. Попробуем создать элемент программно. Это гарантирует, что платформа попытается инициализировать поле непосредственно при запуске формы.
Рассмотрим пример кода для программного добавления колонки:
&НаСервере
Процедура Расш1_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
ИмяЭлемента = "СписокИмяВашейКолонки";
// Проверяем, не был ли элемент уже создан (например, в основной конфигурации)
Если Элементы.Найти(ИмяЭлемента) = Неопределено Тогда
// Добавляем поле в таблицу "Список"
НоваяКолонка = Элементы.Добавить(ИмяЭлемента, Тип("ПолеФормы"), Элементы.Список);
НоваяКолонка.Вид = ВидПоляФормы.ПолеНадписи;
НоваяКолонка.ПутьКДанным = "Список.ИмяВашейКолонки"; // Указываем путь к полю в запросе
НоваяКолонка.Заголовок = "Статус обработки";
НоваяКолонка.Видимость = Истина;
КонецЕсли;
КонецПроцедуры
Важно помнить: если ПутьКДанным указывает на поле, которого нет в Список.КомпоновкаДанных.Настройки.ДоступныеПоляВыбора, система выдаст ошибку или не отобразит данные. Поэтому убедитесь, что в схеме запроса динамического списка установлена галочка "Автозаполнение доступных полей".
Часто проблема кроется не в коде, а в сохраненных настройках пользователя. Платформа 1С сохраняет состояние формы (состав и порядок колонок) для каждого пользователя индивидуально. Если пользователь уже открывал форму до того, как вы добавили колонку в расширение, в его сохраненных настройках этой колонки просто нет, и она может быть скрыта по умолчанию.
Выполним следующие действия для проверки:
Для разработчика это сигнал, что при развертывании обновления на рабочую базу может потребоваться программная очистка настроек формы для всех пользователей через ХранилищеСистемныхНастроек.
Посмотрим на ситуацию со стороны метаданных расширения. При модификации динамического списка у вас есть два пути изменения запроса: «Изменять» (платформа пытается объединить ваш кусок запроса с основным) и «Заменять» (платформа полностью берет текст из расширения).
В сложных запросах УТ 11 алгоритм объединения (Merge) может отработать некорректно. Попробуйте переключить способ редактирования запроса в расширении на «Заменять», скопируйте полный текст запроса из основной конфигурации и добавьте в него свою колонку. Это исключит неоднозначность при компиляции запроса платформой.
Если вы планируете заполнять колонку данными в событии ПриПолученииДанныхНаСервере, платформа может оптимизировать запрос и не выбирать ваше пустое поле, если оно не выведено на форму или скрыто. Чтобы гарантировать наличие поля в структуре данных, зайдите в настройки динамического списка, выберите ваше поле и установите свойство «Использовать всегда» (Always Select). Это заставит систему включать поле в выборку СУБД независимо от его видимости на экране.
Проанализировав все вышеперечисленные шаги, мы можем сделать вывод, что наиболее стабильным решением для добавления произвольных колонок в динамические списки через расширения является сочетание программного добавления элемента формы и явного указания поля в тексте запроса с установленным флагом принудительной выборки.