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

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

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

Анализ проблемы: расчет резерва номенклатуры

Рассмотрим практическую задачу. В динамическом списке необходимо вывести общий объем зарезервированного товара, складывая резерв со склада и обособленный резерв под конкретные заказы. Первоначальное выражение для расчета резерва выглядело следующим образом:


ВЫБОР
    КОГДА ЕСТЬNULL(СвободныеОстаткиОстатки.ВРезервеСоСкладаОстаток, 0) < 0
        ТОГДА 0
    ИНАЧЕ ЕСТЬNULL(СвободныеОстаткиОстатки.ВРезервеСоСкладаОстаток, 0)
КОНЕЦ

После включения механизма обособленного обеспечения потребовалось добавить второе слагаемое — резерв под заказ:


ВЫБОР
    КОГДА ЕСТЬNULL(СвободныеОстаткиОстатки.ВРезервеСоСкладаОстаток, 0) < 0
        ТОГДА 0
    ИНАЧЕ ЕСТЬNULL(СвободныеОстаткиОстатки.ВРезервеСоСкладаОстаток, 0)
КОНЕЦ + ВЫБОР
    КОГДА ЕСТЬNULL(СвободныеОстаткиОстатки.ВРезервеПодЗаказОстаток, 0) < 0
        ТОГДА 0
    ИНАЧЕ ЕСТЬNULL(СвободныеОстаткиОстатки.ВРезервеПодЗаказОстаток, 0)
КОНЕЦ

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

Главная причина: программное переопределение свойства ТекстЗапроса

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

Проанализируем типовой фрагмент модуля формы, который приводит к переопределению текста запроса:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Программная установка или сборка запроса динамического списка
    Список.ТекстЗапроса = 
        "ВЫБРАТЬ
        |	СвободныеОстаткиОстатки.Номенклатура КАК Номенклатура,
        |	СвободныеОстаткиОстатки.Склад КАК Склад,
        |	ВЫБОР
        |		КОГДА ЕСТЬNULL(СвободныеОстаткиОстатки.ВРезервеСоСкладаОстаток, 0) < 0
        |			ТОГДА 0
        |		ИНАЧЕ ЕСТЬNULL(СвободныеОстаткиОстатки.ВРезервеСоСкладаОстаток, 0)
        |	КОНЕЦ КАК Резерв
        |ИЗ
        |	РегистрНакопления.СвободныеОстатки.Остатки(&Период, ) КАК СвободныеОстаткиОстатки";
        
КонецПроцедуры

Если запрос переопределяется программно, редактировать его необходимо непосредственно в коде модуля формы либо выносить сборку текста запроса в общий модуль.

Пошаговый чек-лист для поиска и устранения проблемы

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

  1. Поиск по модулям формы и расширениям: выполним глобальный поиск по имени реквизита списка (например, Список.ТекстЗапроса или Список.ПроизвольныйЗапрос) во всей конфигурации и подключенных расширениях. Проверим, не модифицируется ли запрос динамического списка в типовых процедурах подсистемы БСП (библиотеки стандартных подсистем).
  2. Проверка пользовательских настроек формы: если новая колонка была добавлена, но не видна пользователю, откроем форму в режиме предприятия, перейдем в меню Еще → Изменить форму и нажмем Установить стандартные настройки. Это исключит влияние сохраненных настроек отображения колонок.
  3. Проверка привязки элемента к данным: убедимся, что у добавленного элемента таблицы формы свойство ПутьКДанным строго совпадает с псевдонимом нового поля из текста запроса.
  4. Учет измерений регистра: в типовых решениях (ERP, КА, УТ) обособленные остатки фиксируются в разрезе измерения Назначение. При формировании условий соединения или фильтров убедимся, что виртуальная таблица не отсекает записи с заполненным назначением.

Альтернативный вариант: добавление пользовательских полей СКД

Если редактирование исходного текста запроса динамического списка нежелательно из-за риска конфликтов при обновлении, расчетное поле можно добавить через компоновщик настроек динамического списка:


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

Такой подход позволяет корректно вычислять сумму по нескольким полям без прямого вмешательства в программно сформированный Список.ТекстЗапроса.

← На главную