Как внедрить управляемые формы и библиотеку МДЛП в старую конфигурацию на обычных формах?

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

Внедрение современных библиотек (таких как МДЛП или обновленные версии БСП) в конфигурации на базе «1С:Предприятие 8.2» или даже «8.1» (например, сильно переписанная «Бухгалтерия предприятия 1.5») — это сложная техническая задача. Она сопряжена с конфликтами режимов совместимости, механизмов блокировок и синтаксиса встроенного языка. Рассмотрим подробный алгоритм преодоления основных трудностей, возникающих при таком «скрещивании» технологий.

Решение проблемы ошибки SDBL при изменении режима совместимости

При попытке запустить старую базу в режиме без совместимости (или с версией 8.3.х) часто возникает ошибка SDBL: ожидается имя таблицы (pos=6). Проанализируем причину её появления. Как правило, это связано с тем, что в МодулеОбычногоПриложения или МодулеСеанса происходит обращение к метаданным, которые платформа в новом режиме пытается обработать иначе, либо к объектам, которые еще не инициализированы на уровне базы данных.

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

  1. Проанализируем код в МодулеОбычногоПриложения и МодулеСеанса.
  2. Если там присутствуют прямые обращения к константам или запись объектов, попробуем вынести эту логику в общий модуль с флагами Сервер и Вызов сервера.
  3. Проверим, не вызывается ли установка значений в момент, когда транзакция инициализации еще не завершена. Как показывает практика, перенос кода инициализации из модуля приложения в специализированный серверный модуль «лечит» большинство ошибок структуры SDBL.

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

Современные библиотеки 1С (включая МДЛП) жестко ориентированы на работу в режиме управляемых блокировок. Старые конфигурации обычно используют автоматический режим. При их совмещении вы неизбежно столкнетесь с ошибкой: «Использование блокировки допустимо только внутри транзакции в режиме управляемых блокировок!».

Рассмотрим, как правильно настроить систему, не переписывая весь старый код:

Во-первых, в свойствах самой конфигурации установим Режим управления блокировками данных в значение Управляемый. Однако это изменит поведение всей базы. Чтобы старые механизмы (документы, регистры) продолжали работать корректно, для каждого «старого» объекта метаданных необходимо в его свойствах вручную установить режим блокировок Автоматический.

Во-вторых, разберем ситуацию с БСП, которая встроена в МДЛП. Код библиотеки часто вызывает метод Блокировка.Заблокировать(). Посмотрим на пример того, как это выглядит в коде:


ПланыОбменаМенеджер = ПланыОбмена.ГруппыУдаленногоДоступа;
Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("ПланОбмена.ГруппыУдаленногоДоступа");
// Если конфигурация в автоматическом режиме, эта строка вызовет исключение
Блокировка.Заблокировать();

Чтобы избежать этой ошибки, убедитесь, что все объекты, которые фигурируют в методах Блокировка.Добавить(), переведены в режим управляемых блокировок или что вся конфигурация работает в смешанном режиме (когда общий режим — Управляемый, а частный у объектов — Автоматический).

Эмуляция функций новых платформ (СтрНайти, СтрСодержит)

Если вы вынуждены оставить низкий режим совместимости (например, 8.2.14) из-за особенностей старого кода, вы обнаружите, что библиотека МДЛП не компилируется из-за отсутствия функций типа СтрНайти(). В новых версиях платформы они встроены, а в старых использовалась функция Найти().

Выясним, как обойти это ограничение. Мы можем создать «обертку» в глобальном общем модуле. Создадим новый общий модуль, назовем его, например, ГлобальныйОболочка, установим свойства Глобальный, Клиент, Сервер.

Разберем пример реализации функции СтрНайти для старых платформ:


Функция СтрНайти(Строка, ПодстрокаПоиска, НаправлениеПоиска = Неопределено, НачальнаяПозиция = 1, НомерВхождения = 1) Экспорт
    // Простейшая реализация для совместимости
    Возврат Найти(Строка, ПодстрокаПоиска);
КонецФункции

Аналогичным образом можно реализовать СтрСодержит, СтрНачинаетсяС и другие методы. Это позволит коду МДЛП работать без модификации каждой строки самой библиотеки.

Настройка работы в смешанном режиме (Управляемые формы в обычном приложении)

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

В свойствах конфигурации необходимо включить флаг Использовать управляемые формы в обычном приложении. Это позволит открывать управляемые формы МДЛП прямо внутри «толстого клиента». Для этого достаточно вызвать форму программно:


ПараметрыФормы = Новый Структура;
ОткрытьФорму("Справочник.МДЛП_РеестрЛекарственныхПрепаратов.ФормаОбъекта", ПараметрыФормы);

Важный нюанс: Чтобы управляемый интерфейс МДЛП был доступен, необходимо корректно настроить ПараметрыСеанса. Поскольку в старой «Бухгалтерии 1.5» нет стандартных параметров БСП (например, ТекущийПользователь), вам придется либо добавить их вручную, либо обернуть обращения к ним в коде МДЛП проверками.

Использование условной компиляции для совместимости

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


Процедура УстановкаПараметровСеанса(ИменаПараметровСеанса)
    
    #Если ОбычноеПриложение Тогда
        // Здесь оставляем старый код БП 1.5
        ИнициализироватьСтарыеПараметры(ИменаПараметровСеанса);
    #КонецЕсли

    #Если Сервер Тогда
        // Здесь инициализируем параметры, необходимые для МДЛП и БСП
        Если ИменаПараметровСеанса = Неопределено Тогда
             // Инициализация всех параметров
        КонецЕсли;
    #КонецЕсли
    
КонецПроцедуры

Такой подход гарантирует, что при запуске управляемого сеанса система не будет пытаться инициализировать объекты обычного приложения, которые могут быть недоступны на сервере или в тонком клиенте.

Работа с определяемыми типами

Библиотека МДЛП активно использует ОпределяемыеТипы (например, для ссылки на Организации или Склады). В конфигурации БП 1.5 таких объектов нет, они появились в платформе позже.

Если вы переходите на платформу 8.3, вам придется вручную создать эти объекты в дереве метаданных. После создания ОпределяемогоТипа.Организация, обязательно включите в его состав ваш старый справочник Справочники.Организации. Без этого шага формы МДЛП будут открываться, но вы не сможете выбрать в них данные из вашей основной базы, так как типы данных не будут совпадать.

Рассмотрим итоговый чек-лист для успешного внедрения:

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

Соблюдение этих шагов позволит вам использовать современный функционал маркировки лекарственных средств (МДЛП) даже в очень старых и сильно модифицированных конфигурациях 1С.

← На главную