Почему зависает Конфигуратор при открытии запроса динамического списка в расширении и как это исправить?

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

Разберем распространенную проблему, с которой сталкиваются разработчики при доработке типовых конфигураций (например, Управление торговлей, ERP Управление предприятием или Комплексная автоматизация) с использованием механизма расширений. При попытке заимствовать форму списка документов, добавить в расширение основной реквизит — ДинамическийСписок — и открыть окно «Настройка списка» для редактирования текста запроса, Конфигуратор намертво зависает, переставая отвечать на действия пользователя.

Проанализируем природу этой ошибки, выясним, почему стандартная очистка кэша в каталоге AppData/Roaming не приносит результата, и подробно рассмотрим надежные способы решения задачи.

Причины зависания Конфигуратора

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

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

Решение 1. Программная модификация текста запроса (Рекомендуемый подход)

Интерактивное изменение запроса динамического списка через форму расширения создает лишние зависимости и существенно усложняет последующее обновление типовой конфигурации. Наиболее надежный и стандартизированный способ решения задачи — программное переопределение текста запроса в модуле формы.

Рассмотрим по шагам реализацию этого подхода:

  1. Добавим в расширение только форму списка нужного документа (заимствовать сам реквизит Список в расширение не требуется).
  2. Откроем модуль заимствованной формы и перейдем к обработчику события ПриСозданииНаСервере.
  3. Подключимся к событию с помощью аннотации &После или &Вместо.
  4. Переопределим текст запроса у динамического списка и при необходимости добавим новые элементы в таблицу формы.

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


&После("ПриСозданииНаСервере")
Процедура Расш1_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
    
    // Получаем текущий текст запроса или задаем полностью новый
    ТекстЗапросаМодифицированный = 
        "ВЫБРАТЬ
        |	ДокументПКО.Ссылка КАК Ссылка,
        |	ДокументПКО.ПометкаУдаления КАК ПометкаУдаления,
        |	ДокументПКО.Номер КАК Номер,
        |	ДокументПКО.Дата КАК Дата,
        |	ДокументПКО.Проведен КАК Проведен,
        |	ДокументПКО.Организация КАК Организация,
        |	ДокументПКО.СуммаДокумента КАК СуммаДокумента,
        |	ДокументПКО.Валюта КАК Валюта,
        |	ДокументПКО.Комментарий КАК Комментарий
        |ИЗ
        |	Документ.ПриходныйКассовыйОрдер КАК ДокументПКО";
    
    Список.ТекстЗапроса = ТекстЗапросаМодифицированный;
    
КонецПроцедуры

Если для динамического списка включен режим произвольного запроса, обращение к свойству Список.ТекстЗапроса подменяет выборку «на лету» без открытия проблемного конструктора в Конфигураторе. Если в форму требуется вывести новые добавленные поля, создадим их программно с помощью метода Элементы.Добавить().

Решение 2. Заимствование связанных метаданных

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

  1. Откроем текст запроса динамического списка в основной конфигурации (до заимствования).
  2. Проанализируем, к каким вспомогательным таблицам обращается запрос: регистрам сведений, перечислениям, планам видов характеристик или справочникам.
  3. Заимствуем все эти зависимые объекты в расширение перед тем, как нажимать кнопку «Настройка списка» у динамического списка.
  4. После того как метаданные появились в контексте расширения, конструктор без труда построит типы данных и окно настроек откроется без зависания.

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

Решение 3. Полная очистка локального кэша Конфигуратора

Нередко разработчики удаляют кэш только по пути %APPDATA%\1C\1cv8\ (каталог Roaming). Однако параметры диалоговых окон, интерфейсные схемы и временные структуры Конфигуратора сохраняются также в локальном профиле.

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

  1. Закроем все запущенные процессы 1cv8.exe и 1cv8c.exe.
  2. Перейдем в каталог %LOCALAPPDATA%\1C\1cv8\ (каталог Local).
  3. Удалим все каталоги с длинными идентификаторами (GUID-именами).
  4. Повторим удаление каталогов с идентификаторами в папке %APPDATA%\1C\1cv8\.
  5. Запустим Конфигуратор и проверим работу формы.

Решение 4. Проверка совместимости и смена версии платформы

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

  1. Проверим свойство «Режим совместимости» расширения. Откроем свойства корневого узла расширения и убедимся, что значение в поле РежимСовместимости строго идентично режиму совместимости основной конфигурации.
  2. Смена версии платформы 1С:Предприятие. Если сбой вызван внутренней ошибкой платформы (как в случае с релизом 8.3.27.1936), выполним даунгрейд или обновление на стабильный релиз (например, 8.3.27.1786), где данная ошибка парсера не воспроизводится.
  3. Использование среды 1C:EDT. В среде разработки 1C:Enterprise Development Tools используется независимый механизм компиляции и валидации моделей метаданных. Редактирование запросов динамических списков расширения в 1C:EDT позволяет обойти системные ошибки классического Конфигуратора.
← На главную