Почему не отображается новая колонка в динамическом списке Номенклатуры в УТ 11 и как это исправить?

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

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

Причина 1. Программное переопределение запроса в общем модуле

Это самая частая причина. В типовой конфигурации УТ 11 запрос для списка номенклатуры не является статичным. Чтобы обеспечить высокую производительность и поддержку различных режимов (отображение остатков, цен, работы с корзиной), система собирает текст запроса динамически в момент открытия формы или изменения настроек поиска.

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

Для решения этой проблемы нам необходимо использовать механизм &Вместо или &После для перехвата процедур, формирующих запрос. Рассмотрим пример, где мы дополняем запрос своим полем:


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

Обратите внимание, что в современных версиях УТ 11 часто используется внедрение полей через структуру свойств. Проверьте процедуры в модуле РаботаСНоменклатуройУТ, такие как ДополнитьЗапросПолями.

Причина 2. Использование альтернативных таблиц списка (Поиск)

В форме списка справочника Номенклатура в УТ 11 используется не один элемент типа Таблица, а несколько. В зависимости от действий пользователя система подменяет основной список другими. Разберем их:

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

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

Причина 3. Пользовательские настройки формы

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

Выясним, как это сбросить. В режиме «1С:Предприятие» выполните следующие шаги:

  1. Зайдите в форму списка номенклатуры.
  2. Нажмите кнопку Еще — Изменить форму....
  3. В открывшемся окне нажмите Еще — Установить стандартные настройки.

Это заставит систему перечитать структуру формы из расширения и отобразить новые элементы, которые были скрыты в пользовательском кэше.

Причина 4. Права доступа и роли в расширении

Если ваш реквизит Остаток создан непосредственно в расширении, по умолчанию у пользователей (кроме полных прав) может не быть на него прав. В отличие от основной конфигурации, права в расширении нужно настраивать внимательно.

Проанализируем ситуацию с правами:

Если прав на чтение поля нет, 1С исключит это поле из динамического списка без вывода ошибок, и в отладке вы увидите пустое значение или отсутствие колонки.

Причина 5. Кэширование метаданных и серверный кэш

Иногда изменения в динамических списках через расширения «застревают» на уровне сервера приложений. Если вы уверены, что код верен, а настройки формы сброшены, попробуйте следующие технические действия:

  1. Запустите сеанс с параметром /ClearCache.
  2. В консоли администрирования серверов 1С перезапустите рабочий процесс или службу 1C:Enterprise Server.
  3. Попробуйте удалить расширение из базы и добавить его заново (это принудительно обновит кэш метаданных расширений).

Методика отладки динамического списка

Чтобы точно понять, в какой момент пропадает поле, выполните следующие действия в процедуре ПриСозданииНаСервере:


&После("ПриСозданииНаСервере")
Процедура Мой_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Проверим, есть ли колонка в элементах формы в самом конце создания
    ЭлементКолонка = Элементы.Найти("Остаток");
    Если ЭлементКолонка = Неопределено Тогда
        Сообщить("Элемент 'Остаток' не найден в коллекции Элементы!");
    Иначе
        // Проверим путь к данным
        Сообщить("Путь к данным колонки: " + ЭлементКолонка.ПутьКДанным);
    КонецЕсли;
    
    // Проверим текст запроса динамического списка
    Текст = Список.ТекстЗапроса;
    Если Найти(Текст, "Остаток") = 0 Тогда
        Сообщить("В итоговом тексте запроса поле 'Остаток' отсутствует!");
    КонецЕсли;
    
КонецПроцедуры

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

Рассмотренные шаги помогут вам надежно добавить любую колонку в список номенклатуры, сохранив при этом стабильность работы типовых механизмов 1С:УТ 11.

← На главную