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