Загрузка заказов из внешних файлов — одна из самых частых задач при автоматизации взаимодействия с поставщиками и покупателями. В 1С:УНФ эта задача может быть решена как стандартными средствами, так и с помощью разработки собственной обработки, если файлы имеют сложную структуру (например, объединенные ячейки или специфическое форматирование). В данной статье мы разберем по шагам, как реализовать надежный механизм импорта данных.
Прежде чем приступать к написанию собственного программного кода, проанализируем возможности встроенного механизма. В конфигурации 1С:Управление нашей фирмой существует стандартная обработка «Загрузка данных из файла». Она доступна непосредственно из списков документов «Заказы покупателей» или «Заказы поставщикам».
Рассмотрим возможности этого инструмента:
Однако стандартный механизм пасует перед файлами, где есть сложная «шапка», объединенные ячейки или когда данные по одному заказу разбросаны по разным листам. В таких случаях нам потребуется создание собственной обработки.
Разберем техническую сторону вопроса. Традиционный метод через Excel.Application требует обязательного наличия установленного Microsoft Office на рабочем месте. Если на компьютере используется LibreOffice или OpenOffice, этот метод работать не будет.
Проанализируем более современный и универсальный способ — использование объекта ТабличныйДокумент. Метод Прочитать() позволяет загружать файлы форматов .xlsx и .xls напрямую в память 1С без использования стороннего ПО.
Посмотрим на пример кода для инициализации чтения файла:
// Создаем объект табличного документа
ТабДок = Новый ТабличныйДокумент;
Попытка
// Читаем файл Excel напрямую
ТабДок.Прочитать(ПутьКФайлу, СпособЧтенияЗначенийТабличногоДокумента.Значение);
Исключение
Сообщить("Не удалось прочитать файл: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
Этот метод работает значительно быстрее COM-соединения и корректно распознает типы данных. Кроме того, он позволяет работать с файлами даже на сервере под управлением Linux.
Выясним причину, по которой обычный перебор строк часто не срабатывает. В Excel значение в объединенной области физически хранится только в «верхней левой» ячейке. Если ваш код обращается к другой ячейке этой же области, он получит пустое значение.
Чтобы корректно обработать такие данные, проанализируем следующую логику: при чтении каждой ячейки необходимо проверять, не является ли она частью объединения. В 1С это реализуется через свойство Область.Объединенная.
Рассмотрим пример функции для получения значения даже из объединенной ячейки:
Функция ПолучитьЗначениеЯчейки(ТабДок, НомерСтроки, НомерКолонки)
ТекущаяОбласть = ТабДок.Область(НомерСтроки, НомерКолонки);
Если ТекущаяОбласть.СодержитЗначение Тогда
Возврат ТекущаяОбласть.Значение;
ИначеЕсли ТекущаяОбласть.Текст <> "" Тогда
Возврат ТекущаяОбласть.Текст;
КонецЕсли;
// Если ячейка пустая, проверяем, не входит ли она в объединение
Если ТекущаяОбласть.Объединенная Тогда
// Можно реализовать логику поиска основной ячейки области
КонецЕсли;
Возврат Неопределено;
КонецФункции
Часто при загрузке штрихкодов из Excel возникают проблемы с форматированием. Например, длинные числовые коды могут отображаться в научном формате (4,6E+12). Чтобы избежать ошибок сопоставления, выполним следующие шаги:
СокрЛП().Формат() с параметром ЧГ=0 для получения «чистой» строки цифр.Вместо того чтобы создавать отдельную процедуру под каждого контрагента, мы рекомендуем использовать механизм профилей загрузки. Выясним, как это работает на практике.
Создадим структуру настроек (это может быть справочник или регистр сведений), где для каждого контрагента будут храниться:
Таким образом, основной код обработки становится универсальным. Проанализируем пример цикла загрузки:
Для НомерСтроки = Настройки.НачальнаяСтрока По ТабДок.ВысотаТаблицы Цикл
Артикул = ТабДок.Область(НомерСтроки, Настройки.КолонкаАртикул).Текст;
Если ПустаяСтрока(Артикул) Тогда
Продолжить; // Пропускаем пустые строки
КонецЕсли;
Количество = Число(ТабДок.Область(НомерСтроки, Настройки.КолонкаКоличество).Текст);
// Поиск номенклатуры
НайденнаяСсылка = Справочники.Номенклатура.НайтиПоАртикулу(Артикул);
// Создание строки в документе...
КонецЦикла;
В 1С:УНФ есть крайне полезный функционал — справочник «Номенклатура контрагентов». Это позволяет сопоставлять артикулы поставщика с вашими внутренними кодами. Рекомендуем при загрузке реализовывать следующий алгоритм поиска:
НоменклатураКонтрагентов по владельцу (поставщику) и его артикулу/наименованию.Номенклатура.Такой подход избавляет от необходимости переименовывать товары в базе или заставлять поставщика менять его формат Excel.
Хорошей практикой считается создание промежуточной таблицы на форме обработки перед созданием документа. Это позволяет пользователю:
Реализуя загрузку по этим правилам, мы получаем отказоустойчивый инструмент, который легко масштабируется под новых партнеров без изменения программного кода.