Аудит конфигурации 1С: готовимся к миграции на платформу 8.5
Почему «просто обновить» не получится: скрытые ловушки совместимости
Коллеги, сразу к делу. В справке 1С написано: «Платформа 8.5 обеспечивает обратную совместимость на уровне исходного кода». Формально это правда. Но есть нюанс, который вылезает только при нагрузочном тестировании или, что хуже, в рабочей системе — через месяц после перехода.
Речь о неявном изменении приоритетов обработки событий форм и поведении сериализатора XDTO при работе с внешними компонентами. В 8.5 изменился порядок вызова обработчиков ПриОткрытии и ПриСозданииНаСервере для динамически подключаемых команд интерфейса. Если в вашей конфигурации есть переопределение стандартных команд через подписки на события — готовьтесь к тому, что они начнут срабатывать в другой последовательности.
Ключевой тезис: Платформа 8.5 не ломает код — она ломает порядок выполнения. А это страшнее, потому что не падает с ошибкой, а тихо портит данные.
Технический разбор: как выглядит «тихая поломка»
Рассмотрим типовую ситуацию: документ «РеализацияТоваровУслуг» с расширением, которое добавляет реквизит «КодМаркировки» и подписку на событие ПередЗаписью. В 8.3.24 подписка гарантированно отрабатывала до проверки заполнения обязательных реквизитов формы. В 8.5 порядок изменился: сначала проверка формы, потом подписка.
// Пример кода, который работал в 8.3.24, но сломается в 8.5
Процедура Подписка_ПередЗаписью(Источник, Отказ, РежимЗаписи)
// В 8.3.24 этот код выполнялся ДО проверки формы
Если ПустаяСтрока(Источник.КодМаркировки) Тогда
Сообщить("Заполните код маркировки");
Отказ = Истина;
КонецЕсли;
КонецПроцедуры
// В 8.5 платформа сначала проверяет реквизиты формы,
// и если там стоит "ОбязательноеЗаполнение" — выдаст ошибку ДО вызова подписки.
// Пользователь видит: "Не заполнен реквизит", хотя подписка могла его заполнить автоматически.
Что делать: При аудите проверьте все подписки на события ПередЗаписью, ПриЗаписи и ОбработкаПроверкиЗаполнения. Если в них есть логика, которая влияет на реквизиты, проверяемые формой — перенесите её в обработчик ПриСозданииНаСервере или в сам модуль объекта.
Аудит XDTO и внешних компонент: где прячется «чёрный ящик»
Второй камень преткновения — изменение правил сериализации XDTO для типов, содержащих ХранилищеЗначения. В 8.5 платформа начала строже проверять соответствие XDTO-пакетов при десериализации. Если ваша конфигурация обменивается данными с внешними системами через веб-сервисы (HTTPСоединение + XDTO), вы рискуете получить исключение «Несоответствие типа XDTO» при, казалось бы, корректных данных.
Предупреждение: Не доверяйте тестам на «пустой» базе. Проблема проявляется только когда в ХранилищеЗначения лежат реальные данные (картинки, файлы, табличные документы) определённого размера.
Механика под капотом: почему это происходит
В 8.3.24 платформа при десериализации XDTO использовала «ленивое» приведение типов: если тип в пакете не совпадал с ожидаемым, она пыталась преобразовать данные «на лету». В 8.5 этот механизм отключили в пользу строгой типизации. Теперь, если в XDTO-пакете для свойства ДвоичныеДанные указан тип base64Binary, а вы передаёте string (даже если строка содержит валидный base64) — будет ошибка.
// Пример проблемного кода обмена через HTTP
Функция ОтправитьДанныеВСервис(Данные)
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписьJSON.ЗаписатьНачалоОбъекта();
ЗаписьJSON.ЗаписатьИмяСвойства("Файл");
// В 8.3.24 это работало, в 8.5 — нет, если тип в XDTO-пакете строгий
ЗаписьJSON.ЗаписатьЗначение(Данные.Файл.ПолучитьДвоичныеДанные());
ЗаписьJSON.ЗаписатьКонецОбъекта();
Запрос = Новый HTTPЗапрос("/api/upload");
Запрос.УстановитьТелоИзСтроки(ЗаписьJSON.Закрыть(), "UTF-8");
Соединение = Новый HTTPСоединение("service.example.com");
Ответ = Соединение.ОтправитьДляОбработки(Запрос);
Возврат Ответ.КодСостояния = 200;
КонецФункции
// Решение: явно указывать тип данных при записи в JSON
// и проверять XDTO-пакет на строгость типов
Практическое руководство: чек-лист аудита перед миграцией
Ниже — не абстрактные советы, а конкретные точки входа в конфигурации, которые нужно проверить. Каждый пункт — это потенциальный сбой в 8.5.
- Подписки на события форм — проверьте порядок вызова
ПередЗаписьюиОбработкаПроверкиЗаполнения. Если подписка модифицирует реквизиты, которые проверяет форма — перепишите логику. - XDTO-пакеты — откройте каждый пакет в конфигураторе и проверьте, что все типы свойств (
string,base64Binary,dateTime) строго соответствуют тому, что реально передаётся. Особое внимание —ХранилищеЗначения. - Внешние компоненты (AddIn) — проверьте, используют ли они
COMОбъектилиЗащищенноеСоединениеOpenSSL. В 8.5 изменён механизм загрузки неуправляемых DLL. Если компонента не имеет цифровой подписи — она может не загрузиться. - Динамические списки с произвольным запросом — в 8.5 изменилась обработка
ПараметрыВиртуальныхТаблицдля регистров накопления. Если в запросе динамического списка естьРегистрыНакопления.Остаткис параметромПериод— проверьте, что он передаётся явно, а не черезТекущаяДата(). - Сериализация настроек — если вы используете
ХранилищеНастроекдля сохранения пользовательских отчётов, проверьте, что все используемые типы данных поддерживают сериализацию в 8.5. Особенно это касаетсяТаблицаЗначенийс колонками типаДвоичныеДанные.
Типичные ошибки при аудите
Ошибка №1: проверять только на тестовой базе с минимальными данными. Проблемы с XDTO и подписками проявляются только при реальном объёме данных и одновременной работе 10+ пользователей.
Ошибка №2: игнорировать расширения. Если у вас 10 расширений конфигурации, каждое со своими подписками — порядок их выполнения в 8.5 может измениться. Проверяйте не каждое расширение по отдельности, а их совместную работу.
Ошибка №3: полагаться на автоматический анализатор кода. Ни один инструмент не отловит изменение порядка событий. Только ручной аудит + нагрузочное тестирование.
Что делать прямо сейчас: дорожная карта на 3 месяца
Миграция на 8.5 — это не спринт, а марафон. Вот реалистичный план, который мы рекомендуем нашим читателям:
| Этап | Срок | Действия |
|---|---|---|
| 1. Инвентаризация кода | 2 недели | Собрать все подписки на события, XDTO-пакеты, внешние компоненты. Составить карту зависимостей. |
| 2. Нагрузочное тестирование | 3 недели | Развернуть стенд 8.5, скопировать реальные данные (обезличенные), запустить скрипты массового ввода документов. |
| 3. Исправление критических мест | 4 недели | Переписать подписки, исправить XDTO-пакеты, обновить внешние компоненты. |
| 4. Приёмочное тестирование | 2 недели | Повторное нагрузочное тестирование + проверка всех бизнес-процессов. |
Итоговый совет: Не пытайтесь «переписать всё под 8.5». Сфокусируйтесь на тех 20% кода, которые дают 80% проблем. Аудит подписок и XDTO — это то, что спасёт вас от ночных звонков через месяц после перехода.
Попробовать НОПик →
Проверить свой уровень бесплатно →