Разберем распространенную ситуацию: вы создаете расширение для типовой конфигурации 1С:Управление торговлей 11.5, пытаетесь добавить дополнительные колонки в справочник или динамический список Номенклатура, добавляете соединение с регистром для получения остатков, но в пользовательском режиме колонки остаются пустыми или вовсе не отображаются. Проанализируем причины этого поведения и найдем пошаговые решения, опираясь на архитектуру современных типовых решений на базе Библиотеки Стандартных Подсистем (БСП).
В конфигурации УТ 11.5 текст запроса динамического списка СписокНоменклатура (или аналогичных) редко используется в том виде, в котором вы его написали в конструкторе в расширении. Система активно использует механизмы динамического построения текста запроса при открытии формы, особенно когда требуется реализовать вывод остатков и цен в списке номенклатуры в стиле старых версий программы.
В модуле формы справочника в процедуре ПриСозданииНаСервере часто можно встретить вызов функций типа РаботаСНоменклатуройУТ.ПолучитьДополненныйЗапросДинамическогоСписка. Рассмотрим, к чему это приводит: система берет базовый текст, анализирует включенные функциональные опции, настройки сегментов и прав доступа, а затем программно пересобирает строку запроса. Ваши правки, внесенные в расширение через визуальный редактор, просто заменяются новым программно сформированным текстом.
Чтобы решить эту проблему, нам необходимо вмешаться в процесс формирования запроса через расширение общего модуля. Рассмотрим пример кода, который нужно разместить в расширении общего модуля РаботаСНоменклатуройУТ (или аналогичного, отвечающего за модификацию списка):
&После("ЗаполнитьСвойстваСпискаНоменклатуры")
Процедура Расш1_ЗаполнитьСвойстваСпискаНоменклатуры(СвойстваСписка, ПараметрыФормы)
// Добавляем наше поле в текст запроса программно, если его там нет
ТекстЗапроса = СвойстваСписка.ТекстЗапроса;
Если Не СтрНайти(ТекстЗапроса, "ТоварыНаСкладахОстатки.ВНаличииОстаток") > 0 Тогда
// Здесь должна быть логика замены текста или вставки левого соединения
// Например, модифицируем строку запроса
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ИЗ", ", ЕСТЬNULL(ТоварыНаСкладахОстатки.ВНаличииОстаток, 0) КАК Остаток ИЗ");
СвойстваСписка.ТекстЗапроса = ТекстЗапроса;
КонецЕсли;
КонецПроцедуры
Проанализируем работу платформы 1С:Предприятие 8.3. В целях оптимизации система не запрашивает данные из базы для тех полей динамического списка, которые не выведены на экран пользователя. Если вы добавили поле в запрос, но не вывели его в таблицу формы (или пользователь скрыл колонку через «Изменить форму»), платформа может исключить это поле из SQL-запроса.
Однако в коде или в условном оформлении это поле может быть критически важным. Разберем, как это исправить:
Список в форме.Остаток или СвободныйОстаток).Важно: этот флаг гарантирует, что поле будет включено в SELECT запроса независимо от видимости колонки на форме.
Посмотрим на запрос, который часто используют начинающие разработчики. Соединение с виртуальной таблицей РегистрНакопления.ТоварыНаСкладах.Остатки напрямую в списке номенклатуры — это путь к серьезным проблемам с производительностью. При каждой прокрутке списка сервер будет вынужден пересчитывать итоги по регистру накопления.
Проанализируем альтернативу. В УТ 11.5 реализован специальный механизм для быстрого получения актуальных остатков и цен — регистр сведений РаспределениеЗапасов. Это «плоская» таблица, которая обновляется фоновыми заданиями и содержит уже готовые данные о наличии и резервах.
Рассмотрим пример правильного соединения в запросе:
ВЫБРАТЬ
СпрНоменклатура.Ссылка КАК Ссылка,
ЕСТЬNULL(Запасы.ВНаличии, 0) КАК Остаток,
ЕСТЬNULL(Запасы.Доступно, 0) КАК СвободныйОстаток
ИЗ
Справочник.Номенклатура КАК СпрНоменклатура
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.РаспределениеЗапасов КАК Запасы
ПО СпрНоменклатура.Ссылка = Запасы.Номенклатура
И Запасы.Состояние = ЗНАЧЕНИЕ(Перечисление.СостоянияРаспределенияЗапасов.ВНаличии)
ГДЕ
НЕ СпрНоменклатура.ЭтоГруппа
Использование регистра сведений значительно ускорит работу формы и решит проблему «подвисания» интерфейса при поиске номенклатуры.
Выясним еще одну деталь: в сложных формах УТ 11.5 элементы формы (колонки) могут перестраиваться программно в зависимости от того, открыта ли форма в режиме «Списка» или в режиме «Подбора». Если вы хотите, например, отобразить иерархию номенклатуры или изображения в текущей строке, то добавленная вручную колонка в редакторе формы расширения может быть удалена или перемещена типовым кодом ПриСозданииНаСервере.
Рассмотрим более надежный метод — программное добавление колонки в процедуре &После("ПриСозданииНаСервере"). Это гарантирует, что ваш элемент появится на форме после всех типовых манипуляций:
&После("ПриСозданииНаСервере")
Процедура Расш1_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Проверим, нет ли уже такой колонки (чтобы избежать дублей)
Если Элементы.Найти("Расш1_Остаток") = Неопределено Тогда
НоваяКолонка = Элементы.Вставить("Расш1_Остаток", Тип("ПолеФормы"), Элементы.Список, Элементы.Наименование);
НоваяКолонка.Вид = ВидПоляФормы.ПолеВвода;
НоваяКолонка.ПутьКДанным = "Список.Остаток";
НоваяКолонка.Заголовок = "Остаток на складе";
КонецЕсли;
КонецПроцедуры
Ситуация, когда «в консоли запросов работает, а в форме — нет», часто указывает на проблемы с кэшем метаданных. Платформа 1С кэширует структуру расширений для ускорения работы. При активной разработке кэш может не обновиться вовремя.
Посмотрим, что можно сделать в этом случае:
%AppData%\1C\1Cv8\).Мы проанализировали основные причины, по которым реквизиты расширения могут не отображаться в справочнике Номенклатура. Подведем итог: всегда проверяйте, не переопределяется ли текст запроса в общем модуле РаботаСНоменклатурой, используйте свойство Использовать всегда для полей динамического списка и отдавайте предпочтение регистру РаспределениеЗапасов.
Если вам требуется готовое решение, можно использовать расширение для отображения остатков и цен с гибкими настройками под каждого пользователя или инструмент, позволяющий быстро искать и выбирать номенклатуру в привычном интерфейсе. Эти шаги обеспечат корректную и быструю работу вашей доработки в УТ 11.5.