Загрузка из EXCEL в 1С на платформе 8.3.6/8.3.7 (с картинками)

Опубликовал StepByStep в раздел Программирование - Практика программирования

Импорт содержимого из файлов в форматах XLS (Microsoft Excel 97), Microsoft Office OpenXML (Microsoft Excel 2007- 2010) и ODS (OpenDocument) в таблицу значений.

При написании публикации использовалась версия платформы 1С:Предприятие 8.3.6.1760.

Заметки из Зазеркалья: http://v8.1c.ru/o7/


Одним из полезных нововведений на платформе 1С 8.3.6 стала возможность возможность импорта содержимого из файлов в форматах XLS (Microsoft Excel 97), Microsoft Office OpenXML (Microsoft Excel 2007- 2010) и ODS (OpenDocument) в табличный документ.
Данная возможность доступна как в интерактивном режиме, так и из встроенного языка.
Реализована поддержка вставки из буфера обмена областей, скопированных из Microsoft Excel и OpenOffice Calc.
Реализация импорта из EXCEL на встроенном языке стала возможна в результате нововведений в функционал объекта "ТабличныйДокумент":
Для метода "Прочитать" объекта "ТабличныйДокумент" реализован параметр "СпособЧтенияЗначений" (Новое системное перечисление "СпособЧтенияЗначенийТабличногоДокумента").

В данной публикации приводится пример реализации функционала импорта из файлов EXCEL (xlsx, xls, ods) в таблицу значений в режиме 1С:Предприятие на платформе 8.3.6.


Методы загрузки из внешнего источника:
- Метод "MS ADO" (Чтение файлов xls, xlsx, xlsb средствами Microsoft ADO): http://infostart.ru/public/163640/
- Метод "MS EXCEL" (Чтение файлов xls, xlsx, xlsb с картинками средствами Microsoft Office): http://infostart.ru/public/163641/
- Метод "LO CALC" (Чтение файлов xls, xlsx, xlsb, ods, sxc с картинками средствами LibreOffice): http://infostart.ru/public/163642/
- Метод "NativeXLSX" (Чтение файлов xlsx с картинками средствами 1С. ПостроительDOM): http://infostart.ru/public/300092/
- Метод "NativeXLSX". Предыдущий вариант (Чтение файлов xlsx средствами 1С. ЧтениеXML):
http://infostart.ru/public/225624/
- Метод "Excel1C" (Загрузка на платформе 8.3.6 с картинками. Чтение файлов xls, xlsx, ods): http://infostart.ru/public/341855/
- Список листов файла: http://infostart.ru/public/163724/


Данный функционал включен в обработку:
Импорт из EXCEL и др.источников (xls,xlsx,ods,sxc,dbf,mxl,csv,sql) в 1С: http://infostart.ru/public/120961/


О файле EXCEL:
В общем случае файл EXCEL содержит несколько листов с данными.
Метод табличного документа "Прочитать" читает все листы в 1 (один) табличный документ.
Это может быть несовсем корректно/удобно (например, на разных листах расположены разные по своей структуре данные).
Поэтому для использования данного функционала необходимо использовать файлы EXCEL, содержащие 1 (один) лист с данными.
О листе файла EXCEL:
Содержимое на листе должно быть разнесено по соответствующим колонкам по назначению.
В качестве примера содержимого листа может служить обычный прайс.
Рекомендутся ячейки таблицы на листе файла оформлять рамкой  "Все границы".
Колонки результирующей таблицы значений формируются по количеству, определяемому свойством "ШиринаТаблицы" табличного документа.
В последствии для удобства пустые колонки удаляются из результирующей таблицы значений.
О типах значений файла EXCEL:
Числа - как "число", даты - как "дата", Стоки - как "строка", Булево - как "строка" вида "ИСТИНА" ("TRUE") или "ЛОЖЬ" ("FALSE").
В результирующую таблицу значений записываются типизованные значения.
О картинках файла EXCEL:
В исходном файле EXCEL это могут быть как ссылки на файлы, разделенные между собой символом "Перевод строки" в пределах одной ячейки, так и собственно картинки.
Картинки должны находиться в пределах ячейки. В одной ячейке может быть несколько картинок.
В результирующую таблицу значений записываются ссылки на файлы картинок.
Каждая ячейка колонки может, в общем случае, содержать несколько ссылок на файлы, разделенные между собой символом "Перевод строки".

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	ИмяФайла = "D:\Товар1Лист.xlsx";
	
	// Чтение в реквизит обработки, который может быть выведен на форму обработки.
	// Объект.ТабличныйДокумент.Прочитать(ИмяФайла, СпособЧтенияЗначенийТабличногоДокумента.Значение);
	
	// Запись табличного документа в файл на диске.
	// Для работы с табличным документом предусмотрена утилита 1С http://v8.1c.ru/metod/fileworkshop.htm
	// Объект.ТабличныйДокумент.Записать("D:\Товар1Лист.MXL", ТипФайлаТабличногоДокумента.MXL); 
	
	// Примеры вызова:
	ТЗ = ЗагрузитьМетодом_1C836(ИмяФайла);			  // Считать весь файл.
	ТЗ = ЗагрузитьМетодом_1C836(ИмяФайла, 1, 3, 5);     // Считать с 3-ю по 5-ю строку.
	
КонецПроцедуры

// Метод "1C836" для файлов EXCEL с расширениями: xlsx, xls, ods.
//
// Параметры:
// 		ФайлEXCEL - Полное имя файла (путь к файлу с именем файла и расширением).
//		СтрокаЗаголовка (по умолчанию = 1) - Номер строки файла типа MXL, в которой расположены заголовки колонок.
//			Не используется. 
//      В обработке 1-я строка анализируется для сопоставления колонок файла с реквизитами объектов 1С.
//		НачСтрока (по-умолчанию = 0) - Номер начальной строки, начиная с которой считываются данные из файла.
//		КонСтрока (по-умолчанию = 0) - Номер конечной строки, которой заканчиваются считываемые данные из файла.
//			Если НачСтрока=0 и КонСтрока=0, то считывается вся таблица, находящаяся в файле.
//		КолвоСтрокФайла - Количество строк в файле. Возвращается в вызвавшую процедуру.
//
// Возвращаемые значения:
// 		ТаблицаРезультат - Результат считывания данных из файла.
//
&НаСервере
Функция ЗагрузитьМетодом_1C836(Знач ФайлEXCEL, Знач СтрокаЗаголовка = 1, НачСтрока = 0, КонСтрока = 0, КолвоСтрокФайла = 0)
	Перем ТабличныйДокумент, КонечнаяКолонка, ИмяКолонки, Область, ТекущаяОбласть, нСтрока, нКолонка, НоваяСтрокаТФ, ЗначениеЯчейки;
	Перем ТаблицаРезультат;
	
	ТабличныйДокумент = Новый ТабличныйДокумент;
	Попытка
		ТабличныйДокумент.Прочитать(ФайлEXCEL, СпособЧтенияЗначенийТабличногоДокумента.Значение);	// СпособЧтенияЗначенийТабличногоДокумента - новый параметр платформы 8.3.6. Второе значение "Текст".
	Исключение
		Сообщить(ОписаниеОшибки(), СтатусСообщения.Внимание);
		Возврат Новый ТаблицаЗначений;
	КонецПопытки;
	
	КолвоСтрокФайла = ТабличныйДокумент.ВысотаТаблицы;
	КонечнаяКолонка = ТабличныйДокумент.ПолучитьОбласть().ШиринаТаблицы;
	
	// Проверка заполненности листа.
	Если КолвоСтрокФайла = 0 Тогда
		// Завершение работы.
		// Закрытие Объектов.
		ТабличныйДокумент = Неопределено;
		Возврат Новый ТаблицаЗначений;	// В случае ошибки возвращаем пустую таблицу значений.
	КонецЕсли;
	
	// Создание результирующей таблицы, в которую будут записываться считанные из файла данные.
	ТаблицаРезультат = Новый ТаблицаЗначений;
	
	// Формирование колонок результирующей таблицы.
	
	// "НомерСтроки" - для наглядности и удобства.
	// В зависимости от разрабатываемой обработки.
	// "Сопоставлено" - может быть другим.
	// Здесь же могут быть добавлены другие колонки, не формируемые из содержимого файла.
	ТаблицаРезультат.Колонки.Добавить("НомерСтроки", Новый ОписаниеТипов("Число"), "№", 4);
	ТаблицаРезультат.Колонки.Добавить("Сопоставлено", Новый ОписаниеТипов("Булево"), "Сопоставлено", 1);
	
	Для ит = 1 ПО КонечнаяКолонка Цикл
		нКолонка = СтрЗаменить(ит, Символы.НПП, "");
		ИмяКолонки = "N" + нКолонка;
		ТаблицаРезультат.Колонки.Добавить(ИмяКолонки);
	КонецЦикла;
	
	// 1-я строка. Заголовки.
	НоваяСтрокаТФ = ТаблицаРезультат.Добавить();
	НоваяСтрокаТФ.НомерСтроки = 1;
	Для ит=1 ПО КонечнаяКолонка Цикл
		нКолонка = СтрЗаменить(ит, Символы.НПП, "");
		ИмяКолонки = "N" + нКолонка;
		НоваяСтрокаТФ[ИмяКолонки] = ТабличныйДокумент.ПолучитьОбласть("R1" + "C"+нКолонка).ТекущаяОбласть.Текст;
		
		// Используется при формировании таблицы на форме обработки.
		ШиринаКолонки = ТаблицаРезультат.Колонки[ИмяКолонки].Ширина;
		ДлинаСтроки	= СтрДлина(СокрЛП(НоваяСтрокаТФ[ИмяКолонки]));
		ТаблицаРезультат.Колонки[ИмяКолонки].Ширина = ?(ШиринаКолонки < ДлинаСтроки, ДлинаСтроки, ШиринаКолонки);
	КонецЦикла;
	
	НачСтрока = ?(НачСтрока = 0, 2, НачСтрока);
	КонСтрока = ?(КонСтрока = 0, КолвоСтрокФайла, КонСтрока);
	
	Для нСтрока = НачСтрока ПО КонСтрока Цикл
		НоваяСтрокаТФ = ТаблицаРезультат.Добавить();
		НоваяСтрокаТФ[0] = нСтрока;
		Для ит=1 ПО КонечнаяКолонка Цикл
			нКолонка = СтрЗаменить(ит, Символы.НПП, "");
			Область = ТабличныйДокумент.ПолучитьОбласть("R"+СтрЗаменить(нСтрока, Символы.НПП, "") + "C"+нКолонка);
			ТекущаяОбласть = Область.ТекущаяОбласть;
			Попытка
				ЗначениеЯчейки = ТекущаяОбласть.Значение;		// Число, Дата.
			Исключение
				ЗначениеЯчейки = СокрЛП(ТекущаяОбласть.Текст);	// Строка, Булево. (Булево как строка "ИСТИНА"/"ЛОЖЬ")
				Если ЗначениеЗаполнено(ЗначениеЯчейки) Тогда
					ЗначениеЯчейки = ПреобразоватьПростоеЗначениеИзСтрокиВТипизованноеЗначение1С(ЗначениеЯчейки);
					Если ТипЗнч(ЗначениеЯчейки) = Тип("Строка") Тогда
						ЗначениеЯчейки = СокрЛП(ЗначениеЯчейки);
					КонецЕсли;
				Иначе
					ЗначениеЯчейки = Неопределено;
					Если Область.Рисунки.Количество() > 0 Тогда	// Изображение.
						ЗначениеЯчейки = ПолучитьЗначениеЯчейкиОбластиТабличногоДокументаСКартинками(Область, нСтрока, нКолонка, "УИД");
					КонецЕсли;
				КонецЕсли;
			КонецПопытки;
			
			ИмяКолонки = "N" + нКолонка;
			НоваяСтрокаТФ[ИмяКолонки] = ЗначениеЯчейки;
			
			// Используется при формировании таблицы на форме обработки.
			ШиринаКолонки = ТаблицаРезультат.Колонки[ИмяКолонки].Ширина;
			ДлинаСтроки	= СтрДлина(СокрЛП(НоваяСтрокаТФ[ИмяКолонки]));
			ТаблицаРезультат.Колонки[ИмяКолонки].Ширина = ?(ШиринаКолонки < ДлинаСтроки, ДлинаСтроки, ШиринаКолонки);
		КонецЦикла;
	КонецЦикла;
	
	// Юзабилити. Удалить пустые колонки.
	УдалитьКолонкиСНулевойШириной(ТаблицаРезультат);
	
	Возврат ТаблицаРезультат;
	
КонецФункции

&НаСервере
Процедура УдалитьКолонкиСНулевойШириной(ТаблицаРезультат)
	Перем МассивПустыхКолонок;
	
	// Найдем пустые колонки.
	МассивПустыхКолонок = Новый Массив;
	Для Каждого Колонка ИЗ ТаблицаРезультат.Колонки Цикл
		Если Колонка.Ширина = 0 Тогда
			МассивПустыхКолонок.Добавить(Колонка.Имя);
		КонецЕсли;
	КонецЦикла;
	
	// Удалим пустые колонки.
	Для Каждого ПустаяКолонка ИЗ МассивПустыхКолонок Цикл
		ТаблицаРезультат.Колонки.Удалить(ПустаяКолонка);
	КонецЦикла;

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

// ПРЕОБРАЗОВАНИЕ СТРОКИ К ТИПИЗОВАННОМУ ЗНАЧЕНИЮ 1С.

&НаСервере
Функция ПреобразоватьПростоеЗначениеИзСтрокиВТипизованноеЗначение1С(Знач ИсходноеЗначение)
	
	Если НЕ ИсходноеЗначение = "" Тогда
		Если ТолькоЦифрыИЗапятаяВСтроке(ИсходноеЗначение, Истина, Ложь) Тогда
			Попытка
				Возврат Число(ИсходноеЗначение);
			Исключение
				Возврат ИсходноеЗначение
			КонецПопытки;
		Иначе
			Если ВРег(ИсходноеЗначение) = "ИСТИНА" ИЛИ ВРег(ИсходноеЗначение) = ("ИСТИНА"+Символы.ПС) ИЛИ ВРег(ИсходноеЗначение) = "TRUE" ИЛИ ВРег(ИсходноеЗначение) = ("TRUE"+Символы.ПС) Тогда
				Возврат Истина;
			ИначеЕсли ВРег(ИсходноеЗначение) = "ЛОЖЬ" ИЛИ  ВРег(ИсходноеЗначение) = ("ЛОЖЬ"+Символы.ПС) ИЛИ ВРег(ИсходноеЗначение) = "FALSE" ИЛИ ВРег(ИсходноеЗначение) = ("FALSE"+Символы.ПС) Тогда
				Возврат Ложь;
			Иначе
				Возврат ПреобразоватьИзСтрокиВДату(ИсходноеЗначение);
			КонецЕсли;
		КонецЕсли;
	КонецЕсли;
	
	Возврат ИсходноеЗначение
	
КонецФункции

// Проверяет, содержит ли строка только цифры и запятую.
//
// Параметры:
//  СтрокаПроверки          - Строка - Строка для проверки
//  УчитыватьЛидирующиеНули - Булево - Флаг учета лидирующих нулей, если Истина, то ведущие нули пропускаются
//  УчитыватьПробелы        - Булево - Флаг учета пробелов, если Истина, то пробелы при проверке игнорируются
//
// Возвращаемое значение:
//   Булево - Истина - строка содержит только цифры или пустая, Ложь - строка содержит иные символы.
//
&НаСервере
Функция ТолькоЦифрыИЗапятаяВСтроке(Знач СтрокаПроверки, Знач УчитыватьЛидирующиеНули = Истина, Знач УчитыватьПробелы = Истина)
	
	Если ТипЗнч(СтрокаПроверки) <> Тип("Строка") Тогда
		Возврат Ложь;
	КонецЕсли;
	
	Если НЕ УчитыватьПробелы Тогда
		СтрокаПроверки = СтрЗаменить(СтрокаПроверки, " ", "");
	КонецЕсли;

     Если Сред(СтрокаПроверки, 1, 1) = "-" Тогда
        СтрокаПроверки = Сред(СтрокаПроверки, 2, СтрДлина(СтрокаПроверки));
     КонецЕсли;

     Если ПустаяСтрока(СтрокаПроверки) Тогда
	   Возврат Истина;
	КонецЕсли;
	
	Если НЕ УчитыватьЛидирующиеНули Тогда
		Позиция = 1;
		// Взятие символа за границей строки возвращает пустую строку
		Пока Сред(СтрокаПроверки, Позиция, 1) = "0" Цикл
			Позиция = Позиция + 1;
		КонецЦикла;
		СтрокаПроверки = Сред(СтрокаПроверки, Позиция);
	КонецЕсли;
	
	// Если содержит только цифры, то в результате замен должна быть получена пустая строка
	// Проверять при помощи ПустаяСтрока нельзя, так как в исходной строке могут быть пробельные символы
	Возврат СтрДлина(
		СтрЗаменить( СтрЗаменить( СтрЗаменить( СтрЗаменить( СтрЗаменить(
		СтрЗаменить( СтрЗаменить( СтрЗаменить( СтрЗаменить( СтрЗаменить( СтрЗаменить( 
			СтрокаПроверки, "0", ""), "1", ""), "2", ""), "3", ""), "4", ""), "5", ""), "6", ""), "7", ""), "8", ""), "9", ""), ",", "")
	) = 0;
	
КонецФункции

// Преобразование строки вида "01.01.13" или "01.01.2013" к значению типа "дата".
// Возможны друние форматы даты в файле EXCEL.
&НаСервере
Функция ПреобразоватьИзСтрокиВДату(Знач СтрокаДаты)
	Перем ScrptCtrl, OutDate;
	
	Попытка
		ScrptCtrl = Новый COMОбъект("MSScriptControl.ScriptControl");
		ScrptCtrl.Language="vbscript";
		OutDate = ScrptCtrl.Eval("CDate(""" + СтрокаДаты + """)");
		Возврат OutDate;
	Исключение
		//Сообщить(ОписаниеОшибки());
	КонецПопытки;
	
	Возврат СтрокаДаты;

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

// ПОЛУЧЕНИЕ ЗНАЧЕНИЯ ДЛЯ РЕКВИЗИТА ТИПА "ФАЙЛ КАРТИНКИ".

&НаСервере
Функция ПолучитьЗначениеЯчейкиОбластиТабличногоДокументаСКартинками(Знач Область, Знач нСтрока, Знач нКолонка, Знач ПравилоИмяФайлаКартинки = "УИД")
	Перем Рисунок, ит, ИмяФайлаРисунка;
	Перем ЗначениеЯчейки;
	
	ит = 0;
	ЗначениеЯчейки = "";
	Для Каждого Рисунок ИЗ Область.Рисунки Цикл
		ит = ит + 1;
		Если ПравилоИмяФайлаКартинки = "УИД" Тогда
			ИмяФайлаРисунка = КаталогВременныхФайлов() + Новый УникальныйИдентификатор() + ".jpg";
		Иначе
			ИмяФайлаРисунка = КаталогВременныхФайлов() + "С" + нСтрока + "К" + нКолонка + ".jpg";
		КонецЕсли;
		Попытка
			Рисунок.Картинка.Записать(ИмяФайлаРисунка);
			ЗначениеЯчейки = ЗначениеЯчейки + ИмяФайлаРисунка + ?(ит < Область.Рисунки.Количество(), Символы.ПС, "");
		Исключение
			// Поле картинки недоступно для чтения.
		КонецПопытки;
	КонецЦикла;
	
	Возврат ЗначениеЯчейки;
	
КонецФункции

См. также

Лучшие комментарии

1. StepByStep 04.04.2015 18:24
УДАЧНОГО ПРИМЕНЕНИЯ ...
# Ответить
16. mamanelli 13.07.2015 14:41
ТабличныйДокумент.Прочитать(ФайлEXCEL, СпособЧтенияЗначенийТабличногоДокумента.Значение);

А почему никто не пишет, что при использовании директивы"&НаСервере" в клиент-серверном варианте файл должен располагаться либо по сетевому пути, либо на сервере, где установлен "Агент сервера 1С:Предприятия 8.3 (x86-64)"?
Ответили: (21) (25)
+ 3 [ dedicated; veiuper; RomaM; ]
# Ответить
30. Lazerka 19.11.2015 13:49
Подскажите, а как загружать в 1с 8.3 из екселя формата xlsb это двоичные данные.
Ответили: (31) (32)
+ 1 [ nofx; ]
# Ответить

Комментарии

1. StepByStep 04.04.2015 18:24
УДАЧНОГО ПРИМЕНЕНИЯ ...
# Ответить
2. kostyaomsk 07.04.2015 05:49
Где-то про схожее уже писали, но чтоб не возиться нужно быстро найти шаблоны кода когда есть экстренная необходимость. Может, про картинки разве что. Попадаются задачи парсинга сайтов с использованием 1С.
Ответили: (3)
# Ответить
3. StepByStep 07.04.2015 09:52
(2) kostyaomsk,
Почерпнул из описании нововведений к платформе 8.3.6.
+ 1 [ tanyabo; ]
# Ответить
4. qwinter 07.04.2015 15:01
Зачем здесь все кроме
ТабличныйДокумент.Прочитать(ФайлEXCEL, СпособЧтенияЗначенийТабличногоДокумента.Значение);
?????

Скоро синтаксис-помощник будут публиковать...
Ответили: (5)
# Ответить
5. StepByStep 07.04.2015 18:07
(4) qwinter,

В данной публикации приводится пример реализации функционала импорта из файлов EXCEL (xlsx, xls, ods) в таблицу значений в режиме 1С:Предприятие на платформе 8.3.6.


Приведенный функционал вполне подходит для примера, о чем и написано выше в тексте публикации..
# Ответить
6. strangers 18.05.2015 18:26
Не считывает картинки из excel
Ответили: (7)
# Ответить
7. StepByStep 19.05.2015 12:52
(6) strangers,
Картинки должны находиться в пределах ячейки. В одной ячейке может быть несколько картинок.
В результирующую таблицу значений записываются ссылки на файлы картинок.
В ячейке, содержащей какртинки не должно быть ничего другого (текст, число и т.д.).
# Ответить
8. mostovaya 29.05.2015 11:32
Чем данный очередной загрузчик из эксель выделяется на фоне многих других?
Ответили: (9)
# Ответить
9. StepByStep 29.05.2015 19:16
(8) mostovaya,
Тем, что построен на возможностях новой платформы 8.3.6.
# Ответить
10. rasswet 05.06.2015 11:31
а заполнять именованные области без использования ком объекта Эксель можно будет?
Ответили: (11)
# Ответить
11. StepByStep 08.06.2015 13:46
(10) rasswet,
Можно, если формировать ТабличныйДокумент, а не ТаблицуЗначений как здесь.
EXCEL не нужен.
# Ответить
12. tesseract 10.06.2015 10:31

КонечнаяКолонка = ТабличныйДокумент.ШиринаТаблицы; // 8.3.6.1760 некорректно определяет количество колонок (например, >=1025 для xlsx, =256 для xls).


Все читается корректно. Просто ТД может содержать строки с разным количеством колонок. Поэтому правильный вариант :

КоличествоКолонок = ТабличныйДокумент.ПолучитьОбласть(1,,1).ШиринаТаблицы;


Так мы получим реальное количество колонок в строке.
Ответили: (13)
# Ответить
13. StepByStep 10.06.2015 20:14
(12) tesseract,
СПАСИБО.
И в качестве развития мысли предлагаю:
КолВоКолонокФайла = ТабличныйДокумент.ПолучитьОбласть().ШиринаТаблицы;

В этом случае получим реальное количество колонок, вне зависимости от заполнения 1-ой строки.
(последние колонки, не имеющие заполненной 1-ой строки также будут учтены.)
# Ответить
14. shydla 18.06.2015 14:14
Из xlsx картинки грузится, из xls - на доступно для чтения(
Ответили: (19)
# Ответить
15. GVasiliy 08.07.2015 14:31
Нашел маленькую ошибку.
Переменная "СтрокаЗаголовка" не используется.
Для цикла считывающего наименования колонок следует исправить на:


НоваяСтрокаТФ[ИмяКолонки] = ТабличныйДокумент.ПолучитьОбласть("R" + Формат(СтрокаЗаголовка,"") + "C"+нКолонка).ТекущаяОбласть.Текст;
Ответили: (20)
# Ответить
16. mamanelli 13.07.2015 14:41
ТабличныйДокумент.Прочитать(ФайлEXCEL, СпособЧтенияЗначенийТабличногоДокумента.Значение);

А почему никто не пишет, что при использовании директивы"&НаСервере" в клиент-серверном варианте файл должен располагаться либо по сетевому пути, либо на сервере, где установлен "Агент сервера 1С:Предприятия 8.3 (x86-64)"?
Ответили: (21) (25)
+ 3 [ dedicated; veiuper; RomaM; ]
# Ответить
17. urbanist 15.07.2015 11:20
Нужно ли для корректной работы этого функционала у "старых" конфигураций изменять режим совместимости?

А то не хочет работать в 8.3.6 (2076)

{Форма.Форма.Форма(26)}: Ошибка при вызове метода контекста (Прочитать)
ТабДок.Прочитать("D:\1.xls");
по причине:
Ошибка при выполнении файловой операции.

С любым параметром "СпособЧтенияЗначенийТабличногоДокумента" то же самое.
Ответили: (18) (22)
# Ответить
18. Samarin 16.07.2015 14:19
(17) urbanist, для использования данной возможности необходима платформа 8.3.6 с отключенным режимом совместимости.
Сейчас подобные вещи можно тестировать и смотреть на тестовых ЗУП 3.0.23 и БП 3.0.41, которые переводят на 8.3.6 со снятием режима совместимости (БСП версия 2.3).
Ответили: (22)
# Ответить
19. StepByStep 16.08.2015 15:32
(14) shydla,
На платформе 8.3.6.2152 читает.
# Ответить
20. StepByStep 16.08.2015 15:33
(15) GVasiliy,
Тоже вариант.
# Ответить
21. StepByStep 16.08.2015 15:34
(16) mamanelli,
Да, так и есть. Это стандартно в клиент-серверном варианте.
# Ответить
22. StepByStep 16.08.2015 15:39
(17) urbanist, (18) Samarin,
Режим совместимости не причем.
Не открыт ли файл в EXCEL?
Еще столкнулся с тем, что какая-то из версий LibreOffice коверкала файлы.
Поэтому рекомендую использовать MS EXCEL.
# Ответить
23. nytlenc 21.08.2015 08:34
В Функции
Функция ЗагрузитьМетодом_1C836(Знач ФайлEXCEL, Знач СтрокаЗаголовка = 1, НачСтрока = 0, КонСтрока = 0, КолвоСтрокФайла = 0)

замени строку:
Область = ТабличныйДокумент.ПолучитьОбласть("R"+нСтрока + "C"+нКолонка);

на:
Область = ТабличныйДокумент.ПолучитьОбласть("R"+Формат(нСтрока,"ЧГ=0") + "C"+Формат(нКолонка, "ЧГ=0"));

В противном случае когда итератор нСтрока или нКолонка достигнет значения 1000 будет подставляться как "1 000" соответственно
"R"+нСтрока + "C"+нКолонка
например будет равен значению "C1 000R1" или "C1R1 000" а такой области не существует. Будет ошибка в общем.
Ответили: (24)
# Ответить
24. StepByStep 01.09.2015 12:55
(23) nytlenc,
СПАСИБО. Правильно.
# Ответить
25. kiv1c 02.09.2015 17:35
(16) mamanelli, то есть, в клиент-серверном варианте нет возможности прочитать файл с локального компьютера пользователя? и как быть?
Ответили: (26)
# Ответить
26. TeMochkiN 04.09.2015 10:21
(25) kiv1c,
ТабличныйДокумент (SpreadsheetDocument)
Прочитать (Read)
Доступность:

Сервер, толстый клиент, внешнее соединение, мобильное приложение(сервер).
Ответили: (27)
# Ответить
27. kiv1c 09.09.2015 10:01
(26) TeMochkiN, да, я разобрался, с клиента на сервер можно передать прочитанные из файла двоичные данные, потом на сервере их записать во временный эксель-файл и читать табличным документом из него.
# Ответить
28. Morales 13.11.2015 18:15
Функция ТолькоЦифрыИЗапятаяВСтроке не отлавливает отрицательные числа
Надо добавить условие:
// Проверка на отрицательное число
Если Сред(СтрокаПроверки, 1, 1) = "-" Тогда
	СтрокаПроверки = Сред(СтрокаПроверки, 2, СтрДлина(СтрокаПроверки));
КонецЕсли; 
...Показать Скрыть
Ответили: (29)
# Ответить
29. StepByStep 15.11.2015 18:36
(28) Morales,
СПАСИБО.
# Ответить
30. Lazerka 19.11.2015 13:49
Подскажите, а как загружать в 1с 8.3 из екселя формата xlsb это двоичные данные.
Ответили: (31) (32)
+ 1 [ nofx; ]
# Ответить
31. nofx 20.11.2015 09:37
(30) Lazerka, Также интересен этот вопрос.
Ответили: (32)
# Ответить
32. StepByStep 20.11.2015 10:38
(30) Lazerka, (31) nofx,
СПАСИБО.
Загрузка из XLSXB возможна черз ADODB.
Строка соединения = "Driver={Microsoft EXCEL Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};Dbq=" + ФайлEXCEL + ";ReadOnly=1;"
# Ответить
33. nofx 04.12.2015 01:48
Да.Я воль!
# Ответить
34. ram8291 17.01.2016 15:35
Считываются все Листы Excel. Не понятно как считать только один Лист?
Наконец 1С родила долгожданный функционал!
Ответили: (35)
# Ответить
35. StepByStep 24.04.2016 19:09
(34) ram8291,
Из текста публикации:
О файле EXCEL:
В общем случае файл EXCEL содержит несколько листов с данными.
Метод табличного документа "Прочитать" читает все листы в 1 (один) табличный документ.
Поэтому в исходном файле EXCEL должен быть только один лист.
# Ответить
36. Гость 10.05.2016 19:48
Проблема: числовые значения заполняются в Таблицу Значений правильно (как числа) из файла Эксель (через Табличный Документ), только если числа не содержат десятичной (дробной) части. Если есть дробная часть, то они записываются как текстовые значения, либо как тип Дата.

Пытался менять региональные настройки ("," или "." в качестве разделителей дробной части) и Региональные настройки базы данных 1С - безрезультатно.
Ответили: (37)
# Ответить
37. StepByStep 15.05.2016 19:23
(36) Гость,
Рекомендовал бы Вам обратить внимание на обработку Импорт из внешнего источника в 1С: infostart.ru
В ней механизм загрузки данным методом уточнен (несколько изменен функционал по типизации значений).
# Ответить
Внимание! За постинг в данном форуме $m не начисляются.
Внимание! Для написания сообщения необходимо авторизоваться
Текст сообщения*
Прикрепить файл