При работе с расширениями конфигурации в 1С разработчики часто сталкиваются с неочевидным поведением платформы. Одна из таких проблем — ситуация, когда после добавления (заимствования) формы списка документа в расширение у нее пропадает свойство Основная таблица. Давайте подробно разберем, почему это происходит и как можно решить эту задачу.
Суть проблемы в следующем: вы добавляете документ и его форму списка в расширение. Открываете эту форму в конфигураторе, и видите, что поле «Основная таблица» у динамического списка пустое. Как следствие, не работает конструктор запроса, и вы не можете визуально добавлять поля, настраивать отборы и связи. Попытки удалить и заново добавить форму часто не приносят результата.
Самое важное, что нужно понять: это не ваша ошибка. Такое поведение является известной ошибкой или ограничением платформы 1С:Предприятие, особенно заметным на версиях в диапазоне 8.3.17–8.3.19. Проблема часто усугубляется, если основная конфигурация работает в режиме совместимости с более старыми версиями платформы.
Механизм расширений должен «бесшовно» подхватывать метаданные из основной конфигурации. Однако в указанных версиях при заимствовании формы связь между динамическим списком и его основным объектом (документом) может «теряться». Платформа просто не может корректно сопоставить заимствованную форму с метаданными документа, которые тоже находятся в расширении.
Поскольку визуальные инструменты становятся бесполезны, единственным надежным выходом остается программная работа с динамическим списком.
Если визуальный редактор не работает, мы можем настроить текст запроса динамического списка напрямую из кода. Самое подходящее место для этого — серверный обработчик события формы ПриСозданииНаСервере. Этот метод гарантированно сработает при каждом открытии формы и не зависит от «глюков» конфигуратора.
Рассмотрим по шагам, как это сделать:
ПриСозданииНаСервере, если его еще нет.Список. Его свойство ТекстЗапроса содержит полный текст запроса, который мы можем изменять.Посмотрим на пример. Допустим, у нас есть документ РеализацияТоваровУслуг, и мы хотим в его список добавить колонку с полным наименованием контрагента, которое хранится в справочнике Контрагенты.
В обработчике ПриСозданииНаСервере напишем следующий код:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Получаем текущий текст запроса динамического списка.
// Стандартное имя списка на форме - "Список".
// Если у вас он называется иначе, укажите правильное имя.
ТекущийТекстЗапроса = Список.ТекстЗапроса;
// С помощью строковой функции добавляем новое поле в секцию ВЫБРАТЬ.
// Мы добавляем поле "КонтрагентПолноеНаименование" через точку от основной таблицы.
// Платформа сама построит нужные соединения для получения данных.
НовыйТекстЗапроса = СтрЗаменить(ТекущийТекстЗапроса,
"ВЫБРАТЬ",
"ВЫБРАТЬ
| ДокументРеализацияТоваровУслуг.Контрагент.НаименованиеПолное КАК КонтрагентПолноеНаименование,");
// Устанавливаем измененный текст запроса обратно в свойство динамического списка.
Список.ТекстЗапроса = НовыйТекстЗапроса;
// Важный момент: если вам нужно не только добавить поле, но и управлять его видимостью
// и положением, нужно работать с коллекцией элементов формы.
// Пример добавления нового поля в список для пользователя:
НовоеПоле = Элементы.Добавить("СписокКонтрагентПолноеНаименование", Тип("ПолеФормы"), Элементы.Список);
НовоеПоле.Вид = ВидПоляФормы.ПолеВвода;
НовоеПоле.ПутьКДанным = "Список.КонтрагентПолноеНаименование";
НовоеПоле.Заголовок = "Полное наименование контрагента";
КонецПроцедуры
Преимущества этого подхода:
LEFT JOIN), объединения (UNION ALL) и программно управлять параметрами.Недостатки:
Хотя программный метод является самым надежным, существуют и другие варианты, которые стоит попробовать. Их успех сильно зависит от конкретной версии платформы и конфигурации.
Это самый правильный и долгосрочный способ решения проблемы. В более свежих версиях платформы (например, 8.3.22 и выше) механизмы работы с расширениями были значительно улучшены, и многие подобные ошибки исправлены. Если есть возможность, убедите заказчика или руководство обновить платформу — это сэкономит массу времени на обходе подобных проблем в будущем.
Иногда проблема кроется в устаревшем режиме совместимости основной конфигурации. Повышение режима совместимости до актуальной версии (например, до Версия 8.3.17 или выше) может заставить механизм расширений работать корректнее. Важно: это серьезное изменение, которое требует полного регрессионного тестирования всей функциональности конфигурации, так как может измениться поведение стандартных объектов.
Иногда помогает полное пересоздание заимствованных объектов в правильном порядке. Этот способ не дает 100% гарантии, но его стоит попробовать.
Такая последовательность действий в некоторых случаях помогает платформе правильно установить связи между объектами в расширении.
В заключение, проблема с отсутствующей основной таблицей — это досадный баг платформы, но не тупиковая ситуация. Самым стабильным решением является программная модификация запроса в событии ПриСозданииНаСервере, а лучшим долгосрочным — обновление платформы 1С до актуальной версии.