Почему не выбирается значение справочника в табличной части управляемой формы и как это исправить

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

При переходе на управляемые формы 1С:Предприятия разработчики часто сталкиваются с неочевидным поведением элементов интерфейса. Типичная ситуация: в одной табличной части документа выбор из справочника работает безупречно, а во второй — система не реагирует на нажатие кнопки выбора (трех точек «...»), выдает ошибку «не найдено» при вводе первых символов или вовсе намертво зависает. В этой статье мы подробно разберем, почему так происходит, и пошагово рассмотрим способы устранения этой проблемы.

Причина 1. Некорректная настройка свойств «Связь по типу» и «Связи параметров выбора»

В управляемом интерфейсе платформа 1С накладывает жесткие правила на фильтрацию данных «на лету». Если ваш реквизит (например, ЕдиницаИзмерения) является подчиненным другому справочнику (например, Номенклатура), платформа пытается автоматически установить связь между ними.

Проанализируем две типичные ошибки в этих свойствах:

  1. Ошибочно заполненная «Связь по типу» (Type Link): Если для реквизита установлена связь по типу с другим полем, тип которого в данный момент не определен или заполнен некорректно, платформа блокирует ввод. Поиск по первым символам будет выдавать «не найдено», так как система пытается ограничить типы данных пустой ссылкой. Очистка этого свойства (если жесткая типизация не требуется) решает проблему с быстрым вводом, но может привести к зависанию при открытии формы выбора.
  2. Отсутствие связи по владельцу в «Связях параметров выбора» (Choice Parameter Links): Когда мы убираем связь по типу, поле начинает позволять ввод текста. Однако при нажатии на кнопку выбора «...» система пытается открыть весь справочник без какого-либо отбора. Если это справочник единиц измерения, он жестко завязан на владельца (номенклатуру). Попытка СУБД прочитать терабайты записей без фильтра по владельцу, либо некорректный запрос в форме выбора без установленного отбора, вызывают жесткое зависание сеанса 1С.

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

  1. Откроем конфигуратор и найдем нужную табличную часть документа.
  2. Перейдем в свойства реквизита табличной части (например, ЕдиницаИзмерения).
  3. Найдем свойство «Связи параметров выбора» и нажмем на кнопку открытия (с лупой или тремя точками).
  4. Добавим новую строку отбора. В колонке «Имя параметра» укажем Отбор.Владелец.
  5. В колонке «Путь к данным» укажем реквизит этой же строки табличной части, который является владельцем (например, Объект.Товары.Номенклатура).

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

Причина 2. Активированный флаг «Режим выбора из списка»

Иногда при копировании реквизитов или элементов формы случайно переносятся свойства, которые кардинально меняют логику работы поля ввода. Одно из таких свойств — РежимВыбораИзСписка (ChoiceModeFromList).

Если этот флаг установлен в значение Истина, платформа ожидает, что выбор будет производиться исключительно из заранее подготовленного локального списка значений (выпадающего списка), а не из полноценной формы выбора справочника. При этом стандартная кнопка «...» перестает открывать форму выбора, а ручной ввод текста блокируется сообщением «не найдено».

Выясним, как это исправить:

  1. Откроем управляемую форму документа в конфигураторе.
  2. Выделим элемент формы — поле ввода в колонке табличной части.
  3. В палитре свойств найдем раздел «Использование» и свойство «Режим выбора из списка».
  4. Сбросим этот флаг (установим значение Ложь).
  5. Дополнительно проверим аналогичное свойство у самого реквизита объекта в дереве метаданных.

Причина 3. Ошибки в свойстве «Путь к данным» (DataPath)

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

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

  1. В окне элементов управляемой формы выделим проблемную колонку.
  2. В свойствах найдем поле «Путь к данным».
  3. Убедимся, что путь имеет строго определенный формат: Объект.ИмяВашейТабличнойЧасти.ИмяРеквизитаКолонки (например, Объект.Материалы.ЕдиницаИзмерения). Если путь указан просто как имя справочника или содержит опечатки, выбор работать не будет.

Причина 4. Проблемы с производительностью динамического списка в форме выбора

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

Проанализируем структуру динамического списка в форме выбора справочника:

  1. Если в динамическом списке используется произвольный запрос (например, с левыми соединениями к таблицам остатков или цен), СУБД может тратить критически много времени на выполнение этого запроса при открытии формы без жестких фильтров.
  2. Проверим, заполнен ли параметр «Основная таблица» в свойствах динамического списка формы выбора. Если это поле пустое, платформа не может применить оптимизацию запроса (динамическое считывание порциями по 20-50 записей), и СУБД пытается выгрузить всю таблицу в оперативную память, что и приводит к «мертвому» зависанию интерфейса.
  3. Включим флаг «Динамическое считывание данных» в свойствах списка, чтобы оптимизировать нагрузку на сервер.

Причина 5. Некорректная логика в обработчиках событий формы

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

  1. На элементе формы (колонке табличной части) могут быть назначены обработчики НачалоВыбора или АвтоПодбор.
  2. Если в этих процедурах написан неоптимальный код (например, открытие формы в модальном режиме, бесконечные циклы или попытки получить тяжелые данные с сервера без контекста), это заблокирует работу интерфейса.

Посмотрим на пример правильной программной установки отбора в обработчике НачалоВыбора, если нам нужно передать владельца кодом:


&НаКлиенте
Процедура ТоварыЕдиницаИзмеренияНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    
    СтандартнаяОбработка = Ложь; // Отменяем стандартное открытие формы
    
    // Получаем текущую строку табличной части
    СтрокаТЧ = Элементы.Товары.ТекущиеДанные;
    Если СтрокаТЧ = Неопределено Тогда
        Возврат;
    КонецЕсли;
    
    ПараметрыФормы = Новый Структура;
    
    // Формируем структуру отбора по владельцу (Номенклатуре)
    Отбор = Новый Структура("Владелец", СтрокаТЧ.Номенклатура);
    ПараметрыФормы.Вставить("Отбор", Отбор);
    
    // Открываем форму выбора справочника ЕдиницыИзмерения с отбором
    ОткрытьФорму("Справочник.ЕдиницыИзмерения.ФормаВыбора", ПараметрыФормы, Элемент);
    
КонецПроцедуры

Причина 6. Кэш метаданных и физическое повреждение реквизита

Бывают случаи, когда логика настройки абсолютно верна, но платформа продолжает вести себя неадекватно из-за сбоев во внутреннем кэше метаданных платформы 1С. Локальный кэш хранит структуры управляемых форм для ускорения их отрисовки. При частой смене свойств реквизитов (например, при удалении и добавлении связей) кэш может рассинхронизироваться.

Для решения этой проблемы применим два метода:

  1. Кардинальный (пересоздание реквизита): Если ничего не помогает, удалим проблемный реквизит из табличной части в конфигураторе, сохраним конфигурацию базы данных, а затем создадим его заново с нуля. Это очистит старые битые ссылки в XML-структуре формы.
  2. Очистка кэша: Запустим очистку локального кэша на рабочем компьютере пользователя. Для этого можно удалить базу из списка запуска 1С и добавить ее повторно под тем же путем либо запустить систему с ключом очистки кэша /ClearCache.

Применяя эти методы последовательно — от проверки простых свойств формы (таких как РежимВыбораИзСписка) до настройки связей параметров выбора и анализа динамических списков, мы сможем гарантированно решить проблему с выбором значений в любой табличной части управляемой формы.

← На главную