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