При переходе на новые версии платформы 1С:Предприятие, такие как 8.3.24 и ранние сборки 8.3.25, многие разработчики столкнулись с неприятным сюрпризом: механизмы, которые годами работали безотказно, внезапно вышли из строя. Одной из самых критичных проблем стала некорректная работа (или полный отказ) стандартного механизма Связи параметров выбора. Чаще всего это проявляется в документах, где выбор договора перестает фильтроваться по контрагенту, или выбор спецификаций открывает полный список номенклатуры вместо привязанной к конкретной позиции.
В этой статье мы подробно разберем, почему это происходит, проанализируем техническую подоплеку сбоя и рассмотрим несколько проверенных способов решения задачи — от анализа расширений на наличие ошибок до написания программного кода.
Проанализируем ситуацию. Основная причина кроется в так называемой "регрессии" платформы — ошибке, которая была внесена разработчиками 1С при оптимизации механизмов объединения метаданных. Когда мы используем расширения конфигурации, платформа должна "склеивать" свойства объектов основной базы и расширения. В версиях 8.3.24.1342 и выше этот механизм начал давать сбои именно в части проброса связей параметров выбора.
Если форма или реквизит документа заимствованы в расширение, платформа иногда "забывает" подтянуть настройки связей из основной конфигурации. Особенно это заметно, если в расширении модифицировалась форма, но не обновлялись свойства конкретных элементов. Ситуация усугубляется, если в связях задействованы реквизиты с составным типом данных.
Рассмотрим самый простой и быстрый способ, который помогает в большинстве случаев. Если связь параметров прописана в основной конфигурации, но не отрабатывает в режиме предприятия, нам нужно заново добавить элементы формы в расширение и заставить систему "увидеть" эти настройки.
Выполним следующие шаги:
СвязиПараметровВыбора непосредственно в расширении. Даже если оно кажется заполненным, попробуем переопределить его вручную, выбрав те же самые поля, что и в основной конфигурации.Этот метод заставляет платформу жестко прописать соответствие метаданных в файле расширения, не полагаясь на автоматическое наследование, которое в данных версиях платформы работает нестабильно.
Разберем еще один важный нюанс. Часто связи параметров выбора не работают, если реквизит, по которому идет отбор (например, Владелец или Контрагент), присутствует в запросе динамического списка формы выбора, но не выведен на саму форму.
В новых версиях платформы механизмы оптимизации запросов стали агрессивнее. Если поле не используется на форме, платформа может исключить его из выборки для экономии ресурсов. Чтобы этого избежать:
ДинамическийСписок.Владелец), установим флаг Использовать всегда.Это гарантирует, что значение владельца всегда будет доступно системе для наложения фильтра, даже если пользователь скрыл или выполнил программное перемещение колонки динамического списка.
Иногда вместо того, чтобы просто не фильтровать, система выдает ошибку при попытке выбора. Проанализируем ситуацию: это часто случается при использовании составных типов данных. Платформа 8.3.24 стала строже относиться к типам в SQL-запросах.
Если связь параметров передает значение, тип которого система не может однозначно сопоставить с типом поля в базе данных, произойдет сбой. Для отладки таких ситуаций пригодится консоль запросов для управляемых форм, а для решения проблемы в запросе динамического списка следует использовать оператор ВЫРАЗИТЬ.
Посмотрим на пример изменения текста запроса:
ВЫБРАТЬ
СправочникДоговоры.Ссылка КАК Ссылка,
СправочникДоговоры.Наименование КАК Наименование
ИЗ
Справочник.ДоговорыКонтрагентов КАК СправочникДоговоры
ГДЕ
СправочникДоговоры.Владелец = ВЫРАЗИТЬ(&ОтборВладелец КАК Справочник.Контрагенты)
Такое явное приведение типов снимает неопределенность и позволяет платформе корректно построить план запроса к СУБД.
Если манипуляции с метаданными не помогают, или вы хотите создать максимально отказоустойчивое решение, которое не будет зависеть от багов конкретной версии платформы, воспользуемся программным методом. Мы перехватим событие НачалоВыбора и передадим параметры отбора вручную.
Рассмотрим пример кода для элемента табличной части:
&НаКлиенте
Процедура ТЧСтудентыДоговорНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
// Отменяем стандартную обработку, чтобы открыть форму программно
СтандартнаяОбработка = Ложь;
// Получаем текущую строку, чтобы знать, по какому студенту фильтровать
ТекущаяСтрока = Элементы.ТЧСтуденты.ТекущиеДанные;
Если ТекущаяСтрока = Неопределено Тогда
Возврат;
КонецЕсли;
// Формируем структуру отбора
ПараметрыОтбора = Новый Структура;
ПараметрыОтбора.Вставить("Владелец", ТекущаяСтрока.Студент);
// Формируем параметры открытия формы
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("Отбор", ПараметрыОтбора;
// Открываем форму выбора справочника "Договоры"
ОткрытьФорму("Справочник.Договоры.ФормаВыбора", ПараметрыФормы, Элемент);
КонецПроцедуры
Этот способ является самым надежным ("железобетонным"), так как он полностью обходит механизм СвязиПараметровВыбора, реализованный в метаданных, и использует прямой механизм передачи структуры Отбор в открываемую форму.
Проанализируем еще один технический аспект — Режим совместимости расширения. При обновлении платформы до 8.3.24, основная конфигурация может оставаться в старом режиме совместимости (например, 8.3.21), в то время как расширение может быть создано с использованием новых возможностей.
Важное правило: Режим совместимости расширения не должен быть "старше" режима совместимости основной конфигурации. Если вы используете платформу 8.3.24, убедитесь, что:
Разница в режимах совместимости часто приводит к тому, что обработчики событий и механизмы связей метаданных начинают работать по разным алгоритмам, что и вызывает потерю параметров выбора.
Подводя итоги, отметим, что проблема с неработающими связями в 8.3.24 — это временная трудность, связанная с обновлением ядра платформы. Для её оперативного решения мы рекомендуем сначала попробовать переопределить связи в расширении вручную (Решение 1). Если это не помогает — использовать программную установку отбора в событии НачалоВыбора.
Также не забывайте о возможности обновления платформы на более свежие патчи. Описанная ошибка была официально исправлена в версиях начиная с 8.3.24.1548 и 8.3.25.1394. Если ваша инфраструктура позволяет произвести минорное обновление платформы — это будет самым правильным стратегическим решением.