При разработке и доработке управляемых форм в 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)
| КОНЕЦ КАК Резерв
|ИЗ
| РегистрНакопления.СвободныеОстатки.Остатки(&Период, ) КАК СвободныеОстаткиОстатки";
КонецПроцедуры
Если запрос переопределяется программно, редактировать его необходимо непосредственно в коде модуля формы либо выносить сборку текста запроса в общий модуль.
Разберем последовательность действий для гарантированного решения проблемы с динамическим списком:
Список.ТекстЗапроса или Список.ПроизвольныйЗапрос) во всей конфигурации и подключенных расширениях. Проверим, не модифицируется ли запрос динамического списка в типовых процедурах подсистемы БСП (библиотеки стандартных подсистем).ПутьКДанным строго совпадает с псевдонимом нового поля из текста запроса.Назначение. При формировании условий соединения или фильтров убедимся, что виртуальная таблица не отсекает записи с заполненным назначением.Если редактирование исходного текста запроса динамического списка нежелательно из-за риска конфликтов при обновлении, расчетное поле можно добавить через компоновщик настроек динамического списка:
&НаСервере
Процедура ДобавитьВычисляемоеПолеВСписок()
Настройки = Список.КомпоновщикНастроек.Настройки;
// Добавление пользовательского поля-выражения
ПолеВыражение = Настройки.ПользовательскиеПоля.Элементы.Добавить(Тип("ПользовательскоеПолеВыражениеСхемыКомпоновкиДанных"));
ПолеВыражение.Заголовок = "Всего в резерве";
ПолеВыражение.ВыражениеДетальныхЗаписей = "ЕстьNull(ВРезервеСоСкладаОстаток, 0) + ЕстьNull(ВРезервеПодЗаказОстаток, 0)";
ПолеВыражение.Использование = Истина;
КонецПроцедуры
Такой подход позволяет корректно вычислять сумму по нескольким полям без прямого вмешательства в программно сформированный Список.ТекстЗапроса.