При разработке собственных обработок на управляемых формах в 1С:УТ 11.4 часто возникает ситуация, когда ДинамическийСписок с произвольным запросом не отражает актуальные данные. Например, после продажи товара остаток становится нулевым, однако товар продолжает отображаться в списке. Рассмотрим, почему это происходит и как заставить форму корректно обновлять данные.
Основная проблема заключается в механизме работы ДинамическогоСписка. Когда вы используете ОсновнуюТаблицу (в нашем случае — справочник Номенклатура), платформа рассчитывает на то, что список будет обновляться при изменении самих элементов справочника. Если же фильтрация осуществляется по данным из виртуальной таблицы остатков, платформа не всегда понимает, что изменились данные в регистре, и не считает нужным принудительно перечитывать весь запрос для актуализации кэша.
Даже вызов методов Элементы.СправочникСписок.Обновить() или ЭтаФорма.ОбновитьОтображениеДанных() не всегда приводит к желаемому результату, так как кэширование виртуальных таблиц на сервере может удерживать старые значения параметров.
Самым простым и эффективным способом для поддержания актуальности данных в режиме реального времени является использование встроенного механизма платформы.
ДинамическимСписком.Это заставит ДинамическийСписок периодически выполнять запрос к серверу, что позволит увидеть изменения, даже если они были произведены вне текущей формы.
Если автоматическое обновление создает избыточную нагрузку на сервер, попробуйте скрыть «ненужные» строки с помощью условного оформления. Это не изменит запрос, но позволит корректно отобразить актуальное состояние на экране.
Рассмотрим, как это настроить:
ДинамическогоСписка перейдите в раздел Условное оформление.Видимость в значение Ложь.ВНаличииОстаток <= 0.Это позволит программно управлять визуальным отображением элементов, основываясь на данных, полученных в результате выполнения запроса.
Анализируя текст вашего запроса, заметим, что использование ЛЕВОГО СОЕДИНЕНИЯ в сочетании с условием в ГДЕ часто превращает его во ВНУТРЕННЕЕ СОЕДИНЕНИЕ. Если вы хотите добиться максимальной производительности и стабильности, попробуйте перенести условия отбора непосредственно в виртуальную таблицу, если это возможно, либо убедитесь, что все параметры передаются корректно.
Пример структуры кода для принудительного обновления параметров:
// Перед вызовом Обновить можно принудительно обновить параметры
Элементы.СправочникСписок.Период = ТекущаяДата();
Элементы.СправочникСписок.Обновить();
Если ни один из методов не дает стабильного результата, рекомендуется рассмотреть отказ от ДинамическогоСписка в пользу ТаблицыЗначений на форме, если объем номенклатуры позволяет выгрузить её целиком. Это даст вам полный контроль над процессом загрузки и обновления данных:
ТаблицуЗначений актуальными данными из запроса.Помните, что ДинамическийСписок — это инструмент для быстрой работы с большими массивами данных, и его попытка «заставить» работать как аналитический отчет по остаткам в реальном времени часто приводит к необходимости тонкой настройки параметров кэширования.