Как перенести доработанный динамический список и реквизиты формы при обновлении конфигурации 1С

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

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

Разберем детально, как правильно сохранить и перенести доработки динамического списка, а также какие архитектурные подходы позволяют избежать рутинного ручного переноса при последующих обновлениях.

Вариант 1. Ручной перенос доработок через сравнение и объединение

Рассмотрим классический порядок действий, когда доработка формы остается в основной конфигурации:

  1. Создание резервной копии: перед началом любых манипуляций обязательно сохраняем текущую рабочую конфигурацию базы данных в файл .cf. Все действия первоначально выполняем исключительно на копии информационной базы.
  2. Обновление конфигурации: выполняем стандартное сравнение и объединение с новой конфигурацией поставщика (.cf или .cfu). Если форма поставщика содержит важные типовые изменения, разрешаем обновить форму до версии поставщика.
  3. Сравнение с сохраненным файлом: открываем меню Конфигурация — Сравнить, объединить с конфигурацией из файла и выбираем ранее сохраненный файл .cf со старыми доработками.
  4. Восстановление настроек динамического списка: находим нужную форму документа или справочника, переходим в свойства реквизита Список (тип ДинамическийСписок), открываем параметр Настройка списка и переносим модифицированный текст запроса, а также проверяем установку флага ПроизвольныйЗапрос.
  5. Проверка зависимостей и реквизитов формы: добавляем недостающие реквизиты формы и размещаем соответствующие элементы на форме в дереве элементов, привязывая путь к данным. Проверяем, не обращается ли запрос динамического списка к реквизитам или регистрам, структура которых могла измениться в новом релизе.

Вариант 2. Программная модификация динамического списка в модуле формы

Чтобы упростить будущие обновления, доработку динамического списка можно вынести в программный код. В этом случае форма в редакторе остается типовой, а текст запроса и колонки списка добавляются динамически при инициализации формы.

Рассмотрим, как реализовать программную модификацию в серверном обработчике ПриСозданииНаСервере:


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

КонецПроцедуры

Если для логики работы формы требуются дополнительные реквизиты, не входящие в динамический список, их также можно добавить программно с помощью метода ИзменитьРеквизиты(), сформировав массив объектов РеквизитФормы.

Вариант 3. Вынос доработок формы в расширение конфигурации

Наиболее надежный и современный подход при сопровождении конфигураций, находящихся на поддержке — это перенос всех доработок в отдельное расширение конфигурации. Разберем его преимущества и реализацию:

  1. Заимствуем типовую форму объекта в расширение конфигурации.
  2. В модуле формы расширения создаем перехватывающий обработчик с директивой &После("ПриСозданииНаСервере") или настраиваем свойства динамического списка прямо в расширении.
  3. Основную конфигурацию обновляем полностью типовыми файлами поставщика без ручного объединения форм. Платформа автоматически применит модификации из расширения поверх типовой формы.

Технические нюансы и частые ошибки

Проанализируем важные детали, на которые следует обратить внимание при переносе динамических списков:

1. Указание основной таблицы. Если динамический список использует произвольный запрос с соединениями, свойство ОсновнаяТаблица должно быть заполнено явно. Без этого платформа отключит стандартную динамическую подгрузку данных, динамическое наложение прав доступа (RLS) и стандартные отборы по полям основной таблицы.

2. Пользовательские настройки формы. Если пользователи уже открывали форму до обновления, платформа сохраняет их персональные настройки колонок в системном хранилище. Вновь добавленная колонка динамического списка может не отображаться на клиенте. В таком случае пользователю необходимо выполнить команду Еще — Установить стандартные настройки в командной панели формы списка.

3. Инициализация параметров запроса. Если в произвольный запрос динамического списка добавлены параметры (например, &Организация), их необходимо обязательно инициализировать на сервере с помощью вызова Список.Параметры.УстановитьЗначениеЭлемента("Организация", Значение), иначе открытие формы завершится аварийным исключением.

← На главную