Перевод конфигурации 1С на актуальную версию платформы или полное отключение режима совместимости (установка значения «Не использовать») — это серьезный шаг, который коренным образом меняет внутренние механизмы работы системы. Часто к этому решению разработчиков подталкивает необходимость использования современных механизмов расширений, которые недоступны на старых режимах совместимости (например, на популярной в старых типовых решениях «Версии 8.3.4»).
В этой статье мы подробно проанализируем, с какими критическими изменениями, ошибками интерфейса и кодовой базы вы столкнетесь при отказе от совместимости, а также разберем по шагам алгоритм безопасного перехода.
Если ваша конфигурация использует режим совместимости с устаревшими версиями (например, Версия 8.3.4), вы сильно ограничены в технологическом плане. Подключаемые расширения конфигурации обязаны строго соответствовать режиму совместимости основной базы. Попытка внедрить современное расширение в базу с устаревшим режимом совместимости либо заблокируется системой, либо лишит вас возможности использовать новые методы встроенного языка, переопределение серверных процедур и передовые интерфейсные возможности. Чтобы вдохнуть жизнь в кастомизацию старой конфигурации (например, «Бухгалтерия Украины 2.0»), приходится отключать режим совместимости. Выясним, почему это приводит к лавинообразному росту ошибок.
Начиная с версии платформы 8.3.8, действует жесткое ограничение на работу с сервером в момент прекращения работы интерфейса. Рассмотрим, как это работает.
В обработчиках событий ПередЗавершениемРаботыСистемы, ПриЗавершенииРаботыСистемы, а также в обработчиках управляемых форм ПередЗакрытием и ПриЗакрытии категорически запрещено выполнять серверные вызовы и открывать новые диалоговые окна. Если пренебречь этим правилом, программа мгновенно аварийно завершится с критической ошибкой «Серверные вызовы при завершении работы запрещены».
Проанализируем пример некорректного кода, который без проблем работал в режиме совместимости 8.3.4, но вызовет падение системы при его отключении:
&НаКлиенте
Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка)
// Данный вызов сервера приведет к аварийному завершению работы в режиме "Не использовать"
Если ИмеютсяНесохраненныеДанныеНаСервере() Тогда
Отказ = Истина;
КонецЕсли;
КонецПроцедуры
Чтобы исправить данную проблему, нам придется переписать логику закрытия. Данные необходимо сохранять и проверять в процессе работы пользователя (например, при изменении реквизитов), а не накапливать к моменту закрытия формы. Если серверный вызов обойти невозможно, используют асинхронные обработчики ожидания на клиенте.
Режим совместимости 8.3.4 позволял разработчикам беспрепятственно открывать модальные окна. Отключение совместимости форсирует перевод конфигурации на асинхронную модель работы.
Использование методов ОткрытьМодально(), Вопрос(), Предупреждение() вызовет отказ системы. Весь этот функционал необходимо переписать с использованием асинхронных аналогов и объекта ОписаниеОповещения.
Разберем по шагам, как переписать классический модальный диалог на асинхронный лад.
Было (в режиме совместимости):
Режим = РежимДиалогаВопрос.ДаНет;
Ответ = Вопрос("Выполнить проведение документа?", Режим, 0);
Если Ответ = КодВозвратаДиалога.Да Тогда
ПровестиДокумент();
КонецЕсли;
Стало (после отключения совместимости):
&НаКлиенте
Процедура ВыполнитьПроверку()
Оповещение = Новый ОписаниеОповещения("ПослеВопросаОПроведении", ЭтотОбъект);
Режим = РежимДиалогаВопрос.ДаНет;
ПоказатьВопрос(Оповещение, "Выполнить проведение документа?", Режим, 0);
КонецПроцедуры
&НаКлиенте
Процедура ПослеВопросаОПроведении(Результат, ДополнительныеПараметры) Экспорт
Если Результат = КодВозвратаДиалога.Да Тогда
ПровестиДокумент();
КонецЕсли;
КонецПроцедуры
Аналогичным изменениям подвергнется и работа с файловой системой. Популярные синхронные методы работы с файлами на клиенте (такие как НайтиФайлы() или ПоложитьФайл()) перестанут функционировать. Разработчику потребуется переводить весь файловый менеджмент на асинхронные вызовы (например, НачатьНахождениеФайлов()).
С выходом версии платформы 8.3.7 разработчики 1С кардинально обновили алгоритм расчета и отрисовки элементов интерфейса управляемых форм. В старых режимах совместимости верстка сглаживалась платформой, но при переключении в режим «Не использовать» интерфейс перестраивается под современные стандарты адаптивной разметки.
На практике это приводит к следующим неприятным последствиям:
Вам придется вручную открывать проблемные управляемые формы в конфигураторе, проверять свойства растягивания по горизонтали/вертикали и корректировать группировки элементов.
Начиная с версии 8.3.5, платформа значительно изменила механизмы группировки, условного оформления и наложения отборов в динамических списках. Это порождает неочевидные ошибки при открытии списков документов или справочников.
Например, если в кодовой части управляемой формы списка происходит программное обращение к элементам стандартных команд (таким как кнопка выбора Элементы.СписокВыбрать), а сама форма списка была запущена не в режиме выбора значения, система сгенерирует исключение: «Поле объекта не обнаружено (СписокВыбрать)». В старых версиях платформа просто игнорировала это обращение, теперь же перед каждым вызовом элемента в коллекции необходимо программно проверять его существование.
При отключении режима совместимости платформа активирует полную поддержку синтаксиса актуального релиза. Это влечет за собой две проблемы:
ПобитовоеНЕ, ПобитовоеИЛИ). Если в вашей старой конфигурации присутствуют экспортные функции или переменные с аналогичными именами, компилятор выдаст синтаксическую ошибку из-за конфликта имен.&НаКлиентеНаСервереБезКонтекста вместо валидных директив больше не будут игнорироваться компилятором. Система выдаст ошибку компиляции модуля при первой же проверке.Рассмотрим несколько неочевидных ограничений, которые вступают в силу сразу после отключения режима совместимости:
ФиксированнаяСтруктура теперь строго пресекаются платформой. Попытка записи вызовет ошибку «Поле объекта недоступно для записи». Потребуется сначала скопировать данные в обычную Структура, изменить их там, и только потом на основе новой структуры создавать фиксированную.Период для метода Получить() менеджера периодического регистра сведений становится строго обязательным для заполнения. Ранее его можно было опустить, получая неопределенные результаты.ТабличныйДокумент, ТекстовыйДокумент или ГрафическаяСхема прямой вызов метода Показать() из контекста реквизита формы теперь запрещен и генерирует исключение «Недопустимая операция для реквизита формы».В режиме «Не использовать» изменяется поведение распределенных информационных баз при создании и обновлении предопределенных элементов. В подчиненных узлах РИБ предопределенные элементы метаданных больше не создаются автоматически «на лету» во время обновления конфигурации базы данных. Они должны передаваться исключительно через сообщения обмена из главного узла. Если в коде обработчиков обновления базы данных зашито прямое обращение к предопределенному элементу до момента загрузки пакета обмена, система выдаст критическую ошибку.
Изменение режима совместимости запускает глобальный процесс реструктуризации таблиц базы данных при обновлении конфигурации в режиме «Предприятие». На крупных базах данных этот процесс может занять долгие часы и потребовать колоссального объема свободного места на жестком диске сервера СУБД.
Важное предостережение: Если в системе были установлены расширения, которые изменяли структуру данных (добавляли новые реквизиты в документы или справочники), и вы решите откатить режим совместимости назад (если что-то пошло не так), платформа заблокирует это действие с ошибкой: «Невозможно включить режим совместимости при наличии изменений структуры данных расширениями». Вернуться к старому состоянию без удаления расширений и потери их данных будет невозможно.
Чтобы минимизировать риски и провести процедуру перевода базы безболезненно для пользователей, настоятельно рекомендуем действовать по следующей схеме:
Подводя итог, можно утверждать: отключение режима совместимости действительно открывает широкие возможности для использования расширений и современных инструментов платформы, но платой за это становится масштабный аудит и рефакторинг кода. Подходите к этой задаче системно, закладывайте достаточно времени на тестирование, и переход пройдет успешно!