С выходом последних обновлений «1С:Бухгалтерия предприятия 3.0» (начиная с релизов 3.0.150, 3.0.202 и новее) многие технические специалисты столкнулись с неприятным сюрпризом: функциональность по загрузке внешних правил обмена (созданных в «Конвертации данных 2.0») была объявлена устаревшей. В интерфейсе синхронизации данных пользователи видят сообщение: «Функциональность по загрузке правил устарела и более не поддерживается», а привычные кнопки для выбора XML-файла исчезли или заблокированы.
Разберем подробно, почему это произошло, и как с помощью расширения восстановить работоспособность привычного обмена, если переход на EnterpriseData (КД 3.1) в данный момент невозможен. Если нужен готовый вариант такого восстановления, расширение для загрузки комплекта XML-правил возвращает возможность загружать правила КД 2.1 в регистр «ПравилаДляОбменаДанными» и содержит варианты для БСП 3.1.12 на платформе 8.3 и БСП 3.2.1 на платформе 8.5.
Проанализируем ситуацию: фирма «1С» планомерно отказывается от формата КД 2.0 в пользу более современного и безопасного EnterpriseData. Основная претензия к старым правилам конвертации заключается в том, что XML-файл может содержать произвольный исполняемый код в обработчиках событий. С точки зрения безопасности — это потенциальная уязвимость. Кроме того, поддержка старого кода в Библиотеке стандартных подсистем (БСП) усложняет развитие продукта.
Рассмотрим официальные рекомендации вендора на случай, если вам всё же нужно использовать логику КД 2.0:
EnterpriseData.Однако, если у вас настроен сложный нетиповой обмен (например, между УТ 10.3 и БП 3.0), внезапная блокировка загрузки правил может парализовать работу. Выясним, как решить эту проблему здесь и сейчас.
Для восстановления функционала нам потребуется создать расширение, которое решит две задачи: вернет элементы управления на форму и восстановит удаленные процедуры в общих модулях. Рассмотрим процесс поэтапно.
Нам необходимо заимствовать форму ПравилаРегистрацииОбъектов из регистра сведений ПравилаДляОбменаДанными. В новых релизах переключатель источника правил заблокирован. Мы добавим программное создание кнопок и команд.
Посмотрим на пример кода в обработчике ПриСозданииНаСервере, который следует разместить в модуле формы расширения:
&НаСервере
Процедура ПравилаОбмена_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
// Разблокируем возможность выбора источника "Из файла"
ЭтаФорма.Элементы.ИсточникПравилИзФайла.Видимость = Истина;
СписокВыбораИсточника = ЭтаФорма.Элементы.ИсточникПравил.СписокВыбора;
Если СписокВыбораИсточника.НайтиПоЗначению("ЗагруженныеИзФайла") = Неопределено Тогда
СписокВыбораИсточника.Добавить("ЗагруженныеИзФайла", "Из файла на компьютере");
КонецЕсли;
// Программно создаем группу и кнопку загрузки
ГруппаИсточникФайл = Элементы.Вставить("ПравилаОбмена_ИсточникФайл", Тип("ГруппаФормы"), Элементы.ГруппаОсновная);
ГруппаИсточникФайл.Вид = ВидГруппыФормы.ОбычнаяГруппа;
ГруппаИсточникФайл.Отображение = ОтображениеОбычнойГруппы.Нет;
ГруппаИсточникФайл.Группировка = ГруппировкаПодчиненныхЭлементовФормы.ГоризонтальнаяЕслиВозможно;
НоваяКоманда = ЭтаФорма.Команды.Добавить("ПравилаОбмена_ЗагрузитьПравила");
НоваяКоманда.Заголовок = "Загрузить правила из файла...";
НоваяКоманда.Действие = "ПравилаОбмена_ЗагрузитьПравила";
НоваяКнопка = Элементы.Вставить("ПравилаОбмена_КнопкаЗагрузить", Тип("КнопкаФормы"), ГруппаИсточникФайл);
НоваяКнопка.ИмяКоманды = "ПравилаОбмена_ЗагрузитьПравила";
// Управляем доступностью в зависимости от выбранного режима
Элементы.ПравилаОбмена_ИсточникФайл.Доступность = (ИсточникПравил = "ЗагруженныеИзФайла");
КонецПроцедуры
Проанализируем следующую проблему: в новых версиях БСП из общего модуля ОбменДаннымиКлиент были удалены процедуры, отвечающие за интерактивную передачу файла на сервер без использования расширения работы с файлами. Нам нужно добавить их обратно в расширение, в свой общий модуль (например, ЭФ_ОбменДаннымиКлиент).
Рассмотрим реализацию этих процедур:
Процедура ВыбратьИПередатьФайлНаСервер(ОповещениеЗавершения, Знач ПараметрыДиалога = Неопределено, Знач ИдентификаторФормы = Неопределено) Экспорт
УмолчанияДиалога = Новый Структура;
УмолчанияДиалога.Вставить("ПроверятьСуществованиеФайла", Истина);
УмолчанияДиалога.Вставить("Заголовок", "Выберите файл правил (.xml или .zip)");
ДополнительныеПараметры = Новый Структура;
ДополнительныеПараметры.Вставить("ОповещениеЗавершения", ОповещениеЗавершения);
Оповещение = Новый ОписаниеОповещения("ВыбратьИПередатьФайлНаСерверЗавершение", ЭтотОбъект, ДополнительныеПараметры);
ПараметрыЗагрузки = ФайловаяСистемаКлиент.ПараметрыЗагрузкиФайла;
ПараметрыЗагрузки.ИдентификаторФормы = ИдентификаторФормы;
ФайловаяСистемаКлиент.ЗагрузитьФайл(Оповещение, ПараметрыЗагрузки);
КонецПроцедуры
Процедура ВыбратьИПередатьФайлНаСерверЗавершение(ПомещенныйФайл, ДополнительныеПараметры) Экспорт
Если ПомещенныйФайл = Неопределено Тогда
Возврат;
КонецЕсли;
Результат = Новый Структура("Имя, Хранение, ОписаниеОшибки");
Результат.Имя = ПомещенныйФайл.Имя;
Результат.Хранение = ПомещенныйФайл.Хранение;
ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОповещениеЗавершения, Результат);
КонецПроцедуры
Теперь выясним, как связать кнопку на форме с процедурой загрузки. В модуле формы расширения пропишем клиентский метод:
&НаКлиенте
Процедура ПравилаОбмена_ЗагрузитьПравила(Команда)
ПараметрыДиалога = Новый Структура;
ПараметрыДиалога.Вставить("Фильтр", "Правила обмена (*.xml;*.zip)|*.xml;*.zip");
Оповещение = Новый ОписаниеОповещения("ЗагрузитьПравилаЗавершение", ЭтотОбъект);
// Вызываем нашу восстановленную процедуру из общего модуля расширения
ЭФ_ОбменДаннымиКлиент.ВыбратьИПередатьФайлНаСервер(Оповещение, ПараметрыДиалога, УникальныйИдентификатор);
КонецПроцедуры
&НаКлиенте
Процедура ЗагрузитьПравилаЗавершение(Результат, ДополнительныеПараметры) Экспорт
Если Результат = Неопределено Или ПустаяСтрока(Результат.Хранение) Тогда
Возврат;
КонецЕсли;
// Вызываем серверный метод загрузки правил в регистр
ВыполнитьЗагрузкуПравилНаСервере(Результат.Хранение, Результат.Имя);
ПоказатьОповещениеПользователя("Успех", , "Правила успешно загружены");
КонецПроцедуры
Важно помнить, что в типовой конфигурации существует несколько механизмов обмена. Если вы используете план обмена СинхронизацияЧерезУниверсальныйОбмен, форма настройки может отличаться. Проанализируйте, какой именно объект используется в вашем случае. Чаще всего достаточно заимствовать общую форму НастройкаПараметровОбменаДанными или форму регистра ПравилаДляОбменаДанными.
Важный момент по безопасности: при подключении расширения обязательно снимите флажок «Безопасный режим». В противном случае расширение не сможет работать с файловой системой и выполнять процедуры загрузки в привилегированном режиме.
Хотя предложенный вариант с расширением является рабочим «костылем», позволяющим продолжить эксплуатацию КД 2.0, мы должны понимать, что это временное решение. С каждым обновлением 1С будет всё глубже вырезать код поддержки старых правил из ядра системы. Пока КД 2 еще остается в эксплуатации и правила приходится регулярно обновлять, обработка загрузки правил из КД 2 по HTTP позволяет получать правила регистрации и конвертации из сервиса КД 2 и записывать их для настроенной синхронизации.
Рассмотрим долгосрочную стратегию:
EnterpriseData, доработав только необходимые поля через расширение в модуле МенеджерОбменаЧерезУниверсальныйФормат.Таким образом, мы выяснили причину блокировки и нашли способ восстановить функционал. Используйте данный подход аккуратно, предварительно протестировав его на копии информационной базы.