При разработке внешних обработок и форм в 1С:Предприятие 8.3 (особенно в управляемом приложении) разработчики часто сталкиваются с ошибками при попытке привязать команду формы напрямую к серверной процедуре. Выясним причину такого поведения платформы и разберем по шагам правильную архитектуру взаимодействия клиентской и серверной частей при чтении файлов Excel.
В управляемых формах 1С процедура-обработчик команды, привязанной к кнопке, обязательно должна объявляться с директивой &НаКлиенте. Назначение директивы &НаСервере напрямую процедуре команды вызовет синтаксическую ошибку платформы.
Кнопка на форме нажата пользователем на его компьютере (на клиенте). Поэтому точка входа всегда должна располагаться на клиенте. Если вся бизнес-логика и обработка данных должна выполняться на стороне сервера, клиентская процедура выступает в роли обертки: она принимает действия пользователя и затем вызывает отдельную серверную процедуру (с директивой &НаСервере или &НаСервереБезКонтекста).
Проанализируем ситуацию: файл `.xlsx` находится на локальном компьютере пользователя (на клиенте), а создание документов или элементов справочника происходит на сервере 1С. Сервер не имеет прямого доступа к файловой системе клиентского компьютера. Чтобы сервер смог прочитать файл Excel, необходимо передать данные через временное хранилище.
Рассмотрим классический алгоритм передачи файла:
e1cib/tempstorage/...) и передаем его параметром в серверную процедуру.ПолучитьИмяВременногоФайла()).Посмотрим на пример реализации загрузки файла с использованием встроенного асинхронного метода НачатьПомещениеФайлаНаСервер, который за один шаг открывает диалог выбора и отправляет файл во временное хранилище:
&НаКлиенте
Процедура ЗагрузитьФайлКоманда(Команда)
// Настраиваем обработчик завершения выбора и помещаем файл во временное хранилище
ОписаниеОповещения = Новый ОписаниеОповещения("ЗагрузитьФайлЗавершение", ЭтотОбъект);
НачатьПомещениеФайлаНаСервер(ОписаниеОповещения, , , Новый УточнениеИспользованияДиалогаПеремещенияФайлов, УникальныйИдентификатор);
КонецПроцедуры
&НаКлиенте
Процедура ЗагрузитьФайлЗавершение(ОписаниеПомещенногоФайла, ДополнительныеПараметры) Экспорт
Если ОписаниеПомещенногоФайла = Неопределено Тогда
Возврат; // Пользователь отменил выбор файла
КонецЕсли;
// Вызываем серверную процедуру, передавая адрес во временном хранилище
ЗагрузитьИзExcelНаСервере(ОписаниеПомещенногоФайла.Адрес);
ПоказатьОповещениеПользователю("Загрузка", , "Загрузка данных из Excel успешно завершена!");
КонецПроцедуры
Теперь разберем серверную часть обработки файла:
&НаСервере
Процедура ЗагрузитьИзExcelНаСервере(АдресХранилища)
// Получаем двоичные данные из временного хранилища и сохраняем во временный файл сервера
ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресХранилища);
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xlsx");
ДвоичныеДанные.Записать(ИмяВременногоФайла);
// Считываем файл с помощью ТабличногоДокумента (не требует установки MS Excel)
ТабДок = Новый ТабличныйДокумент;
ТабДок.Прочитать(ИмяВременногоФайла, ТипФайлаТабличногоДокумента.XLSX);
// Обходим строки табличного документа и обрабатываем данные
Для НомерСтроки = 1 По ТабДок.ВысотаТаблицы Цикл
// Логика поиска или создания элементов номенклатуры
КонецЦикла;
// Очищаем временный файл на сервере
УдалитьФайлы(ИмяВременногоФайла);
КонецПроцедуры
При загрузке номенклатуры часто возникает вопрос связывания создаваемого позиционирования с классификатором единиц измерения. Разберем особенности структуры данных в УТ 11.2:
УпаковкиЕдиницыИзмерения.Владелец не заполнен (содержит пустую ссылку), то данный элемент является базовой единицей измерения из ОКЕИ (например, «шт», «кг»).Владелец заполнен (указывает на конкретный элемент справочника Номенклатура или набор упаковок), элемент считается индивидуальной упаковкой.При загрузке номенклатуры из Excel алгоритм поиска и привязки единицы измерения следующий: сначала выполняем поиск элемента в справочнике Справочники.УпаковкиЕдиницыИзмерения по коду ОКЕИ или наименованию с отбором по пустому владельцу. Найденая базовая единица присваивается реквизиту ЕдиницаИзмерения нового объекта справочника Номенклатура.