Почему не отображается новая колонка в списке номенклатуры 1С:УТ 11?

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

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

Казалось бы, алгоритм прост: добавили поле в запрос динамического списка, вытащили колонку на форму, обновили конфигурацию базы данных — и готово. Однако в реальности колонка упорно не появляется на экране. В этой статье мы подробно разберем, почему так происходит, проанализируем механизмы работы типовых решений и найдем правильный способ реализации задачи.

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

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

Проанализируем работу системы на примере списка номенклатуры. В конфигурации 1С:Управление торговлей существует специальный механизм, который динамически достраивает запрос в зависимости от включенных функциональных опций (использование характеристик, упаковок, различных видов запасов и т.д.).

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

Причина 2: Свойство «Использовать всегда»

Выясним, как платформа 1С оптимизирует работу динамических списков. Платформа старается минимизировать нагрузку на сервер СУБД и запрашивает только те поля, которые непосредственно выведены на экран пользователя или участвуют в оформлении.

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

  1. Откройте свойства динамического списка в конфигураторе.
  2. Перейдите в настройки списка, найдите ваше новое поле.
  3. Установите флажок в колонке Использовать всегда.

Это гарантирует, что поле Остаток (или любое другое) будет включено в SELECT запрос вне зависимости от видимости колонки.

Причина 3: Кэширование пользовательских настроек

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

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

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

Как правильно добавить колонку через расширение

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

Рассмотрим примерный алгоритм действий для программиста:

  1. Создайте новое расширение или используйте существующее.
  2. Найдите общий модуль РаботаСНоменклатуройУТ (название может незначительно отличаться в разных версиях УТ/ERP).
  3. Найдите процедуру или функцию, отвечающую за подготовку текста запроса (например, ТекстЗапросаСпискаНоменклатуры).
  4. Добавьте эту функцию в расширение с аннотацией &После или &Вместо.

Пример кода в расширении для добавления своего поля в запрос:


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

    Возврат Результат;
КонецФункции

Нюансы производительности при выводе остатков

Проанализируем ситуацию с производительностью. Вывод остатков в динамическом списке — это ресурсоемкая операция. Если вы просто добавите соединение с таблицей остатков в основной запрос, список может начать «тормозить» при прокрутке, особенно если в базе десятки тысяч позиций номенклатуры.

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

Если вы решили идти по пути прямого изменения запроса, обязательно убедитесь, что:

Резюме

Если колонка не добавляется в список номенклатуры УТ 11, пройдите по следующему чек-листу:

  1. Сбросьте настройки формы в режиме предприятия («Еще» — «Установить стандартные настройки»).
  2. Проверьте свойство Использовать всегда для поля в настройках динамического списка.
  3. Найдите в коде формы (процедура ПриСозданииНаСервере) вызовы функций общих модулей, которые могут переопределять текст запроса.
  4. Если подмена текста происходит в общем модуле, используйте расширение для модификации возвращаемой строки запроса.
  5. Убедитесь, что у пользователя достаточно прав доступа на таблицы, данные из которых вы выводите в новую колонку.

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

← На главную