Чем грозит отключение режима совместимости в 1С и к каким последствиям нужно готовиться?

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

Перевод конфигурации 1С на актуальную версию платформы или полное отключение режима совместимости (установка значения «Не использовать») — это серьезный шаг, который коренным образом меняет внутренние механизмы работы системы. Часто к этому решению разработчиков подталкивает необходимость использования современных механизмов расширений, которые недоступны на старых режимах совместимости (например, на популярной в старых типовых решениях «Версии 8.3.4»).

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

Основная причина перехода: почему нельзя просто оставить все как есть?

Если ваша конфигурация использует режим совместимости с устаревшими версиями (например, Версия 8.3.4), вы сильно ограничены в технологическом плане. Подключаемые расширения конфигурации обязаны строго соответствовать режиму совместимости основной базы. Попытка внедрить современное расширение в базу с устаревшим режимом совместимости либо заблокируется системой, либо лишит вас возможности использовать новые методы встроенного языка, переопределение серверных процедур и передовые интерфейсные возможности. Чтобы вдохнуть жизнь в кастомизацию старой конфигурации (например, «Бухгалтерия Украины 2.0»), приходится отключать режим совместимости. Выясним, почему это приводит к лавинообразному росту ошибок.

1. Запрет серверных вызовов при закрытии форм и завершении работы

Начиная с версии платформы 8.3.8, действует жесткое ограничение на работу с сервером в момент прекращения работы интерфейса. Рассмотрим, как это работает.

В обработчиках событий ПередЗавершениемРаботыСистемы, ПриЗавершенииРаботыСистемы, а также в обработчиках управляемых форм ПередЗакрытием и ПриЗакрытии категорически запрещено выполнять серверные вызовы и открывать новые диалоговые окна. Если пренебречь этим правилом, программа мгновенно аварийно завершится с критической ошибкой «Серверные вызовы при завершении работы запрещены».

Проанализируем пример некорректного кода, который без проблем работал в режиме совместимости 8.3.4, но вызовет падение системы при его отключении:


&НаКлиенте
Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка)
    // Данный вызов сервера приведет к аварийному завершению работы в режиме "Не использовать"
    Если ИмеютсяНесохраненныеДанныеНаСервере() Тогда 
        Отказ = Истина;
    КонецЕсли;
КонецПроцедуры

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

2. Полный отказ от модальности и синхронных вызовов

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

Использование методов ОткрытьМодально(), Вопрос(), Предупреждение() вызовет отказ системы. Весь этот функционал необходимо переписать с использованием асинхронных аналогов и объекта ОписаниеОповещения.

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

Было (в режиме совместимости):


Режим = РежимДиалогаВопрос.ДаНет;
Ответ = Вопрос("Выполнить проведение документа?", Режим, 0);
Если Ответ = КодВозвратаДиалога.Да Тогда
    ПровестиДокумент();
КонецЕсли;

Стало (после отключения совместимости):


&НаКлиенте
Процедура ВыполнитьПроверку()
    Оповещение = Новый ОписаниеОповещения("ПослеВопросаОПроведении", ЭтотОбъект);
    Режим = РежимДиалогаВопрос.ДаНет;
    ПоказатьВопрос(Оповещение, "Выполнить проведение документа?", Режим, 0);
КонецПроцедуры

&НаКлиенте
Процедура ПослеВопросаОПроведении(Результат, ДополнительныеПараметры) Экспорт
    Если Результат = КодВозвратаДиалога.Да Тогда
        ПровестиДокумент();
    КонецЕсли;
КонецПроцедуры

Аналогичным изменениям подвергнется и работа с файловой системой. Популярные синхронные методы работы с файлами на клиенте (такие как НайтиФайлы() или ПоложитьФайл()) перестанут функционировать. Разработчику потребуется переводить весь файловый менеджмент на асинхронные вызовы (например, НачатьНахождениеФайлов()).

3. Масштабное искажение («разъезжание») управляемых форм

С выходом версии платформы 8.3.7 разработчики 1С кардинально обновили алгоритм расчета и отрисовки элементов интерфейса управляемых форм. В старых режимах совместимости верстка сглаживалась платформой, но при переключении в режим «Не использовать» интерфейс перестраивается под современные стандарты адаптивной разметки.

На практике это приводит к следующим неприятным последствиям:

  1. Поля ввода, надписи и кнопки на кастомных или измененных типовых формах могут хаотично съехать.
  2. Группы элементов могут сжаться до нечитаемого состояния, перекрыть друг друга или вовсе стать невидимыми для пользователя.
  3. Шрифты и отступы могут визуально исказить привычный вид документов и справочников.

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

4. Изменение логики динамических списков и отборов

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

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

5. Строгий синтаксический контроль и конфликты имен

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

6. Изменения при работе с типами данных и объектами метаданных

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

7. Поведение распределенных баз данных (РИБ)

В режиме «Не использовать» изменяется поведение распределенных информационных баз при создании и обновлении предопределенных элементов. В подчиненных узлах РИБ предопределенные элементы метаданных больше не создаются автоматически «на лету» во время обновления конфигурации базы данных. Они должны передаваться исключительно через сообщения обмена из главного узла. Если в коде обработчиков обновления базы данных зашито прямое обращение к предопределенному элементу до момента загрузки пакета обмена, система выдаст критическую ошибку.

8. Риски реструктуризации таблиц базы данных

Изменение режима совместимости запускает глобальный процесс реструктуризации таблиц базы данных при обновлении конфигурации в режиме «Предприятие». На крупных базах данных этот процесс может занять долгие часы и потребовать колоссального объема свободного места на жестком диске сервера СУБД.

Важное предостережение: Если в системе были установлены расширения, которые изменяли структуру данных (добавляли новые реквизиты в документы или справочники), и вы решите откатить режим совместимости назад (если что-то пошло не так), платформа заблокирует это действие с ошибкой: «Невозможно включить режим совместимости при наличии изменений структуры данных расширениями». Вернуться к старому состоянию без удаления расширений и потери их данных будет невозможно.

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

Чтобы минимизировать риски и провести процедуру перевода базы безболезненно для пользователей, настоятельно рекомендуем действовать по следующей схеме:

  1. Создание полной резервной копии. Никогда не проводите эти эксперименты на рабочей базе данных! Сделайте резервную копию (выгрузку .dt или бэкап средствами СУБД) и разверните ее на тестовом сервере.
  2. Изменение режима совместимости. В конфигураторе тестовой базы перейдите в свойства корневого элемента конфигурации и установите свойство «Режим совместимости» в значение «Не использовать» (или выберите целевую актуальную версию платформы).
  3. Синтаксическая проверка кода. Запустите полную синтаксическую проверку всей конфигурации (меню Конфигурация — Проверка конфигурации). Обязательно установите флажки проверки на сервере, клиенте, внешнем соединении, а также включите проверку на соответствие стандартам тонкого и веб-клиента.
  4. Исправление ошибок компиляции. Методично исправляйте все выявленные ошибки синтаксиса: переписывайте синхронные вызовы на асинхронные, убирайте серверные процедуры из обработчиков закрытия форм, корректируйте зарезервированные имена функций.
  5. Синхронизация расширений. Откройте свойства всех подключенных расширений конфигурации и измените их режим совместимости так, чтобы он в точности совпадал с новым режимом основной конфигурации. Повторно проведите синтаксический контроль модулей расширений.
  6. Визуальный аудит интерфейса. В режиме «1С:Предприятие» запустите выборочную проверку ключевых документов, справочников и отчетов. Убедитесь, что управляемые формы отображаются корректно, элементы разметки не съехали, а динамические списки открываются без ошибок. При необходимости скорректируйте верстку проблемных форм в конфигураторе.
  7. Проведение нагрузочного тестирования. Попросите ключевых пользователей протестировать основной бизнес-цикл в копии базы данных. Только после успешного завершения всех тестов планируйте перенос изменений на рабочую базу в период технологического окна.

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

← На главную