Схема работы режима совместимости, который появился в 1С 8.2, выглядит следующим образом:

При этом до появления 1С 8.3.3 проблем не было, поскольку управление запретом на синхронные вызовы и модальные окна не было. Однако, с появлением возможности управления этими признаками появилась и запрещенная комбинация:
- Режим совместимости – 8.2.13 или 8.1
- Включен запрет на синхронные вызовы и модальные окна.
Называется она запрещенная, потому что новые обработки не смогут запуститься, по причине явного указания типов при проверке синтаксиса, а старые обработки станут неработоспособными из-за выставленного запрета. Данная комбинация появилась, поскольку 1С не предусмотрела связи пукнтов 1 и 2 в различных комбинациях. На практике мне встречались конфигурации - где для "модальных окон и синхронных вызовов" стояло использовать с предупреждениями.
Для защиты кода обработок от такого непредвиденного поведения, автором были найдены следующие способы адаптации кода:
- Неявное создание типов
- Открытие форм через ПолучитьФорму с последующей обработкой
- Вызов функции из строки
- Мягкий и жесткий аналог оператора выполнить на WEB клиенте
- Локальные способы обхода некоторых ограничений под IOS.
Неявное создание типов, осуществляется специальным вариантом синтаксиса оператора "Новый":
Пар = новый Структура; //Дополнительные параметры
Массив = новый Массив;
Массив.Добавить("ТЕСТ_В");
Массив.Добавить(ЭтаФорма);
Массив.Добавить(Пар);
Т = новый("ОписаниеОповещения",Массив);
Главное преимущество такого подхода в том, что синтаксис контроль не проверяет типы при их создании, то есть создаются реальные типы внутри платформы.
Открытие формы через функцию "ПолучитьФорму" позволяет решить следующие проблемы:
- Функция "ОткрытьФорму" в 1с 8.2 и 8.3 имеет разное число параметров.
- Позволяет быстро настроить параметры и заполнить реквизиты перед открытием.
На примере обычных форм этот код выглядит таким образом:
Форма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, мобильные)
ПОповещ = Новый Массив;
ПОповещ .Добавить("_ПослеВыбораФайлаНаЗагрузкуWEb");
ПОповещ .Добавить(ЭтаФорма);
ПОповещ .Добавить(ДополнительныеПараметры);
// Спец. форма-обёртка для функции НачатьПомещениеФайла
Форма = ЭтаФорма.ОбъектФормы + "ФормаФункций83УФЗагрузкаФайла";
ПОткрытия= Новый Структура;
ПОткрытия.Вставить("ВерсияПлатформы", ЭтаФорма.ВерсияПлатформы);
ПОткрытия.Вставить("Расширение", ИмяФильтра + "|" + "*." + Расширение);
ПОткрытия.Вставить("РежимДиалога", "Открытие");
Форма1 = ПолучитьФорму(Форма, ПОткрытия, ЭтаФорма);
Форма1.ПоместитьФайлАСС(Новый("ОписаниеОповещения", ПОповещ), Расширение);
КонецЕсли;
Данный код позволяет загрузить файл. В форме при этом рекомендуется оформить функцию, которая вызывается из дополнительной формы по аналогии с этим:
&НаКлиенте
Функция ПоместитьФайлАСС(Оповещение, Расширение) Экспорт
#Если ВебКлиент Тогда
Если (ЭтаФорма.ВерсияПлатформы[1].Значение = 3 И ЭтаФорма.ВерсияПлатформы[2].Значение < 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
Вступайте в нашу телеграмм-группу Инфостарт