При разработке и отладке внешних обработок (например, предназначенных для заполнения табличных частей документов через механизмы Библиотеки Стандартных Подсистем — БСП) разработчики часто сталкиваются с двумя главными трудностями:
.epf, открытый в Конфигураторе, не участвует в исполнении кода напрямую, из-за чего точки останова проигрываются без остановки.ПолеФормы) из клиентской процедуры в серверную функцию приводит к ошибке: Ошибка передачи данных между клиентом и сервером. Значение недопустимого типа с причиной Отсутствует отображение для типа 'ПолеФормы'. Это связано с тем, что элементы формы существуют только в интерфейсном контексте на клиенте и не подлежат сериализации XDTO.Рассмотрим наиболее удобный и быстрый способ отладки внешней обработки без постоянной перерегистрации файла в справочнике дополнительных обработок.
Разберем по шагам, как настроить автономную форму прямо внутри файла внешней обработки:
.epf) в Конфигураторе и добавим в него новую форму (тестовую форму).ДокументОбъект с типом ссылки на проверяемый документ, например, ДокументСсылка.ЗаказКлиента.Проанализируем ситуацию с передачей параметров в клиент-серверной архитектуре управляемого приложения.
Посмотрим на пример некорректного кода, вызывающего ошибку преобразования XDTO:
&НаСервере
Функция ЗаполнитьОбъект(НовыйОбъект)
Если ТипЗнч(НовыйОбъект) = Тип("ДокументСсылка.ЗаказКлиента") Тогда
Сообщить("123");
КонецЕсли;
КонецФункции
&НаКлиенте
Процедура Тестировать(Команда)
// ОШИБКА: передается элемент формы Элементы.ДокументОбъект, а не значение реквизита!
ЗаполнитьОбъект(Элементы.ДокументОбъект);
КонецПроцедуры
Причиной ошибки является обращение к коллекции Элементы. Элементы пользовательского интерфейса (объекты типа ПолеФормы) нельзя передавать на сервер. Передавать между клиентом и сервером можно только сериализуемые типы данных: ссылки, числа, строки, структуры, массивы и значения реквизитов формы.
Рассмотрим правильный вариант передачи значения реквизита формы на сервер:
&НаСервере
Функция ЗаполнитьОбъект(НовыйОбъект)
Если ТипЗнч(НовыйОбъект) = Тип("ДокументСсылка.ЗаказКлиента") Тогда
Сообщить("123");
КонецЕсли;
КонецФункции
&НаКлиенте
Процедура Тестировать(Команда)
// ПРАВИЛЬНО: передается значение реквизита формы
ЗаполнитьОбъект(ЭтотОбъект.ДокументОбъект);
КонецПроцедуры
Если требуется проверить работу обработки непосредственно в контексте реального вызова из документа без создания тестовой формы, рассмотрим дополнительные методы:
ВнешниеОбработки.Создать("<путь_к_файлу.epf>", Ложь). Это позволит исполнять код напрямую из внешнего файла на диске..epf.Также важно убедиться, что для сервера 1С:Предприятие включен режим отладки (параметр -debug или включенная отладка по HTTP/TCP), иначе точки останова в серверных процедурах &НаСервере срабатывать не будут.