Как добавить колонку с реквизитом из расширения в форму списка справочника Номенклатура в УТ 11.4

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Торговля и дистрибуция
← На главную

При работе с современными конфигурациями на платформе 1С:Предприятие 8.3, такими как Управление торговлей 11.4, ERP 2.4 или Комплексная автоматизация 2.4, разработчики часто сталкиваются с ситуацией, когда добавление нового реквизита в форму списка через расширение не приносит желаемого результата. В конфигураторе колонка добавлена, в запросе динамического списка поле присутствует, флаг "Использовать всегда" установлен, но в режиме "Предприятие" колонка упорно не отображается. Рассмотрим подробнее, почему это происходит и как правильно решить данную задачу.

Анализируем причину: программное формирование запроса

Главная особенность типовых решений на базе 1С:УТ 11 заключается в том, что текст запроса динамического списка для справочника Номенклатура (и многих других) не является статичным. Даже если мы изменим его в визуальном редакторе расширения, система при создании формы может полностью переопределить свойство ТекстЗапроса программным способом.

Разберем, как это работает. В модуле формы или связанных общих модулях вызываются специальные процедуры, которые собирают текст запроса "на лету" в зависимости от включенных функциональных опций, настроек отображения остатков, характеристик и упаковок. Например, часто используется метод РаботаСНоменклатуройУТ.ПолучитьДополненныйЗапросДинамическогоСписка. Если наше новое поле не включено в этот программный алгоритм, оно просто исчезнет из итогового запроса, который будет исполнен платформой.

Шаг 1. Перехват программного формирования запроса

Для того чтобы наше поле гарантированно попало в выборку, нам необходимо вмешаться в процесс формирования текста запроса. Самый надежный способ — использовать механизм расширений и перехватить процедуру ПриСозданииНаСервере в модуле формы списка Номенклатуры. Мы применим аннотацию &После, чтобы дополнить уже сформированный системой запрос.

Проанализируем ситуацию: нам нужно убедиться, что в тексте запроса динамического списка присутствует наш реквизит. Посмотрим на пример кода, который решает эту задачу:


&После("ПриСозданииНаСервере")
Процедура Расш1_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
    
    // Получаем текущий текст запроса
    ТекстЗапроса = Список.ТекстЗапроса;
    
    // Проверяем, добавлено ли уже наше поле (чтобы избежать дублирования)
    Если Найти(ТекстЗапроса, "МойПрефикс_НовыйРеквизит") = 0 Тогда
        // Вставляем поле в секцию SELECT. 
        // Внимание: логика замены зависит от структуры оригинального запроса
        ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "СправочникНоменклатура.Ссылка", "СправочникНоменклатура.Ссылка, СправочникНоменклатура.МойПрефикс_НовыйРеквизит КАК МойПрефикс_НовыйРеквизит");
        Список.ТекстЗапроса = ТекстЗапроса;
    КонецЕсли;

КонецПроцедуры

Обратите внимание, что использование СтрЗаменить — это простой, но хрупкий метод. В более сложных случаях рекомендуется использовать объект СхемаЗапроса, который позволяет программно манипулировать частями запроса более безопасно.

Шаг 2. Обеспечение видимости поля в списке выбора

Даже если поле добавлено в запрос, платформа может не отобразить его автоматически на форме, если оно не включено в коллекцию выбранных полей динамического списка. Выясним, как заставить систему "увидеть" колонку. После модификации текста запроса в той же процедуре ПриСозданииНаСервере нам нужно явно добавить поле в настройки списка.

Рассмотрим пример реализации:


НовоеПоле = Список.ВыбранныеПоля.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
НовоеПоле.Поле = Новый ПолеКомпоновкиДанных("МойПрефикс_НовыйРеквизит");
НовоеПоле.Использование = Истина;

Это действие аналогично установке галочки в настройках формы в режиме "Предприятие", но выполняется принудительно для всех пользователей.

Шаг 3. Проверка прав доступа и функциональных опций

Если после всех манипуляций в коде колонка всё еще не появилась, проанализируем настройки безопасности в расширении. Это критически важный момент для версии платформы 8.3.15 и выше.

  1. Роли в расширении: Если реквизит создан непосредственно в расширении, убедитесь, что в этом же расширении создана роль, дающая право на "Чтение" и "Просмотр" этого реквизита. Эта роль должна быть назначена пользователю либо в свойствах расширения должен стоять флаг "Использовать основные роли всех профилей".
  2. Функциональные опции: Проверьте свойство Функциональные опции у вашего реквизита в расширении. Если вы случайно привязали его к какой-либо опции, которая выключена в базе, колонка будет скрыта системой автоматически.

Шаг 4. Работа с пользовательскими настройками

Часто проблема кроется не в коде, а в кэшированных настройках формы самого пользователя. 1С сохраняет положение и видимость колонок. Если пользователь ранее открывал форму, его старые настройки "перекрывают" ваши изменения в конфигураторе.

Выясним, как это исправить. В режиме "1С:Предприятие" необходимо:

  1. Открыть форму списка номенклатуры.
  2. Нажать кнопку "Еще" — "Установить стандартные настройки".
  3. Если это не помогло, зайти в "Изменить форму" и проверить, появилось ли ваше поле в списке доступных. Если оно есть, но выключено — просто включите его.

Дополнительные рекомендации при работе с УТ 11

Посмотрим на ситуацию шире. В типовой конфигурации УТ 11 существует общий модуль РаботаСНоменклатуройКлиентСервер. В нем могут быть вспомогательные функции для работы с динамическими списками. Если вы планируете часто вносить изменения, лучше изучить, как система добавляет стандартные поля (например, остатки), и действовать по аналогии.

Также важно помнить про ПутьКДанным. Если вы добавили колонку на форму вручную через дерево элементов в расширении, убедитесь, что свойство ПутьКДанным точно совпадает с именем поля в запросе (с учетом префикса расширения). Например: Список.МойПрефикс_НовыйРеквизит.

Подводя итог, можно сказать, что решение задачи добавления колонки в Номенклатуру требует комплексного подхода: корректировки программного формирования запроса, проверки прав доступа в расширении и сброса пользовательских настроек формы. Следуя этим шагам, вы сможете успешно отобразить любые данные из расширения в интерфейсе пользователя.

← На главную