С какими проблемами можно столкнуться при переходе на платформу 1С 8.3.8 и как их решить?

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

Выход технологической платформы 1С:Предприятие 8.3.8 принес разработчикам и системным администраторам как долгожданные архитектурные новшества, так и ряд жестких ограничений и неочевидных ошибок. Проанализируем ключевые изменения платформы, разберем типичные проблемы при обновлении информационных баз и рассмотрим по шагам методы их устранения.

Новый формат файловых баз данных и снятие лимита в 4 ГБ

До версии 8.3.8 файловые информационные базы использовали размер страницы данных, равный 4096 байт. Архитектура внутреннего хранилища файла 1Cv8.1CD (где корневая страница ссылается на страницы индексов, а те — на страницы данных) ограничивала максимальный объем одной внутренней таблицы величиной приблизительно в 4 ГБ. Начиная с версии 8.3.8, реализована поддержка страниц переменного размера: 4096, 8192, 16384, 32768 и 65536 байт.

При использовании страницы размером 65 536 байт теоретический предел размера отдельной таблицы возрастает до 64 ГБ. Разберем, как выполнить изменение формата:

  1. Завершим все сеансы пользователей в информационной базе.
  2. Запустим утилиту cnvdbfl.exe, расположенную в каталоге bin установленной платформы, указав путь к файлу базы данных и требуемый размер страницы.

Важное ограничение: после конвертации на размер страницы более 4096 байт база данных физически не сможет открываться версиями платформы ниже 8.3.8. При попытке открытия прежними релизами система сообщит о несовместимости формата файла.

Обязательное требование Microsoft SQL Server Native Client

При переходе клиент-серверных баз на платформу 8.3.8 многие сталкиваются с ошибками СУБД при создании новой информационной базы или восстановлении из .dt, если сервер 1С и MS SQL Server физически разнесены на разные хосты. Выясним причину: начиная с этой версии, платформа прекратила использование устаревшего системного OLE DB провайдера SQLOLEDB и перешла на работу через Microsoft SQL Server Native Client (SQLNCLI11).

Для устранения проблемы разберем обязательные шаги:

  1. Установим компонент sqlncli.msi соответствующей разрядности непосредственно на сервер, где запущены службы ragent и rphost.
  2. Перезапустим службу сервера 1С:Предприятия.

Кроме того, платформа изменила типы полей на стороне MS SQL: устаревший тип DATETIME заменен на DATETIME2(3), что устранило необходимость сдвига дат на 2000 лет и повысило точность, а типы IMAGE и TEXT заменены на VARBINARY(MAX) и NVARCHAR(MAX). Обратим внимание, что физическая смена типов колонок в СУБД происходит только при первой полной реструктуризации таблиц (например, при обновлении метаданных или через операцию реструктуризации в «Тестировании и исправлении»).

Запрет серверных вызовов при закрытии управляемых форм

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

Рассмотрим правильный паттерн реализации вопросов пользователю («Записать и закрыть») через прерывание стандартного потока событий с использованием неблокирующего метода ПоказатьВопрос():


&НаКлиенте
Переменная ДействиеПодтверждено;

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

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

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

Пакетные запросы во временных таблицах динамических списков

Платформа 8.3.8 предоставила возможность использовать пакетные запросы с временными таблицами непосредственно в качестве источника динамического списка, а также добавила метод Запрос.ВыполнитьПакетСПромежуточнымиДанными() и коллекцию МенеджерВременныхТаблиц.Таблицы при отладке.

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

  1. Результирующая выборка: последний запрос в тексте пакета обязательно должен быть запросом, возвращающим данные для отображения в списке. Завершать пакет уничтожением временных таблиц (УНИЧТОЖИТЬ) или выгрузками запрещено.
  2. Изоляция контекста: запрос динамического списка не может использовать внешние менеджеры временных таблиц и не может отдавать сформированные таблицы наружу.
  3. Нагрузка на tempdb: при динамическом скроллинге, наложении отборов или пользовательских сортировок весь пакет выполняется СУБД заново для расчета порции данных. Неоптимальные пакетные запросы в списках создают высокую нагрузку на дисковую подсистему сервера баз данных.

Утечка портов UDP и падение рабочих процессов кластера

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

Разберем пути решения данной проблемы:

  1. Обновление релиза: установим сборку 8.3.8.2027 или более поздние стабильные версии, где утечка сетевых дескрипторов официально устранена.
  2. Временная компенсация: в свойствах кластера серверов зададим перезапуск рабочих процессов с интервалом раз в несколько часов, а в реестре операционной системы увеличим диапазон динамических портов MaxUserPort.

Проблемы с полосой прокрутки и отображением списков

В интерфейсе «Такси» на платформе 8.3.8 вертикальная полоса прокрутки в динамических списках была заменена кнопками навигации по страницам. Одновременно в обычных формах (например, в типовых решениях УПП 1.3 и КА 1.1) проявился баг с неработающей полосой прокрутки у элементов управления типа ТабличноеПоле со значением Список.

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

← На главную