Почему добавленные в расширении реквизиты и колонки динамического списка отображаются через раз?

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

При доработке типовых конфигураций (например, 1С:Бухгалтерия предприятия 3.0, 1С:Управление торговлей или 1С:ERP) через механизм расширений разработчики часто сталкиваются с нестандартным поведением форм. Типичная ситуация: в обработку подбора номенклатуры добавлено новое поле (например, дополнительная цена или остаток), в визуальном редакторе расширения запрос динамического списка скорректирован, модуль формы подключен, но колонка появляется нестабильно — при вызове из одного документа она видна, а при вызове из другого документа пропадает, создавая иллюзию открытия формы из основной конфигурации.

Разберем детально, почему так происходит, как локализовать проблему и как правильно модифицировать динамические списки в расширениях конфигурации.

Диагностика: действительно ли открывается форма основной конфигурации?

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

Проанализируем поведение формы с помощью простых шагов:

  1. Добавим обработчик события ПриСозданииНаСервере или ПриОткрытии в форму расширения.
  2. Выведем контрольное сообщение через Сообщить("Открыта форма расширения");.
  3. Проверим открытие формы из разных документов (например, из документа Чек и документа ПоступлениеТоваровУслуг).

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

Основная причина: программная сборка запроса динамического списка

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

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

  1. При первом запуске или открытии из одного документа отрабатывает одна ветка кода, где запрос не пересобирается полностью, и колонка отображается.
  2. При открытии из другого документа вызывается процедура (например, СформироватьЗапросДинамическогоСписка() или методы общего модуля подбора), которая полностью перезаписывает свойство Список.ТекстЗапроса стандартным типовым текстом.
  3. Поскольку добавленного нами поля в программно собранном тексте нет, динамический список теряет новую колонку, и пользователь видит форму без изменений.

Пошаговое решение проблемы

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

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

Дополнительные факторы: кэш и настройки формы

Если процедуры формирования запроса перенесены корректно, но колонка по-прежнему отображается нестабильно, проанализируем следующие моменты:

  1. Сохраненные пользовательские настройки формы: Платформа 1С сохраняет пользовательские настройки отображения колонок (видимость, ширина, порядок) в системном хранилище. Если форма открывалась до добавления колонки, в сохраненных настройках пользователя этот элемент может быть скрыт. Для проверки вызовем команду Еще — Изменить форму — Установить стандартные настройки.
  2. Очистка кэша сеанса: При активной отладке расширений на стороне клиента и сервера могут сохраняться устаревшие кэшированные схемы компоновки данных. Рекомендуется перезапускать клиентское приложение с параметром /ClearCache.

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

← На главную