Почему не отображается добавленная колонка в динамическом списке на форме 1С?

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

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

Сценарий обычно выглядит следующим образом: разработчик открывает форму подбора в конфигураторе, изменяет произвольный запрос динамического списка СписокНоменклатура (добавляя левое соединение с регистром сведений ЦеныНоменклатуры.СрезПоследних), перетаскивает новое поле в элементы формы, запускает сеанс — а колонки на форме нет. Запрос в консоли работает корректно и возвращает данные, права у пользователя полные, но колонка упорно не отображается. В этой статье мы подробно разберем, почему возникает эта проблема, проанализируем внутренние механизмы платформы и типовых конфигураций 1С, а также рассмотрим пошаговые инструкции по её решению.

Причина 1. Программная перезапись текста запроса динамического списка

Это самая распространенная причина в современных конфигурациях ERP-класса. Текст запроса динамического списка СписокНоменклатура, который вы видите и редактируете в конфигураторе, является лишь «шаблоном» по умолчанию. При открытии формы подбора этот запрос полностью перезаписывается программно.

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

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


&После("ПриСозданииНаСервере")
Процедура Расш_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Получаем текущий программно сформированный запрос
    ТекстЗапроса = СписокНоменклатура.ТекстЗапроса;
    
    // Описываем левое соединение для получения розничной цены
    СтрокаСоединения = "ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Период, ВидЦены = &ВидЦеныРозничная) КАК ЦеныНоменклатурыСрезПоследних
    | ПО СправочникНоменклатура.Ссылка = ЦеныНоменклатурыСрезПоследних.Номенклатура";
    
    // Встраиваем соединение и новое поле в текст запроса
    // (Используем СтрЗаменить для модификации стандартного шаблона)
    ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ИЗ Справочник.Номенклатура КАК СправочникНоменклатура", "ИЗ Справочник.Номенклатура КАК СправочникНоменклатура " + СтрокаСоединения);
    ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "СправочникНоменклатура.Ссылка КАК Ссылка,", "СправочникНоменклатура.Ссылка КАК Ссылка, ЦеныНоменклатурыСрезПоследних.Цена КАК РозничнаяЦена,");
    
    // Записываем измененный текст обратно в динамический список
    СписокНоменклатура.ТекстЗапроса = ТекстЗапроса;
    
    // Устанавливаем параметры запроса
    СписокНоменклатура.Параметры.УстановитьЗначениеПараметра("Период", ТекущаяДата());
    СписокНоменклатура.Параметры.УстановитьЗначениеПараметра("ВидЦеныРозничная", Справочники.ВидыЦен.НайтиПоНаименованию("Розничная"));
    
    // Программно добавляем колонку на форму, если её там еще нет
    Если Элементы.Найти("СписокНоменклатураРозничнаяЦена") = Неопределено Тогда
        НовыйЭлемент = Элементы.Добавить("СписокНоменклатураРозничнаяЦена", Тип("ПолеФормы"), Элементы.СписокНоменклатура);
        НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
        НовыйЭлемент.ПутьКДанным = "СписокНоменклатура.РозничнаяЦена";
        НовыйЭлемент.Заголовок = "Розничная цена";
    КонецЕсли;
    
КонецПроцедуры

Причина 2. Специфика структуры формы подбора (несколько таблиц на форме)

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

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

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

Причина 3. Программное управление видимостью и условным оформлением

В типовых конфигурациях 1С активно используется программное управление интерфейсом. В зависимости от контекста вызова (например, из какого документа открывается подбор — из «Реализации товаров» или из «Сборки товаров»), система скрывает или показывает определенные колонки.

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

Решение: Нам необходимо проверить, как ведет себя свойство видимости нашей колонки во время выполнения. Разберем по шагам, как это локализовать:

  1. Поставьте точку останова в самом конце процедуры ПриСозданииНаСервере формы подбора.
  2. В табло отладчика вычислите выражение: Элементы.ИмяВашейКолонки.Видимость и Элементы.ИмяВашейКолонки.ПользовательскаяВидимость.
  3. Если одно из свойств равно Ложь, найдите в модуле формы вызовы процедур настройки колонок (например, УстановитьВидимостьКолонок() или ОбновитьПанельИнформации()) и скорректируйте их логику в расширении.

Также обратите внимание на компоновщик настроек динамического списка. Иногда поля отключаются там программно. Посмотрим на пример кода для проверки использования поля в компоновщике:


// Проверяем, выбрано ли поле в компоновщике настроек
Для Каждого ЭлементВыбора Из СписокНоменклатура.КомпоновщикНастроек.Настройки.Выбор.Элементы Цикл
    Если ЭлементВыбора.Поле = Новый ПолеКомпоновкиДанных("РозничнаяЦена") Тогда
        ЭлементВыбора.Использование = Истина;
    КонецЕсли;
КонецЦикла;

Причина 4. Сохраненный кэш пользовательских настроек формы

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

Решение: Сбросьте настройки формы к стандартным. Для этого в пользовательском режиме непосредственно на форме подбора выполните следующие действия:

  1. Нажмите кнопку Еще в правом верхнем углу формы.
  2. Выберите пункт Изменить форму...
  3. В открывшемся окне настроек нажмите кнопку Еще (внутри этого окна) и выберите Установить стандартные настройки.
  4. Нажмите ОК. Колонки перерисуются в соответствии с текущей конфигурацией.

Если это не помогло или вам нужно сбросить кэш для всех пользователей, перейдите в раздел Администрирование -> Настройки пользователей и прав -> Очистка настроек, найдите нужную форму подбора и удалите сохраненные настройки для целевых пользователей.

Причина 5. Права доступа и функциональные опции

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

Аналогично работают функциональные опции. Если в системе отключена опция «Несколько видов цен» или «Использовать ценообразование», и ваше новое поле связано с этой опцией в конфигураторе, платформа скроет колонку.

Решение: Убедитесь в роли текущего пользователя, что у него есть доступ к регистру сведений ЦеныНоменклатуры. Также проверьте в конфигураторе свойства вашей новой колонки — поле ФункциональныеОпции должно быть пустым, либо соответствующая опция должна быть гарантированно включена в режиме предприятия.

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

← На главную