Почему обычные формы в старых конфигурациях "ломаются" при обновлении на новой платформе 8.3.26 и как это исправить?

Программист 1С v8.3 (Обычные формы) 1С:Управление торговлей IT и автоматизация бизнеса
← К списку

Приветствуем вас, коллеги! Мы столкнулись с достаточно распространённой и весьма неприятной проблемой, когда при обновлении старых конфигураций, таких как Управление торговлей 10 с обычными формами, на новой платформе, например, 8.3.26.1540 или 8.3.26.1498, формы объектов начинают вести себя непредсказуемо и "ломаются". Это проявляется в появлении новых, нежелательных реквизитов формы, изменении положения существующих элементов, а также искажении содержимого табличных документов на форме.

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

Выясняем причину "поломки" форм

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

Истоки этой проблемы лежат в нескольких аспектах:

  1. Несовместимость логики обычных форм с новыми механизмами платформы: Платформа 1С:Предприятие непрерывно развивается, и внутренние механизмы работы с формами, особенно с обычными, могут меняться. Новые версии платформы могут иначе интерпретировать или обрабатывать метаданные форм, что приводит к некорректному слиянию.
  2. Накопление "исторических" ошибок и дубликатов: Многие старые конфигурации "пережили" множество обновлений. В процессе этих обновлений, особенно если они выполнялись не всегда корректно или с пропуском промежуточных релизов, могли накапливаться "задублированные" элементы формы (например, Контрагент, Контрагент1, Контрагент2). Эти элементы могут мирно существовать, не проявляя себя, пока очередное обновление платформы не "растревожит" их, вызывая конфликт и "поломку" формы.
  3. Особенности механизма сравнения-объединения: В некоторых случаях, механизм сравнения-объединения платформы может некорректно обрабатывать связи между элементами формы и реквизитами. Например, если у нас есть элемент формы (поле ввода) под названием НазваниеПоля_Статистика, связанный с реквизитом формы НазваниеПоля, то после некорректного объединения может появиться новый реквизит формы с именем НазваниеПоля_Статистика, и элемент формы автоматически "переключится" на этот новый, некорректный реквизит, что ломает всю логику работы.

Прежде чем приступать к решению, обязательно создайте резервную копию вашей информационной базы! Это критически важный шаг перед любыми манипуляциями с конфигурацией.

Решение 1: Полный перенос формы без детального сравнения модуля

Один из самых действенных методов, который был экспериментально выявлен и подтвержден на практике, заключается в изменении подхода к сравнению и объединению форм.

Рассмотрим по шагам, как это сделать:

  1. Запускаем сравнение и объединение: Открываем конфигурацию в режиме "Конфигуратор", переходим в меню "Конфигурация" -> "Сравнить, объединить с конфигурацией из файла...". Выбираем файл новой конфигурации поставщика.
  2. Исключаем детальное сравнение модуля формы: Когда система предложит вам детально сравнить объекты, доходим до нужной формы. Вместо того чтобы проваливаться внутрь модуля формы для детального сравнения процедур и функций, мы выбираем опцию полного переноса формы. Это означает, что мы либо принимаем форму целиком из новой конфигурации (если она типовая и у нас нет доработок), либо, если форма доработана, мы выбираем режим, при котором изменения в модуле не будут сливаться построчно, а будет принят либо старый, либо новый модуль целиком (с последующей ручной доработкой).
  3. Подтверждаем объединение: После выбора режима объединения для всех объектов, включая проблемные формы, подтверждаем процесс.
  4. Обновляем конфигурацию базы данных: После успешного объединения конфигурации, не забудьте обновить конфигурацию базы данных (меню "Конфигурация" -> "Обновить конфигурацию базы данных").

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

Решение 2: Диагностика и исправление дублирующихся элементов формы

Как мы выяснили, одной из причин "поломки" форм может быть накопление дублирующихся элементов. Давайте разберем, как их выявить и исправить.

Диагностика дубликатов вручную:

Мы можем провести простое самотестирование прямо в конфигураторе:

  1. Откройте проблемную форму в конфигураторе.
  2. Встаньте на первый элемент формы (например, нажав Ctrl+Home или выбрав его мышью).
  3. Нажимайте клавишу Tab или Стрелка вниз, чтобы переходить к следующему элементу формы.
  4. Внимательно следите: если курсор сделает "шаг на месте", то есть вы перешли, но визуально элемент не изменился, или если при переходе вы видите, что у элемента в свойствах отображается наименование с "номером" (например, Контрагент1, Контрагент2), хотя визуально он один, это явный признак дублирования.
  5. В таких случаях вам придется глазками и ручками сравнивать эту форму с типовой формой из конфигурации поставщика, если она есть, или с предыдущей рабочей версией формы.

Программное выявление дубликатов:

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

Проанализируем ситуацию: дублирующиеся элементы часто имеют одинаковые координаты на форме (Лево, Верх, Ширина, Высота) или очень близкие к ним. Мы можем использовать этот принцип для их обнаружения.

Рассмотрим пример концептуального кода для такой обработки:


// Примерный код для внешней обработки
// Эта обработка не является готовым решением, а лишь демонстрирует принцип поиска

Процедура НайтиДублирующиесяЭлементыФорм()

    Сообщить("Начинаем поиск дублирующихся элементов форм...");

    Для Каждого МетаданныеФорм Из Метаданные.ВсеФормы Цикл

        Попытка
            ФормаОбъект = МетаданныеФорм.ПолучитьОбъект();
            Если ФормаОбъект = Неопределено Тогда
                Продолжить;
            КонецЕсли;

            КартаЭлементовПоКоординатам = Новый Карта();

            Для Каждого ЭлементФормы Из ФормаОбъект.Элементы Цикл
                // Для обычных форм свойства могут быть доступны через ЭлементФормы.Свойства
                // Или напрямую, если это элемент управления
                Если ТипЗнч(ЭлементФормы) = Тип("ЭлементУправления") Тогда
                    Координаты = Строка(ЭлементФормы.Лево) + "_" + Строка(ЭлементФормы.Верх) + "_" + Строка(ЭлементФормы.Ширина) + "_" + Строка(ЭлементФормы.Высота);
                    
                    Если КартаЭлементовПоКоординатам.Содержит(Координаты) Тогда
                        СписокДубликатов = КартаЭлементовПоКоординатам.Получить(Координаты);
                        СписокДубликатов.Добавить(ЭлементФормы.Имя);
                        КартаЭлементовПоКоординатам.Вставить(Координаты, СписокДубликатов);
                    Иначе
                        СписокДубликатов = Новый СписокЗначений();
                        СписокДубликатов.Добавить(ЭлементФормы.Имя);
                        КартаЭлементовПоКоординатам.Вставить(Координаты, СписокДубликатов);
                    КонецЕсли;
                КонецЕсли;
            КонецЦикла;

            Для Каждого КлючЗначение Из КартаЭлементовПоКоординатам Цикл
                Если КлючЗначение.Значение.Количество() > 1 Тогда
                    Сообщить("В форме " + МетаданныеФорм.Имя + " найдены дубликаты по координатам " + КлючЗначение.Ключ + ": " + Строка(КлючЗначение.Значение));
                КонецЕсли;
            КонецЦикла;

        Исключение
            Сообщить("Ошибка при обработке формы " + МетаданныеФорм.Имя + ": " + ОписаниеОшибки());
        КонецПопытки;

    КонецЦикла;

    Сообщить("Поиск завершен.");

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

Важно: Этот код является лишь примером. Для реальной работы с элементами обычных форм через метаданные могут потребоваться более сложные обходы, так как прямой доступ к свойствам типа Лево, Верх через ЭлементУправления в рантайме не всегда тривиален. Однако, принцип использования координат для поиска дубликатов остается актуальным.

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

Решение 3: Ручное исправление и полная замена форм

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

  1. Полная замена на типовую: Если проблемная форма является типовой, но имеет множество доработок, мы можем полностью заменить ее на типовую форму из конфигурации поставщика. Это гарантирует, что мы получим "чистую" форму, свободную от накопившихся ошибок.
  2. Перенос доработок: После замены формы, нам придется вручную перенести все наши доработки из старой (или резервной) версии формы в новую типовую. Это включает перенос реквизитов, элементов управления, а также кода из модуля формы.
  3. Построчное сравнение модуля: Если изменения в модулях форм не критичны и не вызывают конфликтов, мы можем использовать построчное сравнение модуля, внимательно отслеживая каждое изменение. Однако, как мы уже убедились, этот метод может быть рискованным для обычных форм на новых платформах.

Решение 4: Использование стабильных версий платформы для обычных форм

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

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

Дополнительные рекомендации и обходные пути

  1. Обновление конфигурации базы данных: Мы уже упоминали об этом, но хотим подчеркнуть: после каждого обновления конфигурации (особенно промежуточного) крайне важно обновлять конфигурацию базы данных. Это синхронизирует структуру метаданных в конфигурации с реальной базой данных.
  2. Тщательный анализ сравнения/объединения: Всегда внимательно просматривайте механизм сравнения и объединения конфигураций. Проверяйте настройки объединения для каждого объекта, особенно для форм и модулей. Не доверяйте "автоматическому" выбору системы, если вы не уверены в его корректности.
  3. Перенос данных вместо прямого обновления: Для очень старых конфигураций, таких как УТ 10.3, фирма 1С рекомендует переход на более новые версии (например, УТ 11, КА 2, ERP) путем переноса данных с использованием стандартных или авторских обработок, а не прямым обновлением. Это связано с кардинальными изменениями в структурах данных между версиями.
  4. Проверка предопределенных элементов: Если вы сталкиваетесь с ошибками, указывающими на то, что предопределенный элемент описан в конфигурации, но отсутствует в информационной базе, это серьезная проблема, требующая детального анализа и, возможно, создания недостающих элементов или корректировки ссылок.

Мы рассмотрели основные причины и методы решения проблемы "ломающихся" обычных форм при обновлении старых конфигураций на новой платформе 8.3.26. Помните, что работа с нетиповыми конфигурациями всегда требует особого внимания и, при необходимости, обращения к квалифицированным специалистам. Удачи в ваших обновлениях!

← К списку