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