В практике разработки на платформе 1С:Предприятие 8.3 часто возникает ситуация, когда при открытии формы документа выполняются «тяжелые» операции — например, запросы к внешним API для получения актуальных списков городов, цен или остатков. Если разместить такой код в процедуре ПриСозданииНаСервере, пользователь столкнется с задержкой открытия формы. Рассмотрим, как оптимизировать этот процесс, вызывая серверные процедуры только в момент взаимодействия с конкретным полем ввода, и разберем типичные ошибки, возникающие при передаче данных между сервером и клиентом.
Для того чтобы документ открывался мгновенно, нам необходимо изъять код обращения к API из инициализации формы и перенести его в обработчик события НачалоВыбора соответствующего элемента формы. Разберем этот процесс по шагам. Сначала создадим клиентский обработчик для поля ввода (например, ГородПолучатель).
Проанализируем пример кода на стороне клиента:
&НаКлиенте
Процедура ГородПолучатель_НачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
// Вызываем серверную процедуру для получения данных
ПолучитьДанныеИзAPIНаСервере();
КонецПроцедуры
В этом обработчике мы можем управлять стандартным поведением системы. Если мы планируем самостоятельно формировать список выбора, можно установить параметр СтандартнаяОбработка = Ложь.
Часто программисты сталкиваются с ошибкой при попытке вернуть результат запроса API на клиент. Рассмотрим ситуацию: серверная функция получает ответ от сервера в формате XML и преобразует его в ДокументDOM. При попытке передать этот объект в клиентскую процедуру система выдает ошибку отображения типов.
Выясним причину: объекты типов ДокументDOM, ЧтениеXML, HTTPОтвет существуют только в контексте сервера. Они не являются сериализуемыми, то есть их нельзя «упаковать» для передачи по сети на рабочее место пользователя (клиент).
Решение: Всю работу с такими объектами нужно выполнять внутри серверной процедуры, а на клиент возвращать только простые типы данных (строки, массивы, структуры). Посмотрим на правильную реализацию:
&НаСервере
Процедура ПолучитьДанныеИзAPIНаСервере()
// Формируем запрос к внешнему сервису
ТекстЗапроса = СформироватьЗапросAPI();
// Получаем DOM-документ (он живет только здесь, на сервере)
ОбъектDOM = ВыполнитьЗапросКСервису(ТекстЗапроса);
// Обрабатываем данные и записываем результат в реквизиты формы
// или в коллекцию, доступную на клиенте
ЗначениеДляПоля = ИзвлечьНужныеДанныеИзDOM(ОбъектDOM);
// Заполняем реквизит формы напрямую
Объект.Город = ЗначениеДляПоля;
КонецПроцедуры
Если ваша задача — не просто заполнить одно значение, а предложить пользователю список вариантов, полученных из API, проанализируем использование параметра ДанныеВыбора. Это позволяет показать выпадающий список прямо под полем ввода.
Алгоритм действий будет следующим:
СтандартнаяОбработка = Ложь в клиентском событии.СписокЗначений.ДанныеВыбора.Пример реализации:
&НаКлиенте
Процедура Город_НачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
СписокГородов = ПолучитьСписокГородовНаСервере();
ДанныеВыбора = СписокГородов;
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьСписокГородовНаСервере()
Список = Новый СписокЗначений;
// Логика получения данных из API и заполнения СпискаЗначений
// ...
Возврат Список;
КонецФункции
Рассмотрим более продвинутые методы, которые помогут сделать интерфейс еще более отзывчивым:
1. Кэширование данных. Чтобы не обращаться к API при каждом нажатии кнопки выбора (что может быть медленно и дорого), сохраняйте результат во временном хранилище или в скрытом реквизите формы (в формате JSON). Перед вызовом сервера проверяйте, нет ли уже готовых данных.
2. Использование события «АвтоПодбор». Вместо НачалоВыбора (нажатие на многоточие) попробуйте использовать АвтоПодбор. Это позволит подгружать данные из API в тот момент, когда пользователь начинает вводить первые буквы названия. Это значительно повышает удобство работы (UX).
3. Безопасность и отказоустойчивость. При работе с внешними сервисами всегда оборачивайте код в блок Попытка ... Исключение. В отличие от создания формы, ошибка в выборе не должна приводить к «вылету» программы. Пользователю стоит вывести понятное сообщение: «Сервис временно недоступен, попробуйте позже».
4. Контекст вызова. По возможности используйте &НаСервереБезКонтекста. Это ускоряет вызов, так как платформа не передает все данные формы (контекст) на сервер и обратно, что критично при работе через медленный интернет.
Таким образом, мы перенесли тяжелую нагрузку с момента открытия документа на момент фактической необходимости данных, обеспечив комфортную работу пользователя и корректную передачу данных между уровнями системы 1С.