1с загрузка таблицы excel в таблицу значений

23.04.2019

Получение таблицы значений из excel в 1С v8, без COM, внешних источников данных и т.д.
EXCELВТаблицуЗначений() — За 10 строчек кода!
Реализация протестирована на 1С 8.3.12.1714 (x64).

WARNING

Данная статья не претендует на оригинальность и не является конечным решением.

Подходы решения задач и примеры программного кода несут исключительно обучающий характер.

Существует масса подходов загрузки данных из EXCEL в 1С. Большинство решений основаны на COM или еще более сложных возможностях платформы.

Для себя разработал наиболее оптимальный вариант:
EXCEL -> Табличный документ -> Построитель запроса -> Таблица значений

Итак, приступим:

  1. Прочитать Excel файл на клиенте, для передачи на сервер: 
    &НаКлиенте
    Процедура ЗагрузитьEXCEL(Команда)
    
    Файл = Новый Файл(ПутьКEXCEL);
    Если НЕ Файл.Существует() Тогда
    Возврат;
    КонецЕсли;
    ДвоичныеДанные = Новый ДвоичныеДанные(ПутьКEXCEL);
    ДокументРезультат = EXCELВТаблицуЗначений(ДвоичныеДанные, Файл.Расширение);
    ДокументРезультат.Показать();
    
    КонецПроцедуры
  1. Выполнить чтение Excel в таблицу значений: 
    &НаСервере
    Функция EXCELВТаблицуЗначений(ДвоичныеДанные, Расширение)
    
    ФайлEXCELНаСервере = ПолучитьИмяВременногоФайла(Расширение);
    ДвоичныеДанные.Записать(ФайлEXCELНаСервере);
    
    ТабличныйДокумент = Новый ТабличныйДокумент;
    ТабличныйДокумент.Прочитать(ФайлEXCELНаСервере);
    УдалитьФайлы(ФайлEXCELНаСервере);
    ОбластьТаблицы = ТабличныйДокумент.Область(8, 1, ТабличныйДокумент.ВысотаТаблицы, ТабличныйДокумент.ШиринаТаблицы);
    
    ПостроительЗапроса = Новый ПостроительЗапроса;
    ПостроительЗапроса.ИсточникДанных = Новый ОписаниеИсточникаДанных(ОбластьТаблицы);
    ПостроительЗапроса.Выполнить();
    ТаблицаДанных = ПостроительЗапроса.Результат.Выгрузить();
    
    // теперь поссмторим что в Таблице
    Возврат ТаблицаЗначенийВТабличныйДокумент(ТаблицаДанных);
    
    КонецФункции 
  2. Визуализировать таблицу значений: 

    &НаСервереБезКонтекста
    Функция ТаблицаЗначенийВТабличныйДокумент(ТаблицаДанных)
    
    ПостроительОтчета = Новый ПостроительОтчета;
    ПостроительОтчета.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТаблицаДанных);
    ДокументРезультат = Новый ТабличныйДокумент;
    Построительотчета.Вывести(ДокументРезультат);
    Возврат ДокументРезультат;
    
    КонецФункции

Описание преобразования данных:

  1. Получаем исходный файл на клиенте;
  2. На основании файла создаем двоичные данные и получаем расширение файла;
  3. Передаем двоичные данные на сервер;
  4. Создаем дубль файла excel на сервере;
  5. Читаем файл в новый табличный документ;
  6. Получаем область табличного документа, где находятся полезные данные (ТабличныйДокумент.Область(8, 1, ТабличныйДокумент.ВысотаТаблицы, ТабличныйДокумент.ШиринаТаблицы));
  7. Создаем новый построитель запроса и установим в качестве источника данных — область полезных данных;
  8. Выполним построитель и получим результат запроса;
  9. Результат запроса выгрузим в таблицу значений.

Плюсы реализации:

  • Скорость работы по сравнению с COM EXCEL
  • Возможно выполнять загрузку где EXCEL нет вообще (MAC | LINUX | etc…)
  • Простота реализации

В статье рассмотрены варианты загрузки файлов Excel и табличных документов в объекты 1С, на примере таблиц значений. Если вам нужно загрузить файл Excel с одним или несколькими листами (не важно, xls или xlsx, или даже ods), или прочитать средствами 1С табличный документ mxl – читайте эту статью. Приводятся примеры кода, которые вы можете адаптировать под ваши задачи. Материал вышел большой, для удобства пользуйтесь навигацией по содержанию.

Содержание

Зачем писать свою загрузку? Ведь есть же типовые?

Во многих типовых конфигурациях на базе БСП имеется подсистема “Загрузка данных из файла”, кроме того, на ИТС можно найти обработку загрузки данных из табличного документа. Они позволяют загружать из внешних файлов данные во многие объекты: табличные части документов, справочники, регистры сведений. Кроме того, у этих обработок достаточно мощный функционал по сопоставлению данных из файла с объектами в базе 1С, разнообразные настройки, возможность создания элементов, в случае если они не найдены…

Так в чем же необходимость “изобретать велосипед”? На то несколько причин.

  • Излишняя сложность. Ради универсальности приходится жертвовать простотой, и для рядового пользователя универсальные обработки могут оказаться сложнее, чем узкоспециализированная обработка, написанная под конкретный формат файла.
  • Как ни странно, не стопроцентная универсальность. Действительно, как быть, если нам нужно загрузить не справочники, а планы видов характеристик? Или план расчета? Или на основании одного файла заполнить сразу несколько документов?
  • Необходимость в специфичных алгоритмах. Например, при создании контрагента создавать также строго определенные договоры, или при загрузке в документ выполнять заполнение дополнительных, рассчетных колонок
  • Сложные форматы исходных файлов. Например, исходный файл содержит несколько листов, и каждый из этих листов следует отдельно обработать. Второй пример – данные на листе сложно структурированы, и на одном листе могут содержаться несколько табличных частей, разделенных пустыми строками или колонками. Такие форматы встречаются, в частности, в отчетах зарубежных брокеров. На одном листе содержится информация и о сделках с финансовыми инструментами, и о движении денежных средств, и информация о ценных бумагах, и т.д.

В каком случае хороши универсальные загрузки из табличного документа?

Различные обработки загрузки из табличного документа отлично подходят, когда формат загружаемого файла не слишком сложный, а загрузка не предполагает множества дополнительных действий. Типичные примеры: загрузка прайс-листов, загрузка заказов, загрузка начальных остатков.

Подходящих случаев использования универсальных механизмов загрузки действительно много, иначе их не стали бы включать в библиотеку стандартных подсистем. Но если функциональности стандартных средств недостаточно, всегда можно создать свою собственную обработку. Ниже рассмотрены несколько приемов, которые можно использовать при загрузке файлов Excel и других табличных документов в 1С.

Особенности загрузки из файлов Excel с несколькими листами

При использовании метода табличного документа Прочитать(), файл Excel с несколькими листами читается так, что каждый лист помещается в отдельную именованную область ячеек, но при этом весь файл выводится в один табличный документ.

&НаКлиенте
Процедура ПрочитатьФайл(Команда)
	
ОбработкаОкончанияПомещения = Новый ОписаниеОповещения("ОбработчикОкончанияПомещения", ЭтотОбъект);
ПараметрыДиалога = Новый ПараметрыДиалогаПомещенияФайлов;
ПараметрыДиалога.Фильтр = "Excel файлы(*.xls;*.xlsx)|*.xls;*.xlsx";
НачатьПомещениеФайлаНаСервер(ОбработкаОкончанияПомещения, , , АдресВХ, ПараметрыДиалога, ЭтотОбъект.УникальныйИдентификатор);
	
КонецПроцедуры

&НаКлиенте
Процедура ОбработчикОкончанияПомещения(ОписаниеПомещенногоФайла, ДополнительныеПараметры) Экспорт
	
АдресФайла = ОписаниеПомещенногоФайла.Адрес;
ПрочитатьИзВХНаСервере(АдресФайла);
	
КонецПроцедуры

&НаСервере
Процедура ПрочитатьИзВХНаСервере(АдресВХ)
	
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xlsx");

ДД = ПолучитьИзВременногоХранилища(АдресВХ);
ДД.Записать(ИмяВременногоФайла);

СпособЧтения = СпособЧтенияЗначенийТабличногоДокумента.Текст;

//Рассмотрим пример, когда загружаем в 1С файл xlsx с листами
// Лист1, Лист2, Лист3, Лист4, Лист5
Попытка
	ТабДок.Прочитать(ИмяВременногоФайла, СпособЧтения);
	МассивИмен = Новый Массив;
	Для Каждого Область Из ТабДок.Области Цикл
		МассивИмен.Добавить(Область.Имя);
	КонецЦикла;
	Элементы.ИмяЛиста.СписокВыбора.ЗагрузитьЗначения(МассивИмен);
Исключение
КонецПопытки;
	
КонецПроцедуры

1С загрузка xlsx несколько листов

Загрузка с обходом строк и колонок

Для первого примера используем решение “в лоб”. Предположим, что количество и порядок колонок в файле известно заранее, и не меняется. Также будем считать постоянной и известной заранее первую строку, с которой следует начинать загрузку. Тогда нам достаточно в цикле пройти от первой строки до конца табличного документа.

Не следует путать методы табличного документа Область() и ПолучитьОбласть(). Первый возвращает область ячеек, а второй – новый табличный документ.

Если структура колонок таблицы, в которую мы загружаем, полностью идентична структуре колонок файла, мы можем загрузить данные, используя индексы.

&НаСервере
Процедура ПрочитатьВТаблицуЗначенийНаСервере()
	
//Работает и на сервере, и в тонком клиенте, возвращает область ячеек
ОбластьТЗ = ТабДок.Области.Лист2;
ОбластьТЗ = ТабДок.Область("Лист2");
//Работает только на сервере, возвращает табличный документ
Лист2 = ТабДок.ПолучитьОбласть("Лист2");

ТаблицаЗначений.Очистить();
ТЗ = ТаблицаЗначений.Выгрузить();
Для НомерСтроки = 6 По Лист2.ВысотаТаблицы Цикл
	СтрТЗ = ТЗ.Добавить();
	Для НомерКолонки = 2 По Лист2.ШиринаТаблицы Цикл
		СтрТЗ[НомерКолонки-2] = Лист2.Область(НомерСтроки, НомерКолонки, НомерСтроки, НомерКолонки).Текст;
	КонецЦикла;
КонецЦикла;
ТаблицаЗначений.Загрузить(ТЗ);
			
КонецПроцедуры

Если же состав колонок отличается, предпочтительнее использовать имена колонок. Обратите внимание, что при получении текста области, мы используем четыре параметра, чтобы получить область в виде конкретной ячейки. Но также можно указывать два параметра, если вы уверены, что в файле не будет объединенных ячеек, либо наоборот, указывать прямоугольную область объединенных ячеек – все зависит от конкретной задачи.

ТаблицаЗначений.Очистить();
ТЗ = ТаблицаЗначений.Выгрузить();
Для НомерСтроки = 6 По Лист2.ВысотаТаблицы Цикл
	СтрТЗ = ТЗ.Добавить();
	Наименование = Лист2.Область(НомерСтроки, 2, НомерСтроки, 2).Текст;
	Количество = Лист2.Область(НомерСтроки, 3, НомерСтроки, 3).Текст;
	Цена = Лист2.Область(НомерСтроки, 4, НомерСтроки, 4).Текст;
	Сумма = Лист2.Область(НомерСтроки, 5, НомерСтроки, 5).Текст;
	СтрТЗ.Наименование = Наименование;
	СтрТЗ.Количество = Количество;
	СтрТЗ.Цена = Цена;
	СтрТЗ.Сумма = Сумма;
КонецЦикла;
ТаблицаЗначений.Загрузить(ТЗ);

С полученными данными можно дальше работать как угодно. Например, выполнить поиск  товара по наименованию, и если он не найден – создать такой товар. Либо наоборот – вывести пользователю ошибку, что товар не удалось найти. Выбор подходящей бизнес-логики выходит за рамки данной статьи.

Загрузка файла Excel в таблицу значений 1С

Загрузка табличного документа при помощи построителя отчета

В случае, когда у загружаемого файла есть строка с заголовками, можно выполнить загрузку из файла Excel, используя построитель отчета. В этом случае следует задать прямоугольную область ячеек, включая строку заголовков. В результате получится объект РезультатЗапроса, который далее можно обрабатывать как обычно – например, выгрузить в таблицу значений, поместить во временную таблицу и использовать в других запросах, и т.д.

&НаСервере
Процедура ПрочитатьПриПомощиПостроителяНаСервере()
	
Лист3 = ТабДок.ПолучитьОбласть("Лист3");
ОбластьЯчеек = Лист3.Область(5, 2, Лист3.ВысотаТаблицы, Лист3.ШиринаТаблицы);
ИсточникДанных = Новый ОписаниеИсточникаДанных(ОбластьЯчеек);
ПостроительОтчета = Новый ПостроительОтчета; 
ПостроительОтчета.ИсточникДанных = ИсточникДанных;
ПостроительОтчета.Выполнить();
ТЗ = ПостроительОтчета.Результат.Выгрузить();
ТаблицаЗначений2.Загрузить(ТЗ);
	
КонецПроцедуры

1С табличный документ в таблицу значений

Важно! В случае, если заголовки колонок в файле не соответствуют правилу именования переменных в 1С, они будут изменены компоновщиком – некорректные символы и пробелы будут заменены на знак подчеркивания “_”.

1С прочитать табличный документ с помощью построителя отчетов

1С загрузить табличный документ через построитель отчетов

Динамическое сопоставление данных при загрузке

Предыдущие примеры ориентированы на работу с известным и неизменным составом колонок в исходном файле. Но что, если формат файла может меняться? Чтобы каждый раз не переписывать код, можно сделать его более гибким. Рассмотрим более сложный пример.

Предположим, есть несколько прайс-листов от разных поставщиков. Эти файлы имеют похожие, но не одинаковые форматы. Колонки могут располагаться в разном порядке, по-разному называться, шапка файла также имеет разное количество строк. В этом случае можно создать обработку, которая пусть и не будет универсальной, но будет достаточно гибко настраиваемой.

Добавим реквизит для указания имени области (чтобы можно было выбирать конкретный лист для чтения). Также добавим реквизит для указания пользователем номера первой строки. И основная часть настроек – таблица сопоставления колонок. Минимально достаточно будет сделать две колонки – номер исходный и номер принимающий. Такой прием распространен достаточно широко, и называется маппингом. Кроме маппинга по номерам существуют и другие варианты маппинга – например, по именам колонок.

Прочитать файл xls в 1С

&НаСервере
Процедура ПрочитатьСДинамическимиНастройкамиНаСервере()
	
НужныйЛист = ТабДок.ПолучитьОбласть(ИмяЛиста);

ТаблицаЗначений3.Очистить();
ТЗ = ТаблицаЗначений3.Выгрузить();

Для НомерСтроки = НомерПервойСтроки По НужныйЛист.ВысотаТаблицы Цикл
	СтрТЗ = ТЗ.Добавить();
	Для Каждого СтрСопоставления Из ТаблицаСопоставления Цикл
		НомерКолонки = СтрСопоставления.НомерКолонкиИсходный;
		СтрТЗ[СтрСопоставления.НомерКолонкиПринимающий-1] = НужныйЛист.Область(НомерСтроки, НомерКолонки, НомерСтроки, НомерКолонки).Текст;
	КонецЦикла;
КонецЦикла;
ТаблицаЗначений3.Загрузить(ТЗ);

КонецПроцедуры

Более сложные сценарии

Не всегда форматы получаемых файлов удобны для загрузки. И не всегда есть возможность попросить передающую сторону обработать файл перед отправкой. Например, файл формируется каким-нибудь веб-ресурсом, либо присылается брокером по электронной почте. Можно конечно, посадить отдельного человека на обработку таких файлов и приведение их к единому формату – но это не самое рациональное и экономически оправданное решение.

Универсального “рецепта” нет, и далее будут только мои рекомендации и подходы, которые сформировались за годы практики.

Загрузка Excel в 1С

Выше приведен специально усложненный формат файла, но на практике встречаются гораздо более неудобные файлы excel, которые нужно загрузить в 1С. Итак, с чем можно столкнуться, и что можно попробовать предпринять?

  • “Плавающая” шапка. В зависимости от каких-нибудь условий, первая строка значимой информации может изменяться. Решение – динамически определять начало таблицы для загрузки – по тексту шапки таблицы, по цвету ячеек, и т.п.
  • Несколько таблиц на одном листе. Решение – динамически определять начало и окончание каждой таблицы. В качестве окончания могут служить строки с текстом “Итого”, “Всего”. Также определять начало следующей таблицы и отнимать определенное количество строк, которое разделяет одну и другую таблицы в файле.
  • Неподходящий формат ячеек. Текст “100 500.50” не является числом, и необходимо выполнить ряд действий, чтобы преобразовать его к числу – удалить разделитель разрядов, заменить точку на запятую, при необходимости удалить символ валюты, если он также присутствует в ячейке.
  • Объединенные ячейки. Решение – анализируйте формат, используйте соответствующие параметры при задании области ячеек.
  • Пустые строки, пустые колонки. Встречаются решения, когда файл анализируется с определенной строки и до первой встретившейся пустой ячейки – предполагается, что достигнут конец файла. Но такой подход не всегда корректен. Возможны случаи, когда после пустой строки или колонки продолжаются значимые строки. Решение – использовать более точный способ определения конца таблицы: метод ВысотаТаблицы, ячейки с ключевыми словами, ячейки с ключевым оформлением цветом.

Если вас не испугал последний раздел, и вы дочитали до конца – поздравляю и благодарю! Мне доводилось загружать файлы excel на китайском языке, загружать отчеты брокеров с самыми дикими форматами, загружать xls-файлы, полученные путем распознавания отсканированного изображения, и бороться с кучей ошибок.
Верьте в себя, не опускайте руки перед лицом проблем, и все получится!

 +3 

   

Распечатать

Иногда требуется разобрать данные из Excel в 1С.
Я считаю что легче и быстрей поместить все данные в ТаблицуЗначений и уже там ими манипулировать.

Пример 2-х функций которые я использую:

ИзExcelВТаблицу – Читает Excel в ТаблицуЗначений
ЭлементСправочника – Создает или находит элемент справочника.
Теперь сам код:

Код 1C v 8.х

 // Загрузка данных из Excel файла в ТаблицуЗначений 
// Возвращает ТаблицуЗначений с данными
// ПутьДоExcel - путь до Excel файла
// НомерСтраницы - Номер страницы в Excel
// ПерСтрокаЗаголовок - первая строка Excel содержит имена столбцов
// ФормаИндикатора - Стандартная форма прогресса работы
Функция ИзExcelВТаблицу(ПутьДоExcel, НомерСтраницы = 1, ПерСтрокаЗаголовок = Ложь , ФормаИндикатора = Неопределено)
Попытка
Док = ПолучитьCOMОбъект(ПутьДоExcel);
Исключение
Сообщить("Произошла ошибка при обращение к Excel:" + Символы.ПС + ОписаниеОшибки());
Возврат Неопределено;
КонецПопытки;

ЗакрытьФормуИндиктаора = Ложь;
Если ФормаИндикатора = Неопределено тогда
ЗакрытьФормуИндиктаора = Истина;
ФормаИндикатора = ПолучитьОбщуюФорму("ХодВыполненияОбработкиДанных");
ФормаИндикатора.Открыть();
КонецЕсли;
ФормаИндикатора.КомментарийЗначения = "Загрузка данных из Excel...";

ТЗ = Новый ТаблицаЗначений();
Страница = Док.Sheets(НомерСтраницы);
МакСтрок = Страница.UsedRange.Rows.Count; // макс. колич. строк
МакСтолб = Страница.UsedRange.Columns.Count; // макс. колич. столбцов

Для Столбец = 1 по МакСтолб цикл
ИмяСтолбца = "Столбец_" + Столбец;
Если ПерСтрокаЗаголовок тогда
ИмяСтолбца = Страница.Cells(1,Столбец).Value;
ИмяСтолбца = СокрЛП(ИмяСтолбца);
ИмяСтолбца = СтрЗаменить(ИмяСтолбца," ","_");
КонецЕсли;
ТЗ.Колонки.Добавить(ИмяСтолбца, Новый ОписаниеТипов("Строка"));
КонецЦикла;

НачальнаяСтрока = 1;
Если ПерСтрокаЗаголовок тогда
НачальнаяСтрока = 2;
КонецЕсли;

Для НомСтрока = НачальнаяСтрока по МакСтрок цикл
СтрТЗ = ТЗ.Добавить();
Для НомСтолбец = 1 по МакСтолб цикл
Данные = Страница.Cells(НомСтрока,НомСтолбец).Value;
СтрТЗ[НомСтолбец-1] = Данные;
КонецЦикла;

ФормаИндикатора.ЭлементыФормы.Индикатор.Значение = НомСтрока/МакСтрок * 100;
КонецЦикла;

Если ЗакрытьФормуИндиктаора тогда
ФормаИндикатора.Закрыть();
КонецЕсли;

Возврат ТЗ;
КонецФункции

Пример вызова:
Код 1C v 8.х

 ФормаИндикатора = ПолучитьОбщуюФорму("ХодВыполненияОбработкиДанных");
ФормаИндикатора.НаименованиеОбработкиДанных = "Загрузка данных...";
ФормаИндикатора.Открыть();

ТЗ = ИзExcelВТаблицу(ФайлExcel,1,Истина,ФормаИндикатора);
Если ТЗ = Неопределено тогда
ФормаИндикатора.Закрыть();
Возврат;
КонецЕсли;

ФормаИндикатора.Закрыть();

или

Код 1C v 8.х

 ТЗ = ИзExcelВТаблицу(ФайлExcel);        
Если ТЗ = Неопределено тогда
Возврат;
КонецЕсли;

Теперь функция которой я использую когда надо создать элемент справочника из полученных данных.
Код 1C v 8.х

 // Создаем в справочнике "ИмяСправочника" элемент
// ИмяЭлемента - Имя созданного элемента в справочнике "ИмяСправочника"
// ИмяРодителя - Имя родительского элемента (отсутствует если не древовидный).
// Разделитель \ позволяет писать древовидный путь родителя из нескольких элементов
// Параметры - Соответствие содержащие список параметров для элемента
// СоздатьЕслиНетЭлемента - Создает элемент если нет. Иначе ищет и обновляет
Функция ЭлементСправочника(ИмяСправочника = "",ИмяЭлемента, ИмяРодителя = Неопределено, Параметры = Неопределено, СоздатьЕслиНетЭлемента=Истина)
Если ИмяСправочника = "" тогда
Сообщить("Укажите имя спрачоника - ЭлементСправочника()");
Возврат Неопределено;
КонецЕсли;

Если ПустаяСтрока(ИмяЭлемента) тогда
Возврат Неопределено;
КонецЕсли;

// Создаем или ищем родителя
Родитель = Неопределено;
Если ИмяРодителя <> Неопределено тогда

ОбрабатИмяРодителя = ИмяРодителя;
РодительГруппы = Справочники[ИмяСправочника].ПустаяСсылка();

Пока НЕ ПустаяСтрока(ОбрабатИмяРодителя) цикл

ПозРазделителя = Найти(ОбрабатИмяРодителя,"\");
Если ПозРазделителя = 0 тогда
ИмяГруппы = ОбрабатИмяРодителя;
ОбрабатИмяРодителя = ""
Иначе
ИмяГруппы = Сред(ОбрабатИмяРодителя,1, ПозРазделителя-1);
ОбрабатИмяРодителя = Сред(ОбрабатИмяРодителя,ПозРазделителя+2);
КонецЕсли;

ТексЗапроса = "ВЫБРАТЬ
| Данные.Ссылка
|ИЗ
| Справочник."+ИмяСправочника+" КАК Данные
|ГДЕ
| Данные.Родитель = &Родитель
| И Данные.Наименование = &Наименование
| И Данные.ЭтоГруппа";

ЗапросРодителя = Новый Запрос(ТексЗапроса);
ЗапросРодителя.УстановитьПараметр("Родитель", РодительГруппы);
ЗапросРодителя.УстановитьПараметр("Наименование", ИмяГруппы);
РезультатРодителя = ЗапросРодителя.Выполнить().Выгрузить();

// Создаем родителя в случае необходимости
Если РезультатРодителя.Количество() <> 0 тогда
РодительГруппы = РезультатРодителя[0].Ссылка
Иначе
ОбъектРодитель = Справочники[ИмяСправочника].СоздатьГруппу();
ОбъектРодитель.Родитель = РодительГруппы;
ОбъектРодитель.Наименование = ИмяГруппы;
ОбъектРодитель.Записать();
РодительГруппы = ОбъектРодитель.Ссылка;
КонецЕсли;
КонецЦикла;
Родитель = РодительГруппы;
КонецЕсли;

// Создаем или ищем элемент
Элемент = Справочники[ИмяСправочника].НайтиПоНаименованию(ИмяЭлемента);
ОбъектЭлемент = Неопределено;

Если Элемент.Пустая() тогда
Если СоздатьЕслиНетЭлемента тогда
ОбъектЭлемент = Справочники[ИмяСправочника].СоздатьЭлемент();
ОбъектЭлемент.Наименование = ИмяЭлемента;
Иначе
Элемент = Неопределено
КонецЕсли;
Иначе
ОбъектЭлемент = Элемент.ПолучитьОбъект();
КонецЕсли;

Если ОбъектЭлемент <> Неопределено тогда
// Устанвалвиаем доп. параметры
Если Параметры <> Неопределено тогда
Для каждого СтрПараметр из Параметры цикл
ОбъектЭлемент[СтрПараметр.Ключ] = СтрПараметр.Значение;
КонецЦикла;
КонецЕсли;

Если Родитель <> Неопределено тогда
ОбъектЭлемент.Родитель = Родитель;
КонецЕсли;

ОбъектЭлемент.Записать();
Элемент = ОбъектЭлемент.Ссылка;
КонецЕсли;

Возврат Элемент;
КонецФункции

Автор: borismor

   Чайник Рассела

1 — 04.06.10 — 15:23

// Обработчик события НачалоВыбора элемента ПутьКФайлу.

//

Процедура ПутьКФайлуExcelНачалоВыбора(Элемент, СтандартнаяОбработка)

   
   СтандартнаяОбработка = Ложь;

   
   Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);

   Диалог.Заголовок = «Выберите файл»;

   Диалог.ПолноеИмяФайла = «c:»;

   Диалог.Фильтр = «Книга Excel 97-2003 (*.xls)|*.xls|Книга Excel 2007 (*.xlsx)|*.xlsx»;

   
   Если Диалог.Выбрать() Тогда

       
           ПутьКФайлу = Диалог.ПолноеИмяФайла;

   
       
   КонецЕсли;

   
КонецПроцедуры

   Just4Fun

2 — 04.06.10 — 15:23

Функция ПрочитатьФайлЭксель(ПутьКФайлу) Экспорт

       //Создание объекта для установки связи с источником данных
   Connection = Новый COMОбъект(«ADODB.Connection»);
   //сформируем строку подключения
   //Если необходимо в дальнейшем оперировать цифровыми значениями колонок,то ставим признак HDR = NO
   //если необходимо производить загрузку с учетом псевдонимов в 1й строке,то ставим HDR = YES
   СтрокаПодключения = «Provider=Microsoft.Jet.OLEDB.4.0; Data Source = «+ПутьКФайлу;
   СтрокаПодключения = СтрокаПодключения + «; Extended Properties = «+»»»Excel 8.0″+»;HDR=NO;IMEX=1″»;»;
   //подключение к источнику данных
   Попытка
       Connection.Open(СтрокаПодключения);
   Исключение
       Сообщить(ОписаниеОшибки());
       Возврат Неопределено;
   КонецПопытки;    

       //создание объекта выполнения команды
   Command = Новый COMОбъект(«ADODB.Command»);
   //создание объекта подключения к файлу
   axCatalog = Новый COMОбъект(«ADOX.Catalog»);
   axCatalog.ActiveConnection = Connection;
   //получим листы документа,
   //для обработки колонок листа можно обратится к коллекции Лист.Columns,которую тоже можно обойти посредством цикла Для каждого

   СписокЛистов = Новый СписокЗначений;
   КоличествоКолонок = 0;
   Для каждого Лист ИЗ axCatalog.Tables Цикл

               ТекстЗапросаКолонки = «»;
       Если Лист.Columns.Count() > 5 Тогда
           Для к = 1 По Лист.Columns.Count() Цикл
               ТекстЗапросаКолонки = ТекстЗапросаКолонки + ?(ТекстЗапросаКолонки=»»,»F»+Формат(к,»ЧЦ=15; ЧГ=0″),»,F»+Формат(к,»ЧЦ=15; ЧГ=0″));    
           КонецЦикла;
           СписокЛистов.Добавить(Лист.Name,ТекстЗапросаКолонки);
           КоличествоКолонок = к — 1;
           Прервать;
       КонецЕсли;

           КонецЦикла;

           //Создание объекта набора записей
   RecordSet = Новый COMОбъект(«ADODB.RecordSet»);
   //Указание активного соединения
   Command.ActiveConnection = Connection;
   //получим количество строк в документе
   Command.CommandText = «SELECT COUNT(*)FROM [«+СписокЛистов[0].Значение+»]»;
   //определение типа команды
   Command.CommandType = 1;
   //Выполнение и получение набора данных
   RecordSet = Command.Execute();
   //первая запись это количество
   КоличествоСтрок = RecordSet.Fields(0).Value;
   //опредлеление текста команды
   Command.CommandText = «SELECT «+СписокЛистов[0].Представление+» FROM [«+СписокЛистов[0].Значение+»]»;
   //определение типа команды
   Command.CommandType = 1;

       //Выполнение и получение набора данных
   Попытка
       RecordSet = Command.Execute();
   Исключение
       Сообщить(ОписаниеОшибки());
   КонецПопытки;

       МассивТипов = Новый Массив;
   МассивТипов.Добавить(Тип(«Дата»));
   МассивТипов.Добавить(Тип(«Строка»));
   МассивТипов.Добавить(Тип(«Число»));
   МассивТипов.Добавить(Тип(«СправочникСсылка.Номенклатура»));

       ОписаниеТипов = Новый ОписаниеТипов(МассивТипов,Новый КвалификаторыЧисла(15,2),Новый КвалификаторыСтроки(100),Новый КвалификаторыДаты(ЧастиДаты.Дата));

       ТаблицаЗагрузки = Новый ТаблицаЗначений;
   Колонки = ТаблицаЗагрузки.Колонки;
   Для к = 1 По КоличествоКолонок Цикл
       Колонки.Добавить(«F» + Формат(к,»ЧЦ=15; ЧГ=0″),ОписаниеТипов);
   КонецЦикла;

       RecordSet.MoveNext();//т.к первая строка это заголовки таблиц,не будем ее учитывать
   Пока RecordSet.EOF() = 0 Цикл
       НоваяСтрока = ТаблицаЗагрузки.Добавить();
       к = 0;
       Для каждого Колонка ИЗ ТаблицаЗагрузки.Колонки Цикл
           НоваяСтрока[Колонка.Имя] = СокрЛП(Строка(RecordSet.Fields(к).Value));
           к = к+1;
       КонецЦикла;
       RecordSet.MoveNext();
   КонецЦикла;

       //Колонки.Добавить(«Нпп» ,Новый ОписаниеТипов(«Дата,Строка,Число»,Новый КвалификаторыЧисла(15),Новый КвалификаторыСтроки(100),Новый КвалификаторыДаты(ЧастиДаты.Дата)));

       Возврат ТаблицаЗагрузки;

       RecordSet.Close();    

       Connection.Close();

    КонецФункции

   FIXXXL

3 — 04.06.10 — 15:24

Функция ПрочитатьВТаблицуЗначений(Файл)

   Excel = Новый ComОбъект(«Excel.Application»);
   Excel.Workbooks.Open(ФайлXML);
   Excel.DisplayAlerts = 0; //Не выводить предупреждения Excel

       ТЗ = Новый ТаблицаЗначений;
   Для ии = 1 По Excel.Cells.SpecialCells(11).Column Цикл

               Попытка
           Если ии < 10 Тогда
               ТЗ.Колонки.Добавить(«Кол00″+Строка(ии), ,Excel.ActiveSheet.Cells(1,ии).Value);
           Иначе
               ТЗ.Колонки.Добавить(«Кол0″+Строка(ии), ,Excel.ActiveSheet.Cells(1,ии).Value);
           КонецЕсли;
       Исключение
           //Если ии < 10 Тогда
           //    ТЗ.Колонки.Добавить(«Кол00″+Строка(ии), ,Excel.ActiveSheet.Cells(1,ии).Value);
           //Иначе
           //    ТЗ.Колонки.Добавить(«Кол0″+Строка(ии), ,Excel.ActiveSheet.Cells(1,ии).Value);
           //КонецЕсли;
           Сообщить(«Не удалось добавить колонку»);
       КонецПопытки;

           КонецЦикла;

           КолКолонок = ии — 1;

       КоличествоСтрок = Excel.Cells.SpecialCells(11).Row;

       Если НомерНачальнойСтроки < 1 Тогда
       НомерНачальнойСтроки = 1
   КонецЕсли;

       //Для ии = 2 По КоличествоСтрок  Цикл    
   Для ии = НомерНачальнойСтроки По КоличествоСтрок  Цикл
       стр = ТЗ.Добавить();
       Для кол = 1 По КолКолонок Цикл
           стр[кол-1] = Excel.ActiveSheet.Cells(ии,кол).Value;
       КонецЦикла;
       Состояние(«Загружено из XLS: «+Строка(ии)+ » из «+Строка(КоличествоСтрок));
   КонецЦикла;

       Excel.Quit();

   Возврат ТЗ;

    КонецФункции // ПрочитатьВТаблицуЗначений()

   Maxus43

13 — 04.06.10 — 15:45

ещё вариант

Док = ПолучитьCOMОбъект(Путь + «ценыконкурентов.xls»);

КоличествоСтраниц = 2;

Для ТекНомер = 1 По КоличествоСтраниц Цикл

   Контрагент = Док.Sheets(ТекНомер).Cells(1,1).Value;

   Товар       = Док.Sheets(ТекНомер).Cells(2,2).Value;

   Цена       = Док.Sheets(ТекНомер).Cells(2,3).Value;

   счСтроки = 3;

   Сообщить(Строка(Товар) + «-» + Строка(Цена));

   Пока СокрЛП(Товар) <> «» Цикл    // можно использовать другой признак

                                    // окончания данных на листе

       Товар = Док.Sheets(ТекНомер).Cells(СчСтроки,2).Value;

       Цена  = Док.Sheets(ТекНомер).Cells(СчСтроки,3).Value;

       Сообщить(Строка(Товар) + «-» + Строка(Цена));

       
       счСтроки = счСтроки + 1;

       
   КонецЦикла;

КонецЦикла;    

Док.Application.Quit();

  

Skylark

14 — 04.06.10 — 15:48

Excel = Новый COMОбъект(«Excel.Application»);

НашФайл = Excel.Workbooks.Open(СокрЛП(ПолеВводаИмяФайла));

НашЛист = НашФайл.Sheets(ПолеВводаНомерЛиста);

Если ПолеВводаНомерПоследнейстрокиДанных = 0 Тогда

 ПоследняяСтрока = Excel.Cells(1,1).SpecialCells(11).Row;

Иначе

 ПоследняяСтрока = ПолеВводаНомерПоследнейстрокиДанных;

КонецЕсли;    

Для i = ПолеВводаНомерПервойСтроки По ПоследняяСтрока Цикл

 Состояние(«Загрузка строки » + i);

 // чтение данных из файла

 Наименование = НашЛист.Cells(i, 1).Value;

КонецЦикла;

&НаСервере
Функция Конвертация_Excel_в_ТЗ(АдресВХранилище)ИмяФайлаExcel = ПолучитьИмяВременногоФайла(«.xlsx»); // или реквизит с выбором файла .xlsx
   
ФайлИмпортаExcel = ПолучитьИзВременногоХранилища(АдресВХранилище);
   
ФайлИмпортаExcel.Записать(ИмяФайлаExcel);ТабличныйДокумент = Новый ТабличныйДокумент;
    Попытка
       
ТабличныйДокумент.Прочитать(ИмяФайлаExcel, СпособЧтенияЗначенийТабличногоДокумента.Текст);
    Исключение
       
Сообщение = Новый СообщениеПользователю;
       
Сообщение.Текст = ОписаниеОшибки();
       
Сообщение.Сообщить();
    КонецПопытки;
//Автоматически именует столбцы таблицы по первой строке файла. Пробелы заменяются на «»
   
ПЗ = Новый ПостроительЗапроса;
   
ПЗ.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТабличныйДокумент.Область());
   
ПЗ.ДобавлениеПредставлений = ТипДобавленияПредставлений.НеДобавлять;
   
ПЗ.ЗаполнитьНастройки();
   
ПЗ.Выполнить();ТаблицаСДанными = ПЗ.Результат.Выгрузить();

    Возврат

ТаблицаСДанными;

КонецФункции

Код для 7 версии, при использовании в 8-ой — заменить E=СоздатьОбъект(«Excel.Application»);

на

E=Новый COMОбъект(«Excel.Application»);

Код 1C v 7.x

 Функция глОткрытьФайл(Маска="") Экспорт 
      
Перем ИмяФайла,ИмяКаталога;
Маска_="Файлы "+Маска+"|*."+Маска;
Если СокрЛП(Маска)="" Тогда
Маска_="Все файлы |*.*"
КонецЕсли;
Если ФС.ВыбратьФайл(0,ИмяФайла,ИмяКаталога,"Открыть файл",Маска_)=1 Тогда
Возврат ИмяКаталога+ИмяФайла; //полное имя открытого файла
Иначе
Возврат "";
КонецЕсли;
КонецФункции

Функция ReadExcel(ИмяФайла,Лист=1) Экспорт
Попытка
E=СоздатьОбъект("Excel.Application");
Исключение
Предупреждение("Excel на компьютере не установлен!");
Возврат ПолучитьПустоеЗначение();
КонецПопытки;
E.Workbooks.Open(Сокрлп(ИмяФайла));
Строк=E.Sheets(Лист).Cells.SpecialCells(11).Row; // строка последней ячейки
Столбцов=E.Sheets(Лист).Cells.SpecialCells(11).Column; // столбец последней ячейки
фТЗ=СоздатьОбъект("ТаблицаЗначений");
Для А=1 По Столбцов Цикл
фТЗ.НоваяКолонка();
КонецЦикла;
Для Стр=1 По Строк Цикл
Состояние("Обработано "+Строка(Стр)+" строк из "+Строка(Строк));
фТЗ.НоваяСтрока(Стр);
Для Столб=1 По Столбцов Цикл
фТЗ.УстановитьЗначение(Стр,Столб,СокрЛП(E.Sheets(Лист).Cells(Стр,Столб).Value));
КонецЦикла;
КонецЦикла;
E.Workbooks.Close();
Возврат фТЗ;
КонецФункции

Процедура Сформировать()
ИмяФайла=глОткрытьФайл("xls");
Если СокрЛП(ИмяФайла)="" Тогда Возврат; КонецЕсли;
ТЗ.Загрузить(ReadExcel(ИмяФайла,1)); // ТЗ - таблица значений на форме
// ну а дальше смотрим визуально, что с ней дальше делать
КонецПроцедуры

Подсказал Abadonna.

Информация взята с сайта http://helpf.pro

Подпишитесь на нашу рассылку новостей

Хотите узнать больше по этому вопросу?

Подпишитесь на нашу рассылку новостей

Подписаться

Чтобы задать вопрос или предложить тему статьи, нажмите на кнопку ниже:

Предложить статью

Содержание

  • Перенос данных из Эксель в 1С
    • Подготовка данных
    • Подключение внешнего загрузчика
    • Загрузка данных
  • Вопросы и ответы

Загрузка из Microsoft Excel в 1С

Уже давно самой популярной программой среди бухгалтеров, планировщиков, экономистов и управленцев стало приложение 1C. Оно имеет не только разнообразное количество конфигураций для различных видов деятельности, но и локализации под стандарты учета в нескольких странах мира. Все больше предприятий переходят на ведение учета именно в этой программе. Но процедура переноса данных вручную из других программ учета в 1C — довольно долгое и скучное занятие, отнимающее массу времени. Если на предприятии велся учет с помощью Excel, то процесс переноса можно существенно автоматизировать и ускорить.

Производить перенос данных из Excel в 1С требуется не только на начальном периоде работы с данной программой. Иногда наступает необходимость подобного, когда по ходу деятельности нужно занести какие-то списки, хранящиеся в книге табличного процессора. Например, если требуется перенести прайс-листы или заказы из онлайн-магазина. В случае, когда списки небольшие, то их можно вбить и вручную, но что делать, если они содержат сотни наименований? Для того, чтобы ускорить процедуру, можно прибегнуть к некоторым дополнительным возможностям.

Для автоматической загрузки подойдут практически все типы документов:

  • Список номенклатуры;
  • Список контрагентов;
  • Список прайсов;
  • Перечень заказов;
  • Информация о покупках или продажах и т.д.

Сразу нужно отметить, что в 1С нет встроенных инструментов, которые позволяли бы переносить данные из Эксель. Для этих целей нужно подключить внешний загрузчик, который представляет собой файл в формате epf.

Подготовка данных

Нам нужно будет подготовить данные в самой таблице Excel.

  1. Любой список, загружаемый в 1С, должен быть однородно структурирован. Нельзя выполнять загрузку при наличии в одном столбце или ячейке данных нескольких типов, например, имя человека и его телефонный номер. В этом случае, такие двойные записи обязательно следует разделять в разные столбцы.
  2. Неправильная двоная запись в Microsoft Excel

  3. Не допускается наличия объединенных ячеек даже в заголовках. Это может привести к некорректным результатам при переносе данных. Поэтому, если объединенные ячейки имеются, их нужно разделить.
  4. Объединенная ячейка в Microsoft Excel

  5. Если исходную таблицу сделать максимально простой и понятной, без применения относительно сложных технологий (макросы, формулы, комментарии, сноски, лишние элементы форматирования и т.д.), то это поможет максимально предотвратить проблемы на дальнейших шагах переноса.
  6. Элементы форматирования и комментарии в Microsoft Excel

  7. Обязательно следует привести наименование всех величин к единому формату. Не допускается наличие обозначения, например, килограмм, отображаемого разными записями: «кг», «килограмм», «кг.». Программа будет их понимать как разные величины, поэтому нужно выбрать один вариант записи, а остальные исправить под этот шаблон.
  8. Неправильное оформелние единиц измерения в Microsoft Excel

  9. Обязательно наличие уникальных идентификаторов. В их роли может выступать содержимое любого столбца, которое не повторяется в других строках: индивидуальный налоговый номер, артикул и т.д. Если в существующей таблице нет столбца с подобным значением, то можно добавить дополнительную колонку и произвести там простую нумерацию. Это нужно для того, чтобы программа смогла идентифицировать данные в каждой строке отдельно, а не «сливала» их вместе.
  10. Уникальный идентификатор в Microsoft Excel

  11. Большинство обработчиков файлов Эксель не работает с форматом xlsx, а только с форматом xls. Поэтому, если наш документ имеет расширение xlsx, то нужно его конвертировать. Для этого переходим во вкладку «Файл» и жмем на кнопку «Сохранить как».
    Переход к сохранению файла в Microsoft Excel

    Открывается окно сохранения. В поле «Тип файла» по умолчанию будет указан формат xlsx. Меняем его на «Книга Excel 97-2003» и жмем на кнопку «Сохранить».

    Сохранение файла в Microsoft Excel

    После этого документ будет сохранен в нужном формате.

Кроме этих универсальных действий по подготовке данных в книге Эксель, нужно будет ещё привести документ в соответствие с требованиями конкретного загрузчика, который мы будем использовать, но об этом мы поговорим чуть ниже.

Lumpics.ru

Подключение внешнего загрузчика

Подключить внешний загрузчик с расширением epf к приложению 1С можно, как до подготовки файла Эксель, так и после. Главное, чтобы к началу процесса выполнения загрузки оба этих подготовительных момента были решены.

Существует несколько внешних загрузчиков таблиц Эксель для 1С, которые созданы различными разработчиками. Рассматривать мы будем пример с использованием инструмента для обработки информации «Загрузка данных из табличного документа» для версии 1С 8.3.

  1. После того, как файл в формате epf скачан и сохранен на жестком диске компьютера, запускаем программу 1С. Если файл epf упакован в архив, то его предварительно нужно извлечь оттуда. На верхней горизонтальной панели приложения жмем на кнопку, запускающую меню. В версии 1С 8.3 она представлена в виде вписанного в оранжевую окружность треугольника, перевернутого углом вниз. В появившемся списке последовательно переходим по пунктам «Файл» и «Открыть».
  2. Открытие файла обработки в 1С

  3. Запускается окно открытия файла. Переходим в директорию его расположения, выделяем тот объект и жмем на кнопку «Открыть».
  4. Открытие загрузчика в 1С

  5. После этого загрузчик запустится в 1С.

Загрузчик запустился в Microsoft Excel

Скачать обработку «Загрузка данных из табличного документа»

Загрузка данных

Одной из основных баз данных, с которыми работает 1C, является список номенклатуры товаров и услуг. Поэтому для описания процедуры загрузки из Excel остановимся на примере переноса именно этого типа данных.

  1. Возвращаемся к окну обработки. Так как мы будем загружать номенклатуру товаров, то в параметре «Загрузка в» переключатель должен стоять в позиции «Справочник». Впрочем, он так установлен по умолчанию. Переключать его следует только тогда, когда вы собрались переносить другой тип данных: табличную часть или регистр сведений. Далее в поле «Вид справочника» кликаем по кнопке, на которой изображено многоточие. Открывается выпадающий список. В нем нам следует выбрать пункт «Номенклатура».
  2. Установка типа данных в 1С

  3. После этого обработчик автоматически расставляет те поля, которые программа использует в этом виде справочника. Нужно сразу отметить, что совсем не обязательно заполнять все поля.
  4. Поля для справочника в 1С

  5. Теперь опять открываем переносимый документ Excel. Если наименование его колонок отличается от наименования полей справочника 1С, которые содержат соответствующие, то нужно переименовать эти столбцы в Экселе так, чтобы названия полностью совпадали. Если в таблице имеются столбцы, для которых в справочнике нет аналогов, то их следует удалить. В нашем случае такими столбцами являются «Количество» и «Цена». Также следует добавить, что порядок расстановки столбцов в документе должен строго совпадать с тем, который представлен в обработке. Если для некоторых столбцов, которые отображены в загрузчике, у вас нет данных, то эти колонки можно оставлять пустыми, но нумерация тех столбцов, где имеются данные, должна совпадать. Для удобства и быстроты редактирования можно применять специальную возможность Эксель для быстрого перемещения колонок местами.

    После того, как данные действия произведены, жмем на значок «Сохранить», который представлен в виде пиктограммы, изображающей дискету в верхнем левом углу окна. Затем закрываем файл, нажав на стандартную кнопку закрытия.

  6. Переименование шапки в Microsoft Excel

  7. Возвращаемся в окно обработки 1С. Жмем на кнопку «Открыть», которая изображена в виде папки желтого цвета.
  8. Переход к открытию файла в 1С

  9. Запускается окно открытия файла. Переходим в директорию, где расположен документ Эксель, который нам нужен. Переключатель отображения файлов по умолчанию установлен для расширения mxl. Для того чтобы показать нужный нам файл, его требуется переставить в позицию «Лист Excel». После этого выделяем переносимый документ и жмем на кнопку «Открыть».
  10. Открытие документа в 1С

  11. После этого содержимое открывается в обработчике. Чтобы проверить корректность заполнения данными, жмем на кнопку «Контроль заполнения».
  12. Контроль заполнения в 1С

  13. Как видим, инструмент контроля заполнения сообщает нам, что ошибки не найдены.
  14. Ошибок при переносе не выявлено в 1С

  15. Теперь перемещаемся во вкладку «Настройка». В «Поле поиска» ставим галочку в той строке, которая у всех наименований, заносимых в справочник номенклатуры, будет уникальная. Чаще всего для этого используют поля «Артикул» или «Наименование». Это нужно делать для того, чтобы при добавлении новых позиций в список, данные не задваивались.
  16. Установка уникального поля в 1С

  17. После того, как все данные внесены и настройки выполнены, можно переходить к непосредственной загрузке информации в справочник. Для этого кликаем по надписи «Загрузить данные».
  18. Переход к загрузки данных в справочник в 1С

  19. Выполняется процесс загрузки. После её завершения можно перейти в справочник номенклатуры и убедиться, что все нужные данные туда добавлены.

Наименования добавлены в справочник в 1С

Урок: Как поменять столбцы местами в Excel

Мы проследили процедуру добавления данных в справочник номенклатуры в программе 1C 8.3. Для других справочников и документов загрузка будет проводиться по тому же принципу, но с некоторыми нюансами, с которыми пользователь сможет разобраться самостоятельно. Также нужно заметить, что у различных сторонних загрузчиков процедура может отличаться, но общий подход остается у всех одинаковый: сначала обработчик загружает из файла информацию в окно, где производится её редактирование, а уже потом она добавляется непосредственно в базу данных 1С.

Еще статьи по данной теме:

Помогла ли Вам статья?

Содержание:

1.    Диалог выбора файла

2.    Чтение файла для 1С

3.    Загрузка в таблицу 1С

4.    Создание документов после переноса из Excel в документ 1С

Многие сталкиваются с необходимостью перенести большое количество данных из MS Excel в 1С. Для быстрого выполнения этой задачи можно создать внешнюю обработку для переноса данных, которая будет считывать наш файл и заполнять документ необходимыми данными.

Для чтения табличных документов Excel в 1С существует несколько способов. Но не все они универсальны. В данном случае мы будем разбирать способ – через создание COM-объекта. Этот способ требует обязательного наличия MS Excel на компьютере (сервере), на котором находится база данных.

В данной статье мы разберем создание команды, по которой из Excel файла будет происходить выгрузка данных в табличную часть документа 1С.

Создадим в конфигураторе Новую обработку для переноса данных, которая будет считывать данные из документа Excel и создавать на основе этих данных документы, в которых будет автоматически заполняться табличная часть. 

1.    Диалог выбора файла

Первым делом необходимо создать диалог выбора файла. Создадим реквизит формы «ПутьКФайлу» и вынесем его на форму в виде поля ввода:

Далее прописываем событие «НачалоВыбора» для нашего поля и пишем процедуру для этого события. Также можно установить фильтр, для того чтобы было видно только нужные типы файлов.  

2.    Чтение файла для 1С

После того как мы создали поле для указания файла, добавим команду формы «ЗагрузитьИзExcel», и вынесем ее на форму.

После чего привязываем к ней процедуру, которая будет загружать данные из документа Excel и помещать их в таблицу формы, для того чтобы можно было проверить, что загрузилось.

Данная процедура вызывает последовательное выполнение отдельных процедур и функций, о которых речь пойдет чуть ниже.

Функция «ПрочитатьФайлЭксель» возвращает массив с данными из указанного нами файла.

Подключаемся к Excel через COM-объект и проводим все технические настройки: определяем количество листов, определяем версию, так как для разных версий получается разное количество колонок и строк.   

Далее считываем данные и заполняем ими массив.

После создания функции, которая считывает данные, напишем процедуру, которая будет помещать их в таблицу формы.  

3.    Загрузка в таблицу 1С

Получим таблицу формы и объявим некоторые переменные, которые будем использовать далее.

Получаем номера колонок, данные которых нам необходимы.

С помощью простенькой функции, возвращающей данные нужной колонки для текущей строки, получаем необходимые значения и добавляем их в таблицу.

После загрузки в таблицу 1С можно подтянуть некоторые данные из справочников. В данном случае с помощью метода «НайтиПоРеквизиту()» искались наименования номенклатуры по ее артикулу и так же выгружались в таблицу формы.

При написании обработки для переноса данных нельзя забывать и о возможных ошибках, которые могут возникнуть в процессе работы. В данном случае предусмотрим, что не всегда артикулы, указанные в табличном документе, могут быть добавлены в справочник. И в случае если в справочнике нет данного артикула, будем выводить сообщение об этом. 

4.    Создание документов после переноса из Excel в документ 1С

Следующим этапом будет создание Документов на основании полученной таблицы.

Создадим команду, по которой будут создаваться документы и пропишем событие. Для того чтобы создать для каждого магазина новый документ, выгрузим таблицу формы в ТаблицуЗначений и свернем по колонке «магазин», чтобы получить массив различных магазинов.

После чего обойдем этот массив в цикле, создавая и заполняя Новый документ для каждого магазина. Обязательно следует запретить создавать документы при незаполненных значениях номенклатуры (выводить сообщения о том, что она не заполнена).

Данную обработку для переноса данных можно сделать как внешней, так и встроенной. Все зависит от потребностей. Существенных отличий между этими вариантами не будет за исключением того, что для внешней обработки в модуль объекта нужно будет прописать параметры регистрации и подключить ее. Для встроенной же нужно будет обновлять конфигурацию, что в некоторых случаях проблематично, если БД очень большая.

Специалист компании ООО «Кодерлайн»

Фархутдинов Айдар Сайярович

Like this post? Please share to your friends:
  • 2 cursors in word
  • 2 columns in one cell excel
  • 2 column chart in word
  • 2 and 3 word scrabble words
  • 2 and 3 letter word dictionary