При работе с современными конфигурациями на платформе 1С:Предприятие 8.3, такими как Управление торговлей 11.4, ERP 2.4 или Комплексная автоматизация 2.4, разработчики часто сталкиваются с ситуацией, когда добавление нового реквизита в форму списка через расширение не приносит желаемого результата. В конфигураторе колонка добавлена, в запросе динамического списка поле присутствует, флаг "Использовать всегда" установлен, но в режиме "Предприятие" колонка упорно не отображается. Рассмотрим подробнее, почему это происходит и как правильно решить данную задачу.
Главная особенность типовых решений на базе 1С:УТ 11 заключается в том, что текст запроса динамического списка для справочника Номенклатура (и многих других) не является статичным. Даже если мы изменим его в визуальном редакторе расширения, система при создании формы может полностью переопределить свойство ТекстЗапроса программным способом.
Разберем, как это работает. В модуле формы или связанных общих модулях вызываются специальные процедуры, которые собирают текст запроса "на лету" в зависимости от включенных функциональных опций, настроек отображения остатков, характеристик и упаковок. Например, часто используется метод РаботаСНоменклатуройУТ.ПолучитьДополненныйЗапросДинамическогоСписка. Если наше новое поле не включено в этот программный алгоритм, оно просто исчезнет из итогового запроса, который будет исполнен платформой.
Для того чтобы наше поле гарантированно попало в выборку, нам необходимо вмешаться в процесс формирования текста запроса. Самый надежный способ — использовать механизм расширений и перехватить процедуру ПриСозданииНаСервере в модуле формы списка Номенклатуры. Мы применим аннотацию &После, чтобы дополнить уже сформированный системой запрос.
Проанализируем ситуацию: нам нужно убедиться, что в тексте запроса динамического списка присутствует наш реквизит. Посмотрим на пример кода, который решает эту задачу:
&После("ПриСозданииНаСервере")
Процедура Расш1_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
// Получаем текущий текст запроса
ТекстЗапроса = Список.ТекстЗапроса;
// Проверяем, добавлено ли уже наше поле (чтобы избежать дублирования)
Если Найти(ТекстЗапроса, "МойПрефикс_НовыйРеквизит") = 0 Тогда
// Вставляем поле в секцию SELECT.
// Внимание: логика замены зависит от структуры оригинального запроса
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "СправочникНоменклатура.Ссылка", "СправочникНоменклатура.Ссылка, СправочникНоменклатура.МойПрефикс_НовыйРеквизит КАК МойПрефикс_НовыйРеквизит");
Список.ТекстЗапроса = ТекстЗапроса;
КонецЕсли;
КонецПроцедуры
Обратите внимание, что использование СтрЗаменить — это простой, но хрупкий метод. В более сложных случаях рекомендуется использовать объект СхемаЗапроса, который позволяет программно манипулировать частями запроса более безопасно.
Даже если поле добавлено в запрос, платформа может не отобразить его автоматически на форме, если оно не включено в коллекцию выбранных полей динамического списка. Выясним, как заставить систему "увидеть" колонку. После модификации текста запроса в той же процедуре ПриСозданииНаСервере нам нужно явно добавить поле в настройки списка.
Рассмотрим пример реализации:
НовоеПоле = Список.ВыбранныеПоля.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
НовоеПоле.Поле = Новый ПолеКомпоновкиДанных("МойПрефикс_НовыйРеквизит");
НовоеПоле.Использование = Истина;
Это действие аналогично установке галочки в настройках формы в режиме "Предприятие", но выполняется принудительно для всех пользователей.
Если после всех манипуляций в коде колонка всё еще не появилась, проанализируем настройки безопасности в расширении. Это критически важный момент для версии платформы 8.3.15 и выше.
Функциональные опции у вашего реквизита в расширении. Если вы случайно привязали его к какой-либо опции, которая выключена в базе, колонка будет скрыта системой автоматически.Часто проблема кроется не в коде, а в кэшированных настройках формы самого пользователя. 1С сохраняет положение и видимость колонок. Если пользователь ранее открывал форму, его старые настройки "перекрывают" ваши изменения в конфигураторе.
Выясним, как это исправить. В режиме "1С:Предприятие" необходимо:
Посмотрим на ситуацию шире. В типовой конфигурации УТ 11 существует общий модуль РаботаСНоменклатуройКлиентСервер. В нем могут быть вспомогательные функции для работы с динамическими списками. Если вы планируете часто вносить изменения, лучше изучить, как система добавляет стандартные поля (например, остатки), и действовать по аналогии.
Также важно помнить про ПутьКДанным. Если вы добавили колонку на форму вручную через дерево элементов в расширении, убедитесь, что свойство ПутьКДанным точно совпадает с именем поля в запросе (с учетом префикса расширения). Например: Список.МойПрефикс_НовыйРеквизит.
Подводя итог, можно сказать, что решение задачи добавления колонки в Номенклатуру требует комплексного подхода: корректировки программного формирования запроса, проверки прав доступа в расширении и сброса пользовательских настроек формы. Следуя этим шагам, вы сможете успешно отобразить любые данные из расширения в интерфейсе пользователя.