При разработке на платформе 1С:Предприятие 8.3 программисты часто сталкиваются с ситуацией, когда необходимо внедрить современную управляемую форму (УФ) в конфигурацию, работающую на обычных формах (ОФ). Одной из самых неприятных проблем в таком гибридном режиме является некорректная работа стандартных механизмов компоновки данных. Пользователь открывает обработку, видит таблицу отбора, нажимает на кнопку добавления нового элемента, но окно выбора остается пустым. Ни справочники, ни документы не доступны для выбора, хотя сам интерфейс кажется рабочим.
В этой статье мы подробно разберем, почему возникает эта ошибка, и проанализируем последовательность шагов, необходимых для восстановления работоспособности отборов. Мы выясним, как правильно «подсказать» управляемой форме, какие данные доступны для фильтрации, когда она запущена в контексте толстого клиента обычного приложения.
Основная причина кроется в механизме инициализации объекта КомпоновщикНастроекКомпоновкиДанных. В чистом управляемом приложении платформа берет на себя большую часть работы по связыванию метаданных со схемой компоновки. Однако, когда управляемая форма открывается из обычного интерфейса, автоматическая связь с «Источником доступных настроек» часто разрывается. Компоновщик просто «не понимает», к каким таблицам базы данных он может обращаться, поэтому список доступных полей отбора оказывается пустым.
Чтобы решить эту задачу, нам потребуется выполнить принудительную инициализацию настроек на стороне сервера. Рассмотрим, как это сделать правильно.
Для того чтобы в окне выбора появились нужные нам поля (например, Номенклатура), мы должны программно связать компоновщик настроек с конкретной схемой компоновки данных (СКД). Это делается в обработчике события ПриСозданииНаСервере.
Рассмотрим пример кода, который инициализирует компоновщик:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Получаем схему из макета нашей обработки
Схема = Отчеты.МояОбработка.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
// Помещаем схему во временное хранилище для надежной передачи между контекстами
АдресСхемы = ПоместитьВоВременноеХранилище(Схема, ЭтаФорма.УникальныйИдентификатор);
// Создаем источник доступных настроек на основании адреса схемы
ИсточникНастроек = Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресСхемы);
// Инициализируем компоновщик
Объект.КомпоновщикНастроек.Инициализировать(ИсточникНастроек);
КонецПроцедуры
Важный момент: Использование УникальныйИдентификатор формы при помещении во временное хранилище гарантирует, что данные будут очищены автоматически после закрытия формы, что предотвращает утечки памяти на сервере.
Проанализируем ситуацию, когда схема создается динамически или имеет сложную структуру. В гибридном режиме (УФ внутри ОФ) прямая передача объекта СхемаКомпоновкиДанных в инициализатор может работать нестабильно. Рекомендуется всегда использовать навигационную ссылку (адрес во временном хранилище).
Если ваша обработка использует КомпоновщикНастроек, который не привязан к конкретной схеме в метаданных, список доступных полей будет пуст по определению. Убедитесь, что в схеме (СКД) на закладке "Наборы данных" описаны поля, которые вы хотите видеть в отборе. Если вы хотите видеть поле Номенклатура, оно должно быть либо в выбранных полях набора данных, либо явно разрешено к использованию в качестве поля отбора.
Часто в управляемых формах элементы интерфейса (таблицы отбора) привязаны не к основным настройкам компоновщика, а к его ПользовательскимНастройкам. Это позволяет выносить настройки непосредственно на форму для удобства пользователя. Если вы используете именно этот механизм, убедитесь в следующем:
ПутьКДанным указано Объект.КомпоновщикНастроек.ПользовательскиеНастройки.ИдентификаторПользовательскойНастройки. Без этого идентификатора связь между визуальным элементом и данными в памяти будет отсутствовать.Если даже после инициализации поле "Значение" в отборе остается неактивным, это означает, что система не может однозначно определить тип данных. Рассмотрим ситуацию, когда нам нужно принудительно назначить тип СправочникСсылка.Номенклатура для поля отбора.
Мы можем программно проверить коллекцию ДоступныеПоляОтбора и, если нужного поля там нет, добавить его вручную. Посмотрим на пример реализации:
// Пример добавления доступного поля в схему программно
НовоеПоле = Схема.НаборыДанных.НаборДанных1.Поля.Добавить(Тип("ПолеНабораДанныхКомпоновкиДанных"));
НовоеПоле.Поле = "Номенклатура";
НовоеПоле.ПутьКДанным = "Номенклатура";
НовоеПоле.Заголовок = "Номенклатура";
НовоеПоле.ТипЗначения = Новый ОписаниеТипов("СправочникСсылка.Номенклатура");
После внесения таких изменений необходимо повторить процедуру инициализации компоновщика, описанную в первом шаге, чтобы изменения вступили в силу в интерфейсе управляемой формы.
Поскольку обычное приложение работает в режиме Толстого клиента, управляемые формы внутри него подчиняются особым правилам отрисовки. Иногда стандартное модальное окно выбора типа (которое открывается при клике на поле "Значение") блокируется или некорректно обрабатывается платформой.
Если стандартный выбор не срабатывает, разберем обходной путь: реализацию события НачалоВыбора для поля значения в таблице отбора. В этом событии мы можем программно вызвать ОткрытьФорму для нужного справочника и передать выбранное значение обратно в настройки компоновщика.
Резюмируем: Для исправления "пустого окна" в 90% случаев достаточно выполнить явную инициализацию КомпоновщикНастроек через ИсточникДоступныхНастроекКомпоновкиДанных в серверном коде при создании формы. Это восстанавливает связь с метаданными 1С, которую платформа теряет при переходе из обычного интерфейса в управляемый.