Загрузка из EXCEL в 1С. MS EXCEL.Application

Публикация № 163641

Разработка - Практика программирования

1C Предприятие Импорт Загрузка Чтение Microsoft MS Excel LibreOffice OpenOffice dbf dBase xml mxl ActiveX ADO ADODB Windows

ПРАКТИЧЕСКОЕ ПОСОБИЕ РАЗРАБОТЧИКА: Метод "MS EXCEL" (EXCEL.Application).
Поддерживаемые типы: *.xls,*.xlsx.

20.08.2014. Новая редакция с возможностью загрузки изображений из файла.

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

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


Публикаций на тему загрузки из EXCEL - множество, но
"
— Вам билетёр нужен?
— Был нужен, да уже взяли.
Может и я на что сгожусь?
— Может и сгодишься, если скалиться не будешь ...
"
"НЕУЛОВИМЫЕ МСТИТЕЛИ" (1966).


&НаКлиенте
Процедура ПриОткрытии(Отказ)
    ФайлEXCEL= "D:\Товар.xls";
    ИмяЛиста = Новый Структура ("ИмяЛиста, НомерЛиста","СФКартинок (2)", 16);
    СтрокаЗаголовка = 1;
    НачСтрока = 3;
    КонСтрока = 4;
    КолвоСтрокExcel = 0;
    ЗагрузитьМетодом_MSEXCEL_НаСервере(ФайлEXCEL, ИмяЛиста, СтрокаЗаголовка, НачСтрока, КонСтрока, КолвоСтрокExcel);
КонецПроцедуры

&НаСервере
Процедура ЗагрузитьМетодом_MSEXCEL_НаСервере(ФайлEXCEL, ИмяЛиста, СтрокаЗаголовка, НачСтрока, КонСтрока, КолвоСтрокExcel)

    ТаблицаРезультат = ЗагрузитьМетодом_MSEXCEL(ФайлEXCEL, ИмяЛиста, СтрокаЗаголовка, НачСтрока, КонСтрока, КолвоСтрокExcel);

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

// Метод "Microsoft EXCEL.Application".
//
// Параметры:
//      ФайлEXCEL - Полное имя файла (путь к файлу с именем файла и расширением)
//      ИмяНомерЛиста - Имя/Номер выбранного листа файла EXCEL.
//      СтрокаЗаголовка (по умолчанию = 1) - Номер строки EXCEL, в которой расположены заголовки колонок.
//          Не используется.
//      В обработке 1-я строка анализируется для сопоставления колонок EXCEL с реквизитами 1С (справочники, докуметны, регистры).
//      НачСтрока (по-умолчанию = 0) - Номер начальной строки, начиная с которой считываются данные из EXCEL.
//      КонСтрока (по-умолчанию = 0) - Номер конечной строки, которой заканчиваются считываемые данные из EXCEL.
//          Если НачСтрока=0 и КонСтрока=0, то считывается вся таблица, находящаяся на листе EXCEL.
//      КолвоСтрокEXCEL - Количество строк на листе "ИмяЛиста" EXCEL. Возвращается в вызываемую процедуру.
//
// Возвращаемые значения:
//      ТаблицаРезультат - Результат считывания с листа "ИмяЛиста" EXCEL.
//
&НаСервере
Функция ЗагрузитьМетодом_MSEXCEL(Знач ФайлEXCEL, Знач ИмяНомерЛиста, Знач СтрокаЗаголовка = 1, НачСтрока = 2, КонСтрока = 0, КолвоСтрокEXCEL)
    Перем ИмяФайлаEXCEL, ИмяЛиста, НомерЛиста;
    Перем EXCELApplication, Book, Sheet;
    Перем ВсегоЛистов, НачальнаяКолонка, НачальнаяСтрока, КонечнаяКолонка, КонечнаяСтрока;
    Перем ДиапазонДанных, СтрокДиапазона, ДиапазонЗаголовка, МассивЗаголовка, МассивЗначений;
    Перем ТекИмя, ПозДоллар, Версия;
    Перем ТаблицаРезультат, МассивИменКолонок, ИмяКолонки, Колонка, Заголовок, НоваяСтрока, нСтроки;

    ИмяФайлаEXCEL = ПолучитьИмяФайлаБезРасширения(ФайлEXCEL);

    // Нумерация MS EXCEL начинается с 1.
    ИмяЛиста    = ИмяНомерЛиста.ИмяЛиста;
    НомерЛиста  = ИмяНомерЛиста.НомерЛиста;

    Попытка
        // Инициализация основного объекта EXCEL.Application: Открытие соединения.
        EXCELApplication = Новый COMОбъект("EXCEL.Application");
        EXCELApplication.Visible       = Ложь;
        EXCELApplication.DisplayAlerts = Ложь;
    Исключение
        Попытка
            EXCELApplication.Application.Quit();
        Исключение
        КонецПопытки;
        EXCELApplication = Неопределено;
        Сообщить(НСтр("ru = '"+ОписаниеОшибки()+"'"), СтатусСообщения.Внимание);
        Возврат Новый ТаблицаЗначений;  // В случае ошибки возвращаем пустую таблицу значений.
    КонецПопытки;

    // Определение версии EXCEL.
    Версия = Лев(EXCELApplication.Version,Найти(EXCELApplication.Version,".")-1);

    // Инициализация дочернего объекта типа Книга EXCEL.
    Book = EXCELApplication.WorkBooks.Open(ФайлEXCEL);
    ВсегоЛистов = Book.Sheets.Count;

    // Инициализация дочернего объекта Книги типа Лист EXCEL.
    Если Лев(ИмяЛиста, 1) = "'" И Прав(ИмяЛиста, 1) = "'" Тогда
        ИмяЛиста = УдалитьКавычки(ИмяЛиста, "'");
    КонецЕсли;
    Если Прав(ИмяЛиста, 1) = "$" Тогда
        УдалитьПоследнийСимволВСтроке(ИмяЛиста, 1);
    КонецЕсли;
    Sheet = Book.WorkSheets(ИмяЛиста);

    // Определение диапазона данных таблицы EXCEL.
    НачальнаяКолонка    = 1;
    НачальнаяСтрока     = 1;
    Если Версия = "8" Тогда
        КонечнаяКолонка = Sheet.Cells.CurrentRegion.Columns.Count;
        КонечнаяСтрока  = Sheet.Cells.CurrentRegion.Rows.Count;
    Иначе
        КонечнаяКолонка = Sheet.Cells.SpecialCells(11).Column;
        КонечнаяСтрока  = Sheet.Cells.SpecialCells(11).Row;
    Конецесли;

    // Параметр возвращаемый в вызывающую процедуру.
    КолвоСтрокEXCEL     = КонечнаяСтрока;

    // Проверка заполненности листа.
    Если КолвоСтрокEXCEL <= 1 И КонечнаяКолонка <= 1 Тогда
        КолвоСтрокEXCEL = 0;
        Сообщить(НСтр("ru = '" + ИмяЛиста + ": Лист, содержащий 1 строку считаем пустым.'"), СтатусСообщения.Внимание);

        // Завершение работы.
        // Закрытие Объектов.
        Попытка
            Book.Close();
        Исключение
        КонецПопытки;
        Попытка
            EXCELApplication.Application.Quit();
        Исключение
        КонецПопытки;
        EXCELApplication = Неопределено;

        Возврат Новый ТаблицаЗначений;  // В случае ошибки возвращаем пустую таблицу значений.
    КонецЕсли;

    НачальнаяСтрока     = ?(НачСтрока = 0   , НачальнаяСтрока   , НачСтрока);
    КонечнаяСтрока      = ?(КонСтрока = 0   , КонечнаяСтрока    , КонСтрока);

    КонечнаяСтрока      = ?(КонечнаяСтрока > КолвоСтрокEXCEL, КолвоСтрокEXCEL, КонечнаяСтрока);
    НачальнаяСтрока     = ?(НачальнаяСтрока > КолвоСтрокEXCEL, КолвоСтрокEXCEL, НачальнаяСтрока);

    // Диапазон: Считываемые данные.
    ДиапазонДанных = Sheet.Range(Sheet.Cells(НачальнаяСтрока, НачальнаяКолонка), Sheet.Cells(КонечнаяСтрока, КонечнаяКолонка));
    СтрокДиапазона = ДиапазонДанных.Rows.Count;

    // Создание результирующей таблицы, в которую будут записываться считанные из EXCEL данные.
    ТаблицаРезультат = Новый ТаблицаЗначений;

    // Формирование колонок результирующей таблицы.

    // "НомерСтроки" - для наглядности и удобства.
    // В зависимости от разрабатываемой обработки.
    // "Сопоставлено" - может быть другим.
    // Здесь же могут быть добавлены другие колонки, не формируемые из содержимого файла EXCEL.
    ТаблицаРезультат.Колонки.Добавить("НомерСтроки", Новый ОписаниеТипов("Число"), "№", 4);
    ТаблицаРезультат.Колонки.Добавить("Сопоставлено", Новый ОписаниеТипов("Булево"), "Сопоставлено", 1);

    МассивИменКолонок = Новый Массив;
    Для ит = 1 ПО КонечнаяКолонка Цикл

        ТекИмя = Строка(ит);
        МассивИменКолонок.Добавить(ТекИмя);

        Если ДиапазонДанных.Columns(ит).Hidden Тогда    // Скрытые колонки EXCEL пропустить.
            Продолжить;
        КонецЕсли;

        ИмяКолонки = "N" + ТекИмя;
        ТаблицаРезультат.Колонки.Добавить(ИмяКолонки);

    КонецЦикла;

    // ТаблицаРезультат: 1-я Строка-Заголовок.
    // Если в Вашей обработке в результирующей таблице в качестве 1-ой строки не нужна Строка-Заголовок, то
    // следует закомментировать следующий цикл:
    ДиапазонЗаголовка = Sheet.Range(Sheet.Cells(1, НачальнаяКолонка), Sheet.Cells(1, КонечнаяКолонка));
    МассивЗаголовка = ДиапазонЗаголовка.Value.Выгрузить();

    НоваяСтрока = ТаблицаРезультат.Добавить();
    НоваяСтрока.НомерСтроки = 1;

    ит = -1;
    Для Каждого МассивЗначений ИЗ МассивЗаголовка Цикл

        Для Каждого ЭлементМассива ИЗ МассивЗначений Цикл
            ит = ит + 1;

            ИмяКолонки = "N" + МассивИменКолонок[ит];
            Колонка = ТаблицаРезультат.Колонки.Найти(ИмяКолонки);
            Если Колонка = Неопределено Тогда   // Имена скрытых колонок отсутствуют в массиве.
                Продолжить;
            КонецЕсли;

            НоваяСтрока[ИмяКолонки] = СокрЛП(ЭлементМассива);
        КонецЦикла;

    КонецЦикла;

    // ТаблицаРезультат: формирование строк по указанному диапазону: НачСтрока - КонСтрока.

    ДиапазонДанных = ДиапазонДанных.Value;

    нСтроки = НачальнаяСтрока-1;
    Для НомерСтроки = 1 ПО СтрокДиапазона Цикл

        нСтроки = нСтроки + 1;
        НоваяСтрока = ТаблицаРезультат.Добавить();
        НоваяСтрока.НомерСтроки = нСтроки;

        Для НомерКолонки = 1 ПО КонечнаяКолонка Цикл

            ИмяКолонки = "N" + МассивИменКолонок[НомерКолонки-1];
            Колонка = ТаблицаРезультат.Колонки.Найти(ИмяКолонки);
            Если Колонка = Неопределено Тогда   // Имена скрытых колонок отсутствуют в массиве.
                Продолжить;
            КонецЕсли;

            ЗначениеЯчейки = ДиапазонДанных.GetValue(НомерКолонки, НомерСтроки);            // Считывание данных в соответствии с их типом.

            Если ЗначениеЯчейки = Неопределено Тогда
                ЗначениеЯчейки = ПрочитатьКартинку_MSEXCEL(EXCELApplication, Sheet, НомерКолонки, нСтроки, ИмяФайлаEXCEL, НомерЛиста, "УИД");
            КонецЕсли;

            Если ЗначениеЗаполнено(ЗначениеЯчейки) Тогда

                // Ширина колонки используется при формировании таблицы на форме обработки.
                ШиринаКолонки = ТаблицаРезультат.Колонки[ИмяКолонки].Ширина;
                ДлинаСтроки = СтрДлина(СокрЛП(ЗначениеЯчейки));
                ТаблицаРезультат.Колонки[ИмяКолонки].Ширина = ?(ШиринаКолонки < ДлинаСтроки, ДлинаСтроки, ШиринаКолонки);

                НоваяСтрока[ИмяКолонки] = ЗначениеЯчейки;

            КонецЕсли;

        КонецЦикла;

    КонецЦикла;

    УдалитьКолонкиСНулевойШириной(ТаблицаРезультат);

    // Завершение работы.
    // Закрытие Объектов.
    Попытка
        Book.Close();
    Исключение
    КонецПопытки;
    Попытка
        EXCELApplication.Application.Quit();
    Исключение
    КонецПопытки;
    EXCELApplication = Неопределено;

    Возврат ТаблицаРезультат;

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

// Функция осуществляет экспорт изображения во внешний графический файл.
//
// Параметры:
//      EXCELApplication - Объект типа "EXCEL.Application".
//      Sheet - Обект типа "Лист книги EXCEL".
//      НомерКолонки - Номер колонки листа.
//      НомерСтроки - Номер строки листа.
//      ИмяФайлаEXCEL - Короткое имя файла без расширения, из которого производится импорт.
//      НомерЛиста - Номер листа книги EXCEL.
//      ПравилоИмяФайлаКартинки - правило формирования имени выходного графического файла.
//      - "УИД" (по умолчанию).
//      - Иначе на основании имени исходного файла EXCEL, Номера листа, Номера строки, Номера колонки.
//
// Возвращаемые значения:
//      ПолноеИмяФК - Полное имя графического файла.
//
&НаСервере
Функция ПрочитатьКартинку_MSEXCEL(Знач EXCELApplication, Знач Sheet, Знач НомерКолонки, Знач НомерСтроки, Знач ИмяФайлаEXCEL, Знач НомерЛиста, Знач ПравилоИмяФайлаКартинки = "УИД")
    Перем GraphicObject, Chart;
    Перем ПолноеИмяФК, ФайлКартинки;

    Если Sheet.Shapes.Count() = 0 Тогда
        Возврат Неопределено;
    КонецЕсли;

    Для Каждого GraphicObject ИЗ Sheet.Shapes Цикл
        Если GraphicObject.Type = 13 И GraphicObject.TopLeftCell.Column = НомерКолонки И GraphicObject.TopLeftCell.Row = НомерСтроки Тогда

            // GraphicObject.Name.
            Если ПравилоИмяФайлаКартинки = "УИД" Тогда
                ПолноеИмяФК = КаталогВременныхФайлов() + Новый УникальныйИдентификатор() + ".jpg";
            Иначе
                ПолноеИмяФК = КаталогВременныхФайлов() + ИмяФайлаEXCEL + "Л" + НомерЛиста + "С" + НомерСтроки + "К" + НомерКолонки + ".jpg";
            КонецЕсли;

            Попытка
                GraphicObject.ScaleHeight(1,1);     // Истинный размер по высоте.
                GraphicObject.ScaleWidth(1,1);      // Истинный размер по ширине.
                GraphicObject.Copy();

                Chart = EXCELApplication.ActiveSheet.ChartObjects().Add(0, 0, GraphicObject.Width, GraphicObject.Height).Chart();
                Chart.Paste();
                Chart.Export(ПолноеИмяФК);

                Chart = Неопределено;

                ФайлКартинки = Новый Файл(ПолноеИмяФК);
                Если ФайлКартинки.Существует() Тогда
                    Возврат ПолноеИмяФК;
                Иначе
                    Сообщить("Не удалось экспортировать картинку из строки " + НомерСтроки + " колонки " + НомерКолонки + " в " + ПолноеИмяФК);
                    Возврат Неопределено;
                КонецЕсли;
            Исключение
                Сообщить(ОписаниеОшибки());
                Сообщить("Не удалось экспортировать картинку из строки " + НомерСтроки + " колонки " + НомерКолонки + " в " + ПолноеИмяФК);
                Возврат Неопределено;
            КонецПопытки;

        КонецЕсли;
    КонецЦикла;

    Возврат Неопределено;

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

&НаСервере
Процедура УдалитьКолонкиСНулевойШириной(ТаблицаРезультат)
    Перем МассивПустыхКолонок;

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

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

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

// Выделяет из полного имени файла имя файла без расширения.
//
// Параметры
//  ПолноеИмяФайла     – Строка, содержащая имя файла, неважно с именем каталога или без.
//
// Возвращаемое значение:
//   ИмяФайлаБезРасширения – короткое имя файла.
//
&НаСервере
Функция ПолучитьИмяФайлаБезРасширения(ПолноеИмяФайла)
    Перем ФайлТМП, РасширениеФайла, ИмяФайлаБезРасширения;

    ФайлТМП = РазложитьСтрокуВМассивПодстрок(ПолноеИмяФайла, "\");
    ФайлТМП = ФайлТМП[ФайлТМП.Количество()-1];
    РасширениеФайла  = "." + ПолучитьРасширениеИмениФайла(ФайлТМП);
    ИмяФайлаБезРасширения = СтрЗаменить(ФайлТМП, РасширениеФайла, "");

    Возврат ИмяФайлаБезРасширения;

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

// Выделяет из имени файла его расширение (набор символов после последней точки).
//
// Параметры
//  ИмяФайла     – Строка, содержащая имя файла, неважно с именем каталога или без.
//
// Возвращаемое значение:
//   Строка – расширение файла.
//
&НаСервере
Функция ПолучитьРасширениеИмениФайла(Знач ИмяФайла)
    Перем Расширение;

    Расширение = ПолучитьСтрокуОтделеннойСимволом(ИмяФайла, ".");
    Возврат Расширение;

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

// Удаляет кавычки с начала и конца строки, если они есть.
//
// Параметры:
//  Строка - входная строка;
//
// Возвращаемое значение:
//  Строка - строка без двойных кавычек.
//
&НаСервере
Функция УдалитьКавычки(Знач Строка, Кавычка = """")

    Пока Лев(Строка, 1) = Кавычка Цикл
        Строка = Сред(Строка, 2);
    КонецЦикла;

    Пока Прав(Строка, 1) = Кавычка Цикл
        Строка = Лев(Строка, СтрДлина(Строка) - 1);
    КонецЦикла;

    Возврат Строка;

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

// Удаляет из строки указанное количество символов справа.
//
// Параметры:
//  Текст         - Строка - строка, в которой необходимо удалить последние символы;
//  ЧислоСимволов - Число  - количество удаляемых символов.
//
&НаСервере
Процедура УдалитьПоследнийСимволВСтроке(Текст, ЧислоСимволов)

    Текст = Лев(Текст, СтрДлина(Текст) - ЧислоСимволов);

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

// Функция "расщепляет" строку на подстроки, используя заданный
//      разделитель. Разделитель может иметь любую длину.
//      Если в качестве разделителя задан пробел, рядом стоящие пробелы
//      считаются одним разделителем, а ведущие и хвостовые пробелы параметра Стр
//      игнорируются.
//      Например,
//      РазложитьСтрокуВМассивПодстрок(",один,,,два", ",") возвратит массив значений из пяти элементов,
//      три из которых - пустые строки, а
//      РазложитьСтрокуВМассивПодстрок(" один   два", " ") возвратит массив значений из двух элементов
//
//  Параметры:
//      Стр -           строка, которую необходимо разложить на подстроки.
//                      Параметр передается по значению.
//      Разделитель -   строка-разделитель, по умолчанию - запятая.
//
//  Возвращаемое значение:
//      массив значений, элементы которого - подстроки
//
&НаСервере
Функция РазложитьСтрокуВМассивПодстрок(Знач Стр, Разделитель = ",")

    МассивСтрок = Новый Массив();
    Если Разделитель = " " Тогда
        Стр = СокрЛП(Стр);
        Пока 1 = 1 Цикл
            Поз = Найти(Стр, Разделитель);
            Если Поз = 0 Тогда
                МассивСтрок.Добавить(СокрЛП(Стр));
                Возврат МассивСтрок;
            КонецЕсли;
            МассивСтрок.Добавить(СокрЛП(Лев(Стр, Поз - 1)));
            Стр = СокрЛ(Сред(Стр, Поз));
        КонецЦикла;
    Иначе
        ДлинаРазделителя = СтрДлина(Разделитель);
        Пока 1 = 1 Цикл
            Поз = Найти(Стр, Разделитель);
            Если Поз = 0 Тогда
                Если (СокрЛП(Стр) <> "") Тогда
                    МассивСтрок.Добавить(СокрЛП(Стр));
                КонецЕсли;
                Возврат МассивСтрок;
            КонецЕсли;
            МассивСтрок.Добавить(СокрЛП(Лев(Стр,Поз - 1)));
            Стр = Сред(Стр, Поз + ДлинаРазделителя);
        КонецЦикла;
    КонецЕсли;

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

// Функция возвращает часть строки после последнего встреченного символа в строке
&НаСервере
Функция ПолучитьСтрокуОтделеннойСимволом(Знач ИсходнаяСтрока, Знач СимволПоиска)

    ПозицияСимвола = СтрДлина(ИсходнаяСтрока);
    Пока ПозицияСимвола >= 1 Цикл
        Если Сред(ИсходнаяСтрока, ПозицияСимвола, 1) = СимволПоиска Тогда
            Возврат Сред(ИсходнаяСтрока, ПозицияСимвола + 1);
        КонецЕсли;
        ПозицияСимвола = ПозицияСимвола - 1;
    КонецЦикла;

    Возврат "";

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


Преимущества:

1.Метод "Microsoft EXCEL" наиболее прост в применении (кодировании).
2. По скорости считывания находится на 2-ом месте после "Microsoft ADODB".

Особенности и Ограничения:

1. Для функционирования метода "Microsoft EXCEL" необходим установленный Microsoft Office. Коммерческий продукт.
2. Метод может не работать в клиент-серверном варианте, если у SQL-пользователя недостаточно прав в Windows.
3. 1-я строка файла EXCEL - строка, содержащая заголовки колонок.

 

МА! С уважением к сообществу МА!

Специальные предложения

Комментарии
Избранное Подписка Сортировка: Древо развёрнутое
Свернуть все
1. StepByStep 3356 20.08.14 15:50 Сейчас в теме
20.08.2014. Новая редакция с возможностью загрузки изображений из файла.
3. kiv1c 560 02.09.15 17:41 Сейчас в теме
(1) а вот тут http://infostart.ru/public/341855/ в комментариях писали что:
при использовании директивы"&НаСервере" в клиент-серверном варианте файл должен располагаться либо по сетевому пути, либо на сервере, где установлен "Агент сервера 1С:Предприятия 8.3 (x86-64)"
то есть, при клиент-серверной работе, нет возможности открыть файл с локального компьютера пользователя?
4. kiv1c 560 09.09.15 10:02 Сейчас в теме
(1) да, я разобрался, с клиента на сервер можно передать прочитанные из файла двоичные данные, потом на сервере их записать во временный эксель-файл и читать табличным документом из него.
2. KliMich 10.11.14 11:08 Сейчас в теме
Спасибо!
Надо попробовать
5. fieryfist 15 16.09.15 16:32 Сейчас в теме
Странно, Версия определяется 14, но количество строк показывает не верно.
Если считать по версии 8 (в условии), то количество строк верное.
6. bdsmka 15.12.15 14:48 Сейчас в теме
Подскажите пжст в чем может быть проблема:
Использовал эту статью для написания обработки загрузки платежей в БП3
все отлично работало примерно 2 месяца.
После стал долго задумываться и вываливать пустую таблицу значений
----
        КонецПопытки;
        EXCELApplication = Неопределено;
        Сообщить(НСтр("ru = '"+ОписаниеОшибки()+"'"), СтатусСообщения.Внимание);
        Возврат Новый ТаблицаЗначений;  // В случае ошибки возвращаем пустую таблицу значений.
    КонецПопытки;
----

Вначале помогал перезапуск сервера 1с 8.3
А теперь и это перестало помогать.
Что может быть? Ошибки ни какой не выдает, через отладчик тоже ничего....
7. StepByStep 3356 24.12.15 17:28 Сейчас в теме
(6) bdsmka,
Для начала попробуйте попробуйте закомментировать Попытка/Исключение/КонецПопытки, чтобы увидеть ошибку.
8. Lapitskiy 976 25.05.16 06:10 Сейчас в теме
Вот такая ошибка иногда на некоторых компах выскакивает: Ошибка при вызове конструктура (COMОбъект): -2147221005(0x800401F3): Недопустимая строка с указанием класса
Это при чтении методом Экселя.
9. StepByStep 3356 07.06.16 11:55 Сейчас в теме
(8) Lapitskiy,
Офис не пробовали переустанавливать ?
10. sokir 1 15.02.17 21:50 Сейчас в теме
Работает однако.
Только
Попытка
            EXCELApplication.Application.Quit();
        Исключение
        КонецПопытки;
        EXCELApplication = Неопределено;
        Сообщить(НСтр("ru = '"+ОписаниеОшибки()+"'"), СтатусСообщения.Внимание);


НЕ верно - Надо Сообщить выше попытки, чтобы она возвращала ошибку открытия, а не закрытия.
11. bpc222 2184 06.06.17 13:38 Сейчас в теме
про извлечение картинок...

дареному коню, конечно, в зубы не смотрят, но...

вы про кэширование не думали? зачем перебирать все изображения всякий раз, когда нужно экспортировать очередное изображение?
12. KAV2 25.04.18 11:46 Сейчас в теме
13. Alex10166 24.05.19 11:29 Сейчас в теме
Всех приветствую!
Подскажите, пожалуйста, откуда можно брать инфу по методам и свойствам КОМ-объекта windows!

Например вот такое выражение:
EXCELApplication = Новый COMОбъект("EXCEL.Application");
EXCELApplication.Visible       = Ложь;
EXCELApplication.DisplayAlerts = Ложь;


В синтаксис-помощнике это нет, разумеется.
Где описаны методы и свойства самих Ком-Объектов? .Visible , .DisplayAlerts и т.д.
14. pentanom 23 24.05.19 12:08 Сейчас в теме
15. Alex10166 24.05.19 12:26 Сейчас в теме
(14) в данном случае - да. но это не суть принципиально, я просто пример привел. через Ком-объект можно разные приложения использовать. Вопрос только в том, где искать инфу - у Майкрософт или 1С.
16. pentanom 23 24.05.19 14:41 Сейчас в теме
(15)Для EXCEL в Майкрософт.
В общем случае - у разработчика приложения.
Оставьте свое сообщение

См. также

3 онлайн-курса по 1С-программированию: обмен данными, расчетные задачи и бухгалтерские задачи с 12 мая по 8 июля 2020 г. Промо

Практика программирования v8 Бесплатно (free)

Пакет из 3-х курсов по 1С-программированию. Основная цель - сформировать у слушателей практические навыки, связанные с реализацией задач обмена для прикладных решений, работающих на платформе “1С:Предприятие”, а также с разработкой прикладных решений, предназначенных для автоматизации расчета заработной платы и задач бухгалтерского учета.

22.04.2020    4630    23    Infostart    2    

Программная работа с настройками СКД

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Нюансы программной работы с настройками системы компоновки данных в отчетах и динамических списках. Обзор всех видов настроек компоновки. Что в каких случаях правильно применять. В качестве примера рассмотрена работа с отборами и группировками.

27.01.2020    19153    0    ids79    26    

Универсальные инструменты 1С

Универсальные обработки Прочие инструменты разработчика v8 1cv8.cf Бесплатно (free)

Свободно распространяемый набор универсальных обработок и отчетов в виде расширения для разработки и поддержки, которое работает во ВСЕХ видах клиентских приложений и во всех операционных системах, которые поддерживает платформа 1С:Предприятие, кроме мобильных. Консоль запросов - консоль отчетов - консоль кода - редактор объектов базы данных - удаление помеченных объектов - поиск и удаление дублей - редактор констант - консоль заданий - групповая обработка справочников и документов - динамический список - поиск ссылок на объект - регистрация изменений для обмена данными - структура хранения базы - консоль HTTP запросов-консоль вебсервисов- консоль сравнения данных- информация о лицензиях- загрузка из табличного документа-файловый менеджер-все функции- навигатор по конфигурации-конструктор регулярных выражений-Выгрузка загрузка XML с фильтрами

21.01.2020    21430    295    cprit    94    

[СКД] Программное создание схемы компоновки данных

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Сделаем отчет на СКД полностью программно, без использования макета "схема компоновки данных".

15.01.2020    18524    0    John_d    22    

Копирование числовых ячеек из 1С в Excel Промо

Загрузка и выгрузка в Excel Администрирование данных 1С v8 1cv8.cf Бесплатно (free)

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

15.01.2019    21646    0    itriot11    23    

Последовательности событий. Шпаргалка

Практика программирования v8 Россия Бесплатно (free)

Собрал информацию о событиях/подписках/расширениях в одном месте.

30.12.2019    13461    0    kuzyara    33    

Как передать IP адрес, который вызвал HTTP запрос в 1C (для веб-сервера Apache)

Практика программирования v8 Бесплатно (free)

Столкнулся с задачей получения IP адреса, который вызывает http сервис 1С. Итак, решение:

22.11.2019    6807    0    Sibars    19    

Таблица значений. Нюансы

Практика программирования v8 Бесплатно (free)

Обзор некоторых аспектов использования общеизвестного инструмента 1С.

01.10.2019    28219    0    Yashazz    45    

Использование программных перечислений, ч.1: строковые константы Промо

Практика программирования v8 1cv8.cf Бесплатно (free)

Часто ли у вас возникает необходимость в коде выполнять сравнение на строку?

10.12.2016    35505    0    unichkin    45    

[Шпаргалка] Программное создание элементов формы

Практика программирования Работа с интерфейсом v8 1cv8.cf Бесплатно (free)

Программное создание практически всех популярных элементов формы.

06.09.2019    39754    0    rpgshnik    62    

Агрегатные функции СКД, о которых мало кто знает

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Пользуетесь ли Вы всеми возможными агрегатными функциями, которые предоставляет система компоновки данных? Если Вы используете только: СУММА, КОЛИЧЕСТВО, МИНИМУМ, МАКСИМУМ, СРЕДНЕЕ, то эта статья для Вас.

05.09.2019    41888    0    ids79    54    

Регистры бухгалтерии. Общая информация

Практика программирования Математика и алгоритмы v8 v8::БУ БУ Бесплатно (free)

Общая информация о внутреннем устройстве регистров бухгалтерии.

05.09.2019    24428    0    YPermitin    24    

Вспомогательные инструкции в коде 1С Промо

Практика программирования v8 1cv8.cf Бесплатно (free)

Помогаем редактору кода 1С помогать нам писать и анализировать код.

15.10.2018    27940    0    tormozit    100    

Три костыля. Сказ про фокусы в коде

Практика программирования v8 Бесплатно (free)

Три интересных (или странных) костыля в коде, которые могут помочь в повседневных и не очень задачах.

03.09.2019    23143    0    YPermitin    80    

Отслеживание выполнения фонового задания

Практика программирования Универсальные функции Разработка v8 1cv8.cf Бесплатно (free)

Запуск фонового задания из модуля внешней обработки. Отслеживание выполнения задания в виде прогресса, расположенного на форме.

17.08.2019    28289    0    ids79    16    

Функции СКД: ВычислитьВыражение, ВычислитьВыражениеСГруппировкойМассив

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Подробное описание и использование внутренних функций системы компоновки данных: Вычислить, ВычислитьВыражение, ВычислитьВыражениеСГруппировкойМассив, ВычислитьВыражениеСГруппировкойТаблицаЗначений.

08.08.2019    65306    0    ids79    40    

Оформление и рефакторинг сложных логических выражений Промо

Практика программирования v8 Россия Бесплатно (free)

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

20.09.2012    75423    0    tormozit    129    

Фоновое выполнение кода в 1С - это просто

Практика программирования v8 1cv8.cf Бесплатно (free)

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

02.08.2019    29322    0    avalakh    22    

СКД - наборы данных и связи между ними, создание собственной иерархии, вложенные отчеты

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Набор данных объект. Использование в схеме компоновки нескольких наборов данных. Различные варианты связи наборов: объединение, соединение. Использование иерархии в отчетах на СКД. Создание собственной иерархии, иерархия детальных записей. Использование вложенных схем в отчетах на СКД.

26.07.2019    48930    0    ids79    11    

СКД - использование расширений языка запросов, секция ХАРАКТЕРИСТИКИ

Инструментарий разработчика Практика программирования v8 v8::СКД Бесплатно (free)

Автоматическое и не автоматическое заполнение полей компоновки данных. Использование расширений языка запросов для СКД «{…}», секция ВЫБРАТЬ, секция ГДЕ, параметры виртуальных таблиц. Автоматизированное использование дополнительных данных в запросе: секция ХАРАКТЕРИСТИКИ.

17.07.2019    31517    0    ids79    27    

Запись значения в поле ввода/формы со срабатыванием события ПриИзменении Промо

Практика программирования v8 1cv8.cf Россия Бесплатно (free)

Иногда возникает необходимость после записи значения в какое либо поле ввода/формы вызвать для него обработчик события ПриИзменении, а о вызове самого события приходится только мечтать. В этой статье приводится программный способ вызова этого события.

11.07.2007    46321    0    tormozit    38    

Регистры сведений. За кулисами

Практика программирования Разработка v8 1cv8.cf Бесплатно (free)

Небольшие заметки по внутреннему устройству регистров сведений.

09.07.2019    23818    0    YPermitin    13    

"Меньше копипаста!", или как Вася универсальную процедуру писал

Практика программирования Разработка v8 v8::СКД 1cv8.cf Бесплатно (free)

Программист Вася разбирает подход создания универсальных методов на примере программного вывода СКД.

04.07.2019    17709    0    SeiOkami    50    

Создание отчетов с помощью СКД - основные понятия и элементы

Практика программирования Математика и алгоритмы v8 v8::СКД Бесплатно (free)

Основные принципы работы СКД. Понятия схемы компоновки и макета компоновки. Описание основных элементов схемы компоновки: наборы данных, поля, вычисляемые поля, ресурсы, параметры.

25.06.2019    46001    0    ids79    25    

Как сделать из &НаКлиентеНаСервереБезКонтекста почти &НаКлиентеНаСервере Промо

Практика программирования v8 1cv8.cf Россия Бесплатно (free)

Как сделать метод формы, доступный на клиенте и на сервере одновременно, и сохранить при этом удобство разработки

10.09.2017    42346    0    tormozit    74    

Многопоточное ускорение однопользовательских нагрузок в 1С + Microsoft SQL Server 2017

Практика программирования Производительность и оптимизация (HighLoad) v8 v8::Запросы Бесплатно (free)

Взаимодействие с Microsoft SQL Server нередко вызывает трудности у 1С-ников, а потому интересны любые моменты, связанные с его использованием. О своем опыте работы с новым SQL Server 2017 участникам конференции Infostart-2018 рассказал директор ООО «Аналитика софт» Дмитрий Дудин.

11.06.2019    22832    0    dmurk    144    

Регистры накопления. Структура хранения в базе данных

Практика программирования Разработка v8 1cv8.cf Бесплатно (free)

Структура хранения регистров накопления в базе данных для платформы 1С:Предприятие 8.x. Первая часть в серии публикаций.

16.05.2019    38432    0    YPermitin    30    

Выполнение внешней обработки в фоновом задании

Практика программирования Разработка v8 1cv8.cf Бесплатно (free)

Подробное описание подхода к созданию длительной операции на основе внешней обработки. Реализация протестирована на 1С 8.3.12.1714 (x64).

11.05.2019    26599    0    Eret1k    23    

Выгрузка документа по условию Промо

Практика программирования Разработка v8 Бесплатно (free)

Что делать, если документы нужно выгружать не все подряд, а по какому-то фильтру: статусу, дате, набору условий... А что если он соответствовал этим условиям, а потом перестал? А если потом опять начал? Такие ситуации заставили попотеть не одного программиста.

25.04.2019    15409    0    m-rv    2    

Преобразование EXCEL в таблицу значений без COM и других извращений

Загрузка и выгрузка в Excel v8 1cv8.cf Бесплатно (free)

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

18.04.2019    25811    9    Eret1k    43    

Как прикрутить ГУИД к регистру сведений

Практика программирования Перенос данных из 1C8 в 1C8 Разработка v8 Бесплатно (free)

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

16.04.2019    19176    0    m-rv    17    

О расширениях замолвите слово...

Практика программирования Разработка v8 Бесплатно (free)

О чём стоит задуматься при принятии решения о создании расширения конфигурации…

07.04.2019    32072    0    ellavs    126    

Excel vs 1С: битва с неожиданным исходом Промо

Анализ учета Универсальные обработки Загрузка и выгрузка в Excel Финансовые Управленческие v8 1cv8.cf Россия Бесплатно (free)

Что лучше 1С или Excel? Разберемся, в казалось бы, очевидном, чтобы получить невероятное!

11.04.2019    34899    0    bolefirenko    116    

Git-репозитории для 1С-кода (опыт использования при небольших проектах)

Практика программирования v8 Бесплатно (free)

Инструкции по взаимодействию с Git-репозиторием, которые писались для тех наших программистов, которые вообще никогда не работали с Git (руководства в духе "Как получить код из git-репозитория?", "Как отправить код в git-репозиторий")...

28.03.2019    25283    0    ellavs    88    

Трюки с внешними источниками данных

Практика программирования Разработка v8 1cv8.cf Бесплатно (free)

Некоторые трюки для преодоления ограничений внешних источников данных.

14.03.2019    28883    0    YPermitin    53    

Возможности типовых шаблонов ограничения доступа на уровне записей (RLS)

Практика программирования БСП (Библиотека стандартных подсистем) Роли и права v8 v8::Права Бесплатно (free)

Краткий обзор применения типовых шаблонов ограничения доступа на уровне записей в конфигурациях, созданных на базе БСП: #ПоЗначениям, #ПоНаборамЗначений, #ПоЗначениямРасширенный, #ПоЗначениямИНаборамРасширенный

03.02.2019    34623    0    ids79    9    

Как сделать запрос на изменение данных Промо

Практика программирования v8 v8::Запросы 1cv8.cf Бесплатно (free)

В статье приведены особенности внутренней архитектуры и примеры работы с расширением языка запросов 1С.

01.06.2018    28826    0    m-rv    21    

Запись одной книги Excel на нескольких листах средствами 1С (без внешних компонент)

Загрузка и выгрузка в Excel v8 1cv8.cf Бесплатно (free)

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

14.01.2019    20444    0    starik-2005    25    

Новый подход к обмену данными EnterpriseData

Практика программирования Обмен через XML v8 v8::УФ Россия Бесплатно (free)

Хочу предложить Вашему вниманию цикл статей, посвященных обмену данными через универсальный формат (EnterpriseData или ED).

14.12.2018    37860    0    ids79    72    

Метод формирования движений в типовых регистрах нетиповыми регистраторами Промо

Практика программирования v8 1cv8.cf Бесплатно (free)

Вариант решения задач с проведением по типовым регистрам нетиповыми регистраторами. Зачем - чтобы при сравнении конфигурации не обращать внимание на свойства регистров и исключить вероятность допущения горькой оплошности при обновлении информационных баз, заменив типы регистраторов основной конфигурации типами конфигурации поставщика. Для программных продуктов, имеющих в своем составе метаданных документ "Корректировка регистров"("Корректировка записей регистров").

05.12.2017    26864    0    itriot11    34    

EnterpriseData - пример доработки правил конвертации без использования КД 3.0 в расширении конфигурации

Практика программирования Обмен через XML v8 v8::УФ БП3.0 УТ11 Россия Бесплатно (free)

В статье подробно описан реальный пример доработки обмена данными через EnterpriseData (универсальный формат обмена) между конфигурациями УТ 11.4 и Бухгалтерия 3.0

16.11.2018    34267    0    ids79    40    

Программное заполнение пользовательских параметров и отборов СКД

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

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

13.11.2018    41377    0    Unk92    21    

Автоматические и управляемые блокировки применительно к типовым конфигурациям 1С

Математика и алгоритмы Практика программирования v8 v8::blocking 1cv8.cf Бесплатно (free)

Основные принципы работы с режимами автоматических и управляемых блокировок в 1С Предприятие 8. Теория и применение в типовых конфигурациях: БП, УТ, ЕРП

10.11.2018    32421    0    ids79    40    

Использование классов .Net в 1С для новичков Промо

Практика программирования Разработка внешних компонент Универсальные функции v7.7 v8 Бесплатно (free)

Руководство для новичков. Написав статью http://infostart.ru/public/238584/, я понял, что многие не понимают того, что написано. Поэтому в этой статье постараюсь более подробно остановиться на азах и без кода на вражеском языке (C#)

27.01.2016    73426    0    Serginio    108    

Произвольный код в фоновом режиме

Практика программирования v8 1cv8.cf Бесплатно (free)

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

03.09.2018    25692    0    nikita0832    42    

Основные понятия и механизмы оптимизации клиент-серверного взаимодействия в 1C

Математика и алгоритмы Практика программирования v8 Россия Бесплатно (free)

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

23.08.2018    36460    0    Rain88    46