Как исправить ошибки и вернуть стандартные кнопки при изменении запроса динамического списка в 1С

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

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

Анализ причин возникновения ошибок

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

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

Восстановление свойства Основная таблица

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

  1. Откроем форму в Конфигураторе и перейдем на вкладку Реквизиты.
  2. Выделим реквизит с типом ДинамическийСписок и откроем его свойства (палитру свойств).
  3. В свойстве Настройка списка нажмем кнопку открытия (или перейдем в редактирование свойства ТекстЗапроса).
  4. В нижней части окна конструктора запроса динамического списка найдем поле Основная таблица.
  5. Выберем нужный объект метаданных (например, Справочник.Номенклатура).
  6. Нажмем ОК и сохраним форму.

После указания основной таблицы платформа автоматически восстановит стандартные действия формы и свяжет контекстное меню списка с выбранным объектом.

Удаление следов поля из настроек динамического списка

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

Проверим настройки в Конфигураторе:

  1. В свойствах динамического списка откроем свойство НастройкиКомпоновкиДанных.
  2. Последовательно проверим закладки Отбор, Сортировка, Условное оформление и Группировка.
  3. Если удаленное поле присутствует в элементах или условиях, удалим эти строки.

Очистка пользовательских настроек в режиме 1С:Предприятие

Платформа 1С автоматически сохраняет пользовательские настройки формы (включая фильтры и порядок колонок) в системной таблице ХранилищеПользовательскихНастроекДинамическихСписков. Если пользователь настраивал отбор по удаленному полю, при открытии формы сохраненные настройки накладываются на обновленный запрос и вызывают падение.

Для типовых конфигураций на базе БСП (Библиотеки Стандартных Подсистем) очистку можно выполнить интерактивно:

  1. Перейдем в раздел Администрирование → Настройки пользователей и прав.
  2. Откроем пункт Очистка настроек (или Настройки пользователей).
  3. Выберем пользователей, у которых возникает ошибка, и очистим настройки для проблемной формы списка.

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


Отбор = Новый Структура;
Отбор.Вставить("КлючОбъекта", "Справочник.Номенклатура.Форма.ФормаСписка/Список");

Выборка = ХранилищеПользовательскихНастроекДинамическихСписков.Выбрать(Отбор);
Пока Выборка.Следующий() Цикл
    ХранилищеПользовательскихНастроекДинамическихСписков.Удалить(
        Выборка.КлючОбъекта,
        Выборка.КлючНастроек,
        Выборка.Пользователь
    );
КонецЦикла;

Программная защита от ошибок при инициализации формы

Чтобы избежать аварийного завершения работы пользователей при будущих изменениях структуры запроса, полезно выполнять проверку доступности полей при загрузке настроек в модуле формы. Рассмотрим пример программной очистки некорректных отборов в событии ПриСозданииНаСервере:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Проверяем доступность элементов пользовательских отборов
    ДоступныеПоля = Список.КомпоновщикНастроек.Настройки.ДоступныеПоляОтбора;
    ЭлементыОтбора = Список.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы;
    
    Индекс = ЭлементыОтбора.Количество() - 1;
    Пока Индекс >= 0 Цикл
        Элемент = ЭлементыОтбора[Индекс];
        Если ТипЗнч(Элемент) = Тип("ЭлементОтбораКомпоновкиДанных") Тогда
            ПолеОтбора = Новый ПолеКомпоновкиДанных(Строка(Элемент.ЛевоеЗначение));
            Если ДоступныеПоля.НайтиПоле(ПолеОтбора) = Неопределено Тогда
                ЭлементыОтбора.Удалить(Элемент);
            КонецЕсли;
        КонецЕсли;
        Индекс = Индекс - 1;
    КонецЦикла;
    
КонецПроцедуры

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

← На главную