При работе с расширениями конфигурации 1С программисты часто сталкиваются с ситуацией: в конфигураторе расширения поле добавлено в динамический список и выведено на форму, но в режиме «1С:Предприятие» новая колонка упорно не появляется. Рассмотрим подробно, почему это происходит, проведем глубокий анализ состава расширений, разберем внутренние механизмы платформы и выясним, как правильно решить эту задачу.
Когда мы работаем с основной конфигурацией, добавление поля в произвольный запрос динамического списка обычно проходит гладко. Однако в расширениях вступает в силу механизм объединения (мерджа) метаданных. Главная причина, по которой ваши изменения в визуальном редакторе расширения игнорируются, заключается в том, что в типовых решениях (таких как УТ 11, ERP 2.5, БП 3.0) текст запроса динамического списка часто переопределяется программно в момент создания формы. Даже если вы используете добавление реквизитов и элементов формы без кодирования, программный код конфигурации может иметь приоритет.
Рассмотрим стандартную ситуацию: в модуле формы основной конфигурации в процедуре ПриСозданииНаСервере или в связанных с ней общих модулях (например, подсистемы «Управление списками») вызывается код, который заново формирует строку Список.ТекстЗапроса. Поскольку этот код выполняется в рантайме, он просто затирает те изменения, которые вы внесли «руками» в схему динамического списка внутри расширения.
Прежде чем приступать к написанию кода, давайте убедимся, что проблема именно в этом. Для этого проанализируем состояние объекта в режиме реального времени. Выполним следующие действия:
ПриСозданииНаСервере формы списка.&После.Список.ТекстЗапроса.Для более детального исследования свойств объектов «на лету» можно также использовать редактор форм в режиме предприятия. Если в полученном тексте запроса отсутствует ваше добавленное поле, значит, базовая конфигурация перезаписала текст запроса. Выясним причину «вылета» при скроллинге: это происходит из-за того, что структура колонок формы перестает соответствовать структуре полей в ТекстЗапроса, либо возникают конфликты в КомпоновщикНастроек.
Чтобы наше поле гарантированно присутствовало в списке, нам необходимо модифицировать текст запроса программно, уже после того, как основная конфигурация выполнила свои манипуляции. Чтобы стандартизировать этот процесс, можно использовать вспомогательный модуль, реализующий программное изменение форм. Разберем, как это сделать правильно, используя методы работы со строками.
Предположим, нам нужно добавить поле МоеДополнительноеПоле из справочника Номенклатура. Рассмотрим пример кода в модуле формы расширения:
&После("ПриСозданииНаСервере")
Процедура Расш1_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
// Получаем текущий текст запроса, который уже мог быть изменен основной базой
ТекстЗапроса = Список.ТекстЗапроса;
// Проверяем, нет ли уже нашего поля (на всякий случай)
Если Найти(ТекстЗапроса, "Номенклатура.МоеДополнительноеПоле") = 0 Тогда
// Внедряем поле в секцию SELECT.
// ВАЖНО: используйте СтрЗаменить аккуратно, привязываясь к уникальным участкам запроса.
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "Номенклатура.Ссылка,", "Номенклатура.Ссылка, Номенклатура.МоеДополнительноеПоле КАК МоеПолеРасширения,");
// Возвращаем модифицированный текст обратно в список
Список.ТекстЗапроса = ТекстЗапроса;
КонецЕсли;
КонецПроцедуры
Проанализируем этот подход: мы используем СтрЗаменить, чтобы вклиниться в список выбираемых полей. Крайне важно убедиться, что псевдоним поля (МоеПолеРасширения) совпадает с именем элемента формы, который вы создали визуально.
Иногда программной правки текста недостаточно. Посмотрим на свойства самого объекта Список в расширении. Проверьте следующие моменты:
Основная таблица. Если поле берется из левого соединения, которого нет в основной конфигурации, убедитесь, что все задействованные таблицы добавлены в расширение.Если при добавлении поля программно форма начала «вылетать» с ошибкой динамического списка при скроллинге, это явный признак нарушения структуры КомпоновщикНастроек. Рассмотрим подробнее, как этого избежать. Подобные проблемы часто возникают при попытке реализовать сложный функционал, например, флажок в динамическом списке или специализированное отображение картинок в списке счетов.
Когда вы меняете ТекстЗапроса, компоновщик настроек может хранить старые кэшированные данные о доступных полях. Чтобы синхронизировать состояние, после изменения текста запроса иногда требуется принудительно обновить настройки или проверить, не обращаются ли пользовательские настройки (отборы, группировки) к несуществующим полям.
Посмотрим на пример безопасного добавления колонки на форму, если вы решили делать это полностью программно (без визуального добавления в расширение):
// Программное добавление элемента формы
НовыйЭлемент = Элементы.Добавить("МоеПолеРасширения", Тип("ПолеФормы"), Элементы.Список);
НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
НовыйЭлемент.ПутьКДанным = "Список.МоеПолеРасширения";
НовыйЭлемент.Заголовок = "Доп. Инфо";
Выясним причину, почему «перетаскивание в расширение» работает нестабильно. Платформа 1С при запуске формы в расширении пытается применить дифференциальный патч. Если в основной конфигурации программно вызывается метод УстановитьТекстЗапроса(), то визуальные настройки расширения просто игнорируются, так как программный код имеет приоритет над статической настройкой метаданных.
Разобравшись в проблеме, мы можем составить четкий алгоритм действий для программиста:
Список.ТекстЗапроса в самом конце процедуры ПриСозданииНаСервере.СтрЗаменить или построитель запроса.ПользовательскаяВидимость и права доступа (Роли) в расширении.Таким образом, совместная работа с расширением требует понимания жизненного цикла формы. Программная модификация запроса через &После — наиболее надежный и профессиональный способ вывода дополнительных данных в списки типовых решений.