Внедрение современных библиотек (таких как МДЛП или обновленные версии БСП) в конфигурации на базе «1С:Предприятие 8.2» или даже «8.1» (например, сильно переписанная «Бухгалтерия предприятия 1.5») — это сложная техническая задача. Она сопряжена с конфликтами режимов совместимости, механизмов блокировок и синтаксиса встроенного языка. Рассмотрим подробный алгоритм преодоления основных трудностей, возникающих при таком «скрещивании» технологий.
При попытке запустить старую базу в режиме без совместимости (или с версией 8.3.х) часто возникает ошибка SDBL: ожидается имя таблицы (pos=6). Проанализируем причину её появления. Как правило, это связано с тем, что в МодулеОбычногоПриложения или МодулеСеанса происходит обращение к метаданным, которые платформа в новом режиме пытается обработать иначе, либо к объектам, которые еще не инициализированы на уровне базы данных.
Разберем конкретный случай: ошибка может возникать при попытке установки значения константы или чтения параметров сеанса непосредственно в обработчиках старта системы. Для решения этой проблемы выполним следующие действия:
МодулеОбычногоПриложения и МодулеСеанса.Сервер и Вызов сервера.Современные библиотеки 1С (включая МДЛП) жестко ориентированы на работу в режиме управляемых блокировок. Старые конфигурации обычно используют автоматический режим. При их совмещении вы неизбежно столкнетесь с ошибкой: «Использование блокировки допустимо только внутри транзакции в режиме управляемых блокировок!».
Рассмотрим, как правильно настроить систему, не переписывая весь старый код:
Во-первых, в свойствах самой конфигурации установим Режим управления блокировками данных в значение Управляемый. Однако это изменит поведение всей базы. Чтобы старые механизмы (документы, регистры) продолжали работать корректно, для каждого «старого» объекта метаданных необходимо в его свойствах вручную установить режим блокировок Автоматический.
Во-вторых, разберем ситуацию с БСП, которая встроена в МДЛП. Код библиотеки часто вызывает метод Блокировка.Заблокировать(). Посмотрим на пример того, как это выглядит в коде:
ПланыОбменаМенеджер = ПланыОбмена.ГруппыУдаленногоДоступа;
Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("ПланОбмена.ГруппыУдаленногоДоступа");
// Если конфигурация в автоматическом режиме, эта строка вызовет исключение
Блокировка.Заблокировать();
Чтобы избежать этой ошибки, убедитесь, что все объекты, которые фигурируют в методах Блокировка.Добавить(), переведены в режим управляемых блокировок или что вся конфигурация работает в смешанном режиме (когда общий режим — Управляемый, а частный у объектов — Автоматический).
Если вы вынуждены оставить низкий режим совместимости (например, 8.2.14) из-за особенностей старого кода, вы обнаружите, что библиотека МДЛП не компилируется из-за отсутствия функций типа СтрНайти(). В новых версиях платформы они встроены, а в старых использовалась функция Найти().
Выясним, как обойти это ограничение. Мы можем создать «обертку» в глобальном общем модуле. Создадим новый общий модуль, назовем его, например, ГлобальныйОболочка, установим свойства Глобальный, Клиент, Сервер.
Разберем пример реализации функции СтрНайти для старых платформ:
Функция СтрНайти(Строка, ПодстрокаПоиска, НаправлениеПоиска = Неопределено, НачальнаяПозиция = 1, НомерВхождения = 1) Экспорт
// Простейшая реализация для совместимости
Возврат Найти(Строка, ПодстрокаПоиска);
КонецФункции
Аналогичным образом можно реализовать СтрСодержит, СтрНачинаетсяС и другие методы. Это позволит коду МДЛП работать без модификации каждой строки самой библиотеки.
Многие разработчики совершают ошибку, пытаясь запускать два отдельных сеанса базы (один в обычном режиме, другой в управляемом). Это неудобно для пользователя и чревато конфликтами доступа к файлам/данным. Проанализируем более элегантный способ.
В свойствах конфигурации необходимо включить флаг Использовать управляемые формы в обычном приложении. Это позволит открывать управляемые формы МДЛП прямо внутри «толстого клиента». Для этого достаточно вызвать форму программно:
ПараметрыФормы = Новый Структура;
ОткрытьФорму("Справочник.МДЛП_РеестрЛекарственныхПрепаратов.ФормаОбъекта", ПараметрыФормы);
Важный нюанс: Чтобы управляемый интерфейс МДЛП был доступен, необходимо корректно настроить ПараметрыСеанса. Поскольку в старой «Бухгалтерии 1.5» нет стандартных параметров БСП (например, ТекущийПользователь), вам придется либо добавить их вручную, либо обернуть обращения к ним в коде МДЛП проверками.
При внедрении новой библиотеки в старое ядро часто возникают конфликты в МодулеСеанса. Чтобы управляемое приложение не пыталось выполнять старый код, предназначенный только для обычного интерфейса (и наоборот), используем директивы компиляции. Проанализируем типичную структуру МодуляСеанса:
Процедура УстановкаПараметровСеанса(ИменаПараметровСеанса)
#Если ОбычноеПриложение Тогда
// Здесь оставляем старый код БП 1.5
ИнициализироватьСтарыеПараметры(ИменаПараметровСеанса);
#КонецЕсли
#Если Сервер Тогда
// Здесь инициализируем параметры, необходимые для МДЛП и БСП
Если ИменаПараметровСеанса = Неопределено Тогда
// Инициализация всех параметров
КонецЕсли;
#КонецЕсли
КонецПроцедуры
Такой подход гарантирует, что при запуске управляемого сеанса система не будет пытаться инициализировать объекты обычного приложения, которые могут быть недоступны на сервере или в тонком клиенте.
Библиотека МДЛП активно использует ОпределяемыеТипы (например, для ссылки на Организации или Склады). В конфигурации БП 1.5 таких объектов нет, они появились в платформе позже.
Если вы переходите на платформу 8.3, вам придется вручную создать эти объекты в дереве метаданных. После создания ОпределяемогоТипа.Организация, обязательно включите в его состав ваш старый справочник Справочники.Организации. Без этого шага формы МДЛП будут открываться, но вы не сможете выбрать в них данные из вашей основной базы, так как типы данных не будут совпадать.
Рассмотрим итоговый чек-лист для успешного внедрения:
Соблюдение этих шагов позволит вам использовать современный функционал маркировки лекарственных средств (МДЛП) даже в очень старых и сильно модифицированных конфигурациях 1С.