Так почему, же с режимом совместимости надо бороться, ведь он предназначен для поддержки старых конфигураций? Изначально оно так и было, однако с появлением 1С 8.3.3 это стало не совсем так.
Запрещенная комбинация условий
Получить такую комбинацию можно следующим образом:
- Режим совместимости – 8.2.13 или 8.1
- Включен запрет на синхронные вызовы и модальные окна.
Результатам этого станет следующее: новые обработки не смогут запуститься, по причине явного указания типов при проверке синтаксиса, а старые обработки станут неработоспособными - не было в те времена асинхронных решений.
Добавлю примечание, что флажки запрета на синхронные вызовы и модальные окна по результатам многочисленных экспериментам никак не связаны с указанным режимом совместимости.
Именно по этой причине, рекомендуется обходить особенности работы режима совместимости, чтобы гарантировать работу обработки в будущем, или если уж вы, как и я, являетесь поклонником ретро - дать возможность работать и на старых и на новых версиях 1С.
Работа режима совместимости показана на этой блок-схеме:
Раз уж речь пошла об том, как обойти режим совместимости, то это можно сделать при помощи следующих приемов:
- Неявное создание типов
- Открытие форм через ПолучитьФорму с последующей обработкой
- Вызов функции из строки
- Мягкий и жесткий аналог оператора выполнить на WEB клиенте
- Локальные способы обхода некоторых ограничений под IOS.
Все способы обхода имеет смысл рассмотреть подробно.
Неявное создание типов
Для этого следует рассмотреть сначала явное создание типов, и оно выглядит так:
Пар = новый Структура; //Дополнительные параметры
Т = новый ОписаниеОповещения ("ТЕСТ_В", ЭтаФорма, Пар);
Однако, оператор новый имеет и другой синтаксис, который не проверяется синтаксическим анализатором:
Пар = новый Структура; //Дополнительные параметры
Массив = новый Массив;
Массив.Добавить("ТЕСТ_В");
Массив.Добавить(ЭтаФорма);
Массив.Добавить(Пар);
Т = новый("ОписаниеОповещения",Массив);
Открытие форм через ПолучитьФорму
На примере обычных форм этот код выглядит таким образом:
Форма1=ЭтотОбъект.ПолучитьФорму("ФормаТОб",ЭтаФорма,новый УникальныйИдентификатор);
Форма1.Параметры = новый Структура("Т","1234");
Форма1.ОткрытьМодально();
Примечание:В данном случае Параметры - это экспортная переменная, которая была создана в открываемой форме. Упрощает унификацию кода с Управляемыми формами.
Для управляемых форм код выглядит таким образом:
Форма1=ПолучитьФорму(ИмяФормыОткрытия,ПараметрыФормы,ЭтаФорма);
Если ТипОписаниеОповещения=Неопределено Тогда // 1с 8.3.2 и старше
Результат=Форма1.ОткрытьМодально();
_ОбработкаИзмененияСохраненныхВариантов(Результат,Неопределено);
иначе
ПараметрыОповещения = Новый Массив;
ПараметрыОповещения.Добавить("_ОбработкаИзмененияСохраненныхВариантов");
ПараметрыОповещения.Добавить(ЭтаФорма);
Форма1.ОписаниеОповещенияОЗакрытии=новый("ОписаниеОповещения",ПараметрыОповещения);
Форма1.РежимОткрытияОкна=РежимОткрытияОкнаФормы.БлокироватьОкноВладельца;
Форма1.Открыть();
КонецЕсли;
Примечание: к сожалению, этот способ работает менее быстро, чем функция ОткрытьФорму, так как при этом работают часть обработчиков.
Операторы Выполнить/Вычислить - скрываем вызов функции от синтаксического контроля.
Для того чтобы исключить из проверки вызов функций в старых конфигурациях, можно использовать эти операторы следующим образом (пример кода):
Если ((ВерсияПлатформы[1]=3 И ВерсияПлатформы[2]<6) ИЛИ ВерсияПлатформы[1]<3) Тогда
УдалитьФайлы(ИмяФайла);
иначе
ПараметрыОповещения = Новый Массив;
ПараметрыОповещения.Добавить("_УдалитьФайлыЗавершение");
ПараметрыОповещения.Добавить(ЭтотОбъект);
ПараметрыОповещения.Добавить(новый Структура);
Выполнить("НачатьУдалениеФайлов(новый (""ОписаниеОповещения"",ПараметрыОповещения),ИмяФайла)");
КонецЕсли;
Такой трюк возможен во всех режимах работы, за исключением следующих случаев:
- WEB клиент, мобильный клиент IOS на стороне клиента.
- Мобильное приложение под IOS.
Если с последним вариантом, все тщетно, то первый случай небезнадежен.
Обход ограничения оператора Выполнить для WEB и Мобильного клиента
Поскольку серверная часть одинаковая у этих типов клиентов, следовательно, возникает возможность использовать следующие приемы:
- Дополнительная изолированная форма с нужным кодом. Содержит вызов нужной процедуры или функции. Управление кодом через параметры.
- Реализация аналога оператора выполнить через внешнюю обработку. Это нужно, когда идет речь о выполнении кода в полноценной консоли.
Первый способ используется следующим образом:
Если ТипОписаниеОповещения=Неопределено Тогда
//Ассинхронный режим уже не возможен - тогда производим вызов через синхронный переходник:
Адрес="";
Результат=ПоместитьФайл(Адрес,ИмяФильтраКакВДиалоге+"|"+"*."+Расширение , , Истина,новый УникальныйИдентификатор);
_ПослеВыбораФайлаНаЗагрузкуWEb(Результат,Адрес,Неопределено, ДополнительныеПараметры);
иначе
ПараметрыОповещения = Новый Массив;
ПараметрыОповещения.Добавить("_ПослеВыбораФайлаНаЗагрузкуWEb");
ПараметрыОповещения.Добавить(ЭтаФорма);
ПараметрыОповещения.Добавить(ДополнительныеПараметры);
//Костыль для функции НачатьПомещениеФайла для работы на платформе 8.2:
Форма=ЭтаФорма.ОбъектФормы+"ФормаФункций83УФЗагрузкаФайла";
ПараметрыОткрытия = новый Структура;
ПараметрыОткрытия.Вставить("ВерсияПлатформы",ЭтаФорма.ВерсияПлатформы);
ПараметрыОткрытия.Вставить("Расширение",ИмяФильтраКакВДиалоге+"|"+"*."+Расширение);
ПараметрыОткрытия.Вставить("РежимДиалога","Открытие");
Форма1=ПолучитьФорму(Форма,ПараметрыОткрытия,ЭтаФорма);
Форма1.ПоместитьФайлАСС(Новый ("ОписаниеОповещения",ПараметрыОповещения),Расширение);
КонецЕсли;
Данный код позволяет загрузить файл. В форме при этом рекомендуется оформить функцию, которая вызывается из дополнительной формы по аналогии с этим:
&НаКлиенте
Функция ПоместитьФайлАСС(Оповещение,Расширение) экспорт
#Если ВебКлиент Тогда
Если (ЭтаФорма.ВерсияПлатформы[1].Значение=3
И ЭтаФорма.ВерсияПлатформы[2].Значение<13) Тогда
//Для версий старше 8.3.3 - переходим на ассинхронный режим без диалога, т.к. он не задан:
НачатьПомещениеФайла(Оповещение, , "*."+Расширение , Истина, Новый УникальныйИдентификатор);
Иначе
//Для версий и новее 8.3.13 - переходим сразу на ассинхронный режим с диалогом, т.к. он не запрещен:
Режим = РежимДиалогаВыбораФайла.Открытие;
ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим);
ДиалогОткрытияФайла.Фильтр=Расширение;
ДиалогОткрытияФайла.МножественныйВыбор=Ложь;
НачатьПомещениеФайла(Оповещение, , ДиалогОткрытияФайла , Истина, Новый УникальныйИдентификатор);
КонецЕсли;
#КонецЕсли
КонецФункции
Примечание: при встраивании внутрь старых конфигураций лучше всего в такие формы ставить примечания, иначе потом легко забыть, а зачем нужна форма с ошибками!!!
Мобильное приложение под IOS
Поскольку с IOS все плохо, то все возможности преобразования жестко ограничены. Тем не менее часть задач решить можно:
- Используем ОписаниеТипов, если нужно проверить наличие того или иного типа и устраивает значение по умолчанию. К примеру, можно получить СправочникМенеджер, и убедиться что регистров расчета нет в мобильном приложении.
- Сохранение промежуточных данных с сервера через XML которые можно хранить внутри базы 1С. После этого можно восстановить на сервере значение.
- Сохранение произвольных значений через код ПоместитьВоВременноеХранилище(новый Структура("Т",Значение)). Структура нужна, так как иначе платформа будет ругаться на некоторые типы данных, которые не относят к пункту 2.
- Системные перечисления проверять через функцию ПредопределенноеЗначение. Это позволяет в ряде случаев разветвить алгоритмы.
- По возможности используем синхронные функции, это тоже спасает, так как на мобильную платформу запреты на модальные окна и синхронные вызовы не наложены.
Постскриптум:
Режим совместимости не приговор новым возможностям платформы для старых конфигураций, но требует к себе должного уважения. Также эти приемы позволяют эффективно писать независимый от режима совместимости код, который стабильно работает как на УПП, так и на ЗУП.
К статье приложены обработки:
- Реализация мягкого варианта обхода ограничений для WEB и мобильного клиента - позволяет просто загрузить текст из текстового файла в поле ввода, реализована для УФ и спроектирована на поддержку функций в WEB клиенте.
- Полный пример удаления файлов на платформе 1С 8.х. В этой обработке приведен пример удаления файлов с учетом кода, направленного на защиту от запрета на синхронные вызовы. Этот код способен работать даже на платформе 1С 8.0, но правда для этого его надо будет упаковать в формат обработки времен 1С 8.0.
Обработки созданы для платформы 1С 8.2.9 и новее. Конфигурация не важна.
Проверено на следующих конфигурациях и релизах:
- Бухгалтерия предприятия, редакция 1.6, релизы 1.6.31.1
- 1С:Библиотека стандартных подсистем, редакция 3.1, релизы 3.1.11.323
Вступайте в нашу телеграмм-группу Инфостарт