Почему не отображаются новые реквизиты в списке Номенклатуры УТ 11.5 через расширение?

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

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

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

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

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

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


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

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

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

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

Однако в коде или в условном оформлении это поле может быть критически важным. Разберем, как это исправить:

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

Важно: этот флаг гарантирует, что поле будет включено в SELECT запроса независимо от видимости колонки на форме.

Причина 3: Выбор неоптимального источника данных (Регистры)

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

Проанализируем альтернативу. В УТ 11.5 реализован специальный механизм для быстрого получения актуальных остатков и цен — регистр сведений РаспределениеЗапасов. Это «плоская» таблица, которая обновляется фоновыми заданиями и содержит уже готовые данные о наличии и резервах.

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


ВЫБРАТЬ
    СпрНоменклатура.Ссылка КАК Ссылка,
    ЕСТЬNULL(Запасы.ВНаличии, 0) КАК Остаток,
    ЕСТЬNULL(Запасы.Доступно, 0) КАК СвободныйОстаток
ИЗ
    Справочник.Номенклатура КАК СпрНоменклатура
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.РаспределениеЗапасов КАК Запасы
    ПО СпрНоменклатура.Ссылка = Запасы.Номенклатура
    И Запасы.Состояние = ЗНАЧЕНИЕ(Перечисление.СостоянияРаспределенияЗапасов.ВНаличии)
ГДЕ
    НЕ СпрНоменклатура.ЭтоГруппа

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

Причина 4: Программное добавление элементов формы

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

Рассмотрим более надежный метод — программное добавление колонки в процедуре &После("ПриСозданииНаСервере"). Это гарантирует, что ваш элемент появится на форме после всех типовых манипуляций:


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

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

Причина 5: Кэширование данных расширений

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

Посмотрим, что можно сделать в этом случае:

  1. Завершите все сеансы работы с базой.
  2. Очистите временные файлы пользователя (папка %AppData%\1C\1Cv8\).
  3. В случае серверного варианта — попробуйте перезапустить службу Агента сервера 1С:Предприятия или удалите и заново добавьте расширение в список расширений в информационной базе.

Итоги

Мы проанализировали основные причины, по которым реквизиты расширения могут не отображаться в справочнике Номенклатура. Подведем итог: всегда проверяйте, не переопределяется ли текст запроса в общем модуле РаботаСНоменклатурой, используйте свойство Использовать всегда для полей динамического списка и отдавайте предпочтение регистру РаспределениеЗапасов.

Если вам требуется готовое решение, можно использовать расширение для отображения остатков и цен с гибкими настройками под каждого пользователя или инструмент, позволяющий быстро искать и выбирать номенклатуру в привычном интерфейсе. Эти шаги обеспечат корректную и быструю работу вашей доработки в УТ 11.5.

← На главную