Почему в расширении у формы списка документа пропадает основная таблица и как это исправить?

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

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

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

Выясним причину: почему пропадает основная таблица?

Самое важное, что нужно понять: это не ваша ошибка. Такое поведение является известной ошибкой или ограничением платформы 1С:Предприятие, особенно заметным на версиях в диапазоне 8.3.17–8.3.19. Проблема часто усугубляется, если основная конфигурация работает в режиме совместимости с более старыми версиями платформы.

Механизм расширений должен «бесшовно» подхватывать метаданные из основной конфигурации. Однако в указанных версиях при заимствовании формы связь между динамическим списком и его основным объектом (документом) может «теряться». Платформа просто не может корректно сопоставить заимствованную форму с метаданными документа, которые тоже находятся в расширении.

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

Надежное решение: настраиваем динамический список программно

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

Рассмотрим по шагам, как это сделать:

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

Посмотрим на пример. Допустим, у нас есть документ РеализацияТоваровУслуг, и мы хотим в его список добавить колонку с полным наименованием контрагента, которое хранится в справочнике Контрагенты.

В обработчике ПриСозданииНаСервере напишем следующий код:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

    // Получаем текущий текст запроса динамического списка.
    // Стандартное имя списка на форме - "Список".
    // Если у вас он называется иначе, укажите правильное имя.
    ТекущийТекстЗапроса = Список.ТекстЗапроса;

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

    // Устанавливаем измененный текст запроса обратно в свойство динамического списка.
    Список.ТекстЗапроса = НовыйТекстЗапроса;

    // Важный момент: если вам нужно не только добавить поле, но и управлять его видимостью
    // и положением, нужно работать с коллекцией элементов формы.
    // Пример добавления нового поля в список для пользователя:
    НовоеПоле = Элементы.Добавить("СписокКонтрагентПолноеНаименование", Тип("ПолеФормы"), Элементы.Список);
    НовоеПоле.Вид = ВидПоляФормы.ПолеВвода;
    НовоеПоле.ПутьКДанным = "Список.КонтрагентПолноеНаименование";
    НовоеПоле.Заголовок = "Полное наименование контрагента";

КонецПроцедуры

Преимущества этого подхода:

Недостатки:

Другие способы, которые могут помочь

Хотя программный метод является самым надежным, существуют и другие варианты, которые стоит попробовать. Их успех сильно зависит от конкретной версии платформы и конфигурации.

1. Обновление платформы 1С

Это самый правильный и долгосрочный способ решения проблемы. В более свежих версиях платформы (например, 8.3.22 и выше) механизмы работы с расширениями были значительно улучшены, и многие подобные ошибки исправлены. Если есть возможность, убедите заказчика или руководство обновить платформу — это сэкономит массу времени на обходе подобных проблем в будущем.

2. Изменение режима совместимости

Иногда проблема кроется в устаревшем режиме совместимости основной конфигурации. Повышение режима совместимости до актуальной версии (например, до Версия 8.3.17 или выше) может заставить механизм расширений работать корректнее. Важно: это серьезное изменение, которое требует полного регрессионного тестирования всей функциональности конфигурации, так как может измениться поведение стандартных объектов.

3. "Магический" способ: удаление и повторное добавление

Иногда помогает полное пересоздание заимствованных объектов в правильном порядке. Этот способ не дает 100% гарантии, но его стоит попробовать.

  1. Полностью удалите из расширения и форму списка, и сам объект документа.
  2. Сохраните конфигурацию расширения (F7).
  3. Обязательно очистите кэш. Это критически важный шаг.
  4. Снова откройте конфигуратор.
  5. Сначала добавьте в расширение сам объект метаданных (документ).
  6. Сохраните расширение.
  7. И только после этого заимствуйте его форму списка.

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

В заключение, проблема с отсутствующей основной таблицей — это досадный баг платформы, но не тупиковая ситуация. Самым стабильным решением является программная модификация запроса в событии ПриСозданииНаСервере, а лучшим долгосрочным — обновление платформы 1С до актуальной версии.

← На главную