Загрузка из EXCEL в 1С. Чтение файла XLSX средствами 1С. ПостроительDOM

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

Разработка - Обработки - Универсальные обработки

EXCEL XML Загрузка Импорт ЧтениеXML ПостоительDOM

ПРАКТИЧЕСКОЕ ПОСОБИЕ РАЗРАБОТЧИКА: Метод "NativeXLSX" (ПостроительDOM).
Обрабатываются данные EXCEL типов: "Строка", "Число", "Дата" ("Время"), "Булево", "Процент", а также изображения.

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

Метод позволяет обрабатывать данные EXCEL типов: "Строка", "Число", "Дата" ("Время"), "Булево", "Процент", а также изображения.
Примечание: Изображение должны быть единственным значением в ячейке. Принадлежность изображения ячейке определяется по левому верхнему углу этого изображения.


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


Функционал, представленный в статье, позволяет организовать импорт (загрузку) из файла типа XLSX в таблицу значений.
При этом учитывается, что XLSX-файл - это некий контейнер, который можно распаковать средствами 1С в набор XML-файлов.
В конечном счете задача сводится к чтению xml-файлов, содержащих различную информаци:
- строковые значения [sharedStrings.xml];
- индексы строковых значений, числовые значения, формулы [собственно страницы EXCEL-таблицы sheet...xml];
- информация об изображениях [drawing...xml];
- стили форматирования [styles.xml].
Чтение XML-файлов осуществляется с помощью связки ЧтениеXML-ПостроительDOM-ДокументDOM (встроенные объекты платформы 1С), т.е. ДокументDOM получается как результат чтения ПостроителемDOM объекта ЧтениеXML - источника данных XML.
В дальнейшем осуществляется обход дочерних узлов ДокументаDOM, чтение их значений и различных атрибутов.
Данная методика на мой взгляд проще и удобнее использования объекта ЧтениеXML для разбора структурированных XML-файлов, коими представляется XLSX-файл.


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


В первом комментарии к публикации прикреплен файл, содержащий текст модуля.


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

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

// Метод "NativeXLSX" (ПостроительDOM).
// Преобразует текст формата XML (файл типа XLSX) в таблицу значений,
// при этом колонки таблицы формируются на основе описания в XML.
//
// Параметры:
//         ФайлEXCEL - Полное имя файла (путь к файлу с именем файла и расширением)
//         ИмяНомерЛиста - Структура Имя и Номер выбранного листа файла EXCEL.
//        СтрокаЗаголовка (по умолчанию = 1) - Номер строки EXCEL, в которой расположены заголовки колонок.
//            Не используется.
//      В обработке 1-я строка анализируется для сопоставления колонок EXCEL с реквизитами 1С (справочники, докуметны, регистры).
//        НачСтрока (по-умолчанию = 0) - Номер начальной строки, начиная с которой считываются данные из EXCEL.
//        КонСтрока (по-умолчанию = 0) - Номер конечной строки, которой заканчиваются считываемые данные из EXCEL.
//            Если НачСтрока=0 и КонСтрока=0, то считывается вся таблица, находящаяся на листе EXCEL.
//        КолвоСтрокEXCEL - Количество строк на листе "ИмяЛиста" EXCEL. Возвращается в вызываемую процедуру.
//
// Возвращаемые значения:
//         ТаблицаРезультат - Результат считывания с листа "ИмяЛиста" EXCEL.
//
&НаСервере
Функция ЗагрузитьМетодом_NativeXLSX(Знач ФайлEXCEL, Знач ИмяНомерЛиста, Знач СтрокаЗаголовка = 1, Знач НачСтрока = 0, Знач КонСтрока = 0, КолвоСтрокEXCEL = 0)
    Перем ZIPКаталог, ФайлИмяЛиста, ФайлНомерЛиста, КолвоКолонокEXCEL, НомерСтроки, НомерКолонки, ИмяКолонки, ИндексКолонки, ШиринаКолонки, ДлинаСтроки;
    Перем МассивИменКолонокXLSX, МассивSharedStrings, МассивNumFmtId, СоответствиеNumFmtIdFormatCode, ТаблицаIMAGE, СтрокаIMAGE, КаталогMEDIA;
    Перем ДокументDOM, ЭлементыROW, ЭлементСтрока, ЭлементыCOL, ЭлементКолонка;
    Перем ЗначениеЯчейки, ТипЗначения, ФорматЯчейки, ФорматСтиля;
    Перем ТаблицаРезультат, НоваяСтрока;
   
    ФайлИмяЛиста    = ИмяНомерЛиста.ИмяЛиста;
    ФайлНомерЛиста    = ИмяНомерЛиста.НомерЛиста;
   
    ФайлНомерЛиста = ?(ФайлНомерЛиста = 0, 1, ФайлНомерЛиста);
   
    ZIPКаталог = ПолучитьИмяКаталогаВременныхФайловДляРаспаковкиXLSX();
   
    Если НЕ ПредварительнаяОбработкаФайлаXLSX(ФайлEXCEL, ZIPКаталог) Тогда
        Возврат Новый ТаблицаЗначений;
    КонецЕсли;
   
    СоответствиеNumFmtIdFormatCode = Новый Соответствие;
    МассивNumFmtId = ИзвлечьДанныеИзФайла_StylesXML(ZIPКаталог, СоответствиеNumFmtIdFormatCode);
   
    МассивSharedStrings = ИзвлечьДанныеИзФайла_SharedStringsXML(ZIPКаталог);
   
    КаталогMEDIA = "media";
    ТаблицаIMAGE = ИзвлечьДанныеИзФайла_DrawingXML(ZIPКаталог, ФайлНомерЛиста, КаталогMEDIA);
   
    ДокументDOM = ПолучитьДокументDOM_NativeXLSX(ZIPКаталог + "XL\WorkSheets\Sheet" + ФайлНомерЛиста + ".xml");
    ЭлементыROW = ПолучитьЭлементыROW_NativeXLSX(ДокументDOM);
    Если ЭлементыROW = Неопределено ИЛИ ЭлементыROW.Количество() = 0 Тогда
        // Завершение работы.
        // Закрытие Объектов.
        ДокументDOM = Неопределено;
        Возврат Новый ТаблицаЗначений;
    КонецЕсли;
   
    МассивИменКолонокXLSX = ПолучитьМассивИменКолонокНаЛистеXLSX(ДокументDOM, ЭлементыROW);
    КолвоКолонокEXCEL = МассивИменКолонокXLSX.Количество();
   
    // Создание результирующей таблицы, в которую будут записываться считанные из EXCEL данные.
    ТаблицаРезультат = Новый ТаблицаЗначений;
   
    // Формирование колонок результирующей таблицы.
   
    // "НомерСтроки" - для наглядности и удобства.
    // В зависимости от разрабатываемой обработки.
    // "Сопоставлено" - может быть другим.
    // Здесь же могут быть добавлены другие колонки, не формируемые из содержимого файла EXCEL.
    ТаблицаРезультат.Колонки.Добавить("НомерСтроки", Новый ОписаниеТипов("Число"), "№", 4);
    ТаблицаРезультат.Колонки.Добавить("Сопоставлено", Новый ОписаниеТипов("Булево"), "Сопоставлено", 1);
    ТаблицаРезультат.Колонки.Добавить("УровеньГруппировки", Новый ОписаниеТипов("Число"), "Гр", 2);    // Группировка строк в файле EXCEL.
    Для ит = 1 ПО КолвоКолонокEXCEL Цикл
        ИмяКолонки = "N" + ит;
        Колонка = ТаблицаРезультат.Колонки.Добавить(ИмяКолонки);
    КонецЦикла;
   
    // Строки XLSX.
    НомерСтроки = 0;
    Для Каждого ЭлементСтрока ИЗ ЭлементыROW Цикл
        НомерСтроки = НомерСтроки + 1;
       
        // Начало диапазона считываемых данных.
        Если НЕ НачСтрока = 0 И НЕ НомерСтроки = 1 И НомерСтроки < НачСтрока Тогда
            Продолжить;
        КонецЕсли;
       
        // Окончание диапазона считываемых данных.
        Если КонСтрока > 0 И НомерСтроки > КонСтрока Тогда
            Прервать;
        КонецЕсли;
       
        // Окончание данных.
        Если КолвоСтрокEXCEL > 0 И НомерСтроки > КолвоСтрокEXCEL Тогда
            Прервать;
        КонецЕсли;
       
        НоваяСтрока = ТаблицаРезультат.Добавить();
        НоваяСтрока.НомерСтроки = НомерСтроки;
        НоваяСтрока.УровеньГруппировки = ЗначениеАтрибутаУзлаDOM(ЭлементСтрока, "outlineLevel");
       
        // Колонки XLSX.
        НомерКолонки = 0;
        ЭлементыCOL = ЭлементСтрока.ДочерниеУзлы;
        Для ит = 0 ПО КолвоКолонокEXCEL-1 Цикл
            НомерКолонки = НомерКолонки + 1;
           
            ЭлементКолонка = Неопределено;
            Попытка
                ЭлементКолонка = ЭлементыCOL[ит];
                ТипЗначения = ЗначениеАтрибутаУзлаDOM(ЭлементКолонка, "t");
                ФорматЯчейки = ЗначениеАтрибутаУзлаDOM(ЭлементКолонка, "s");
                ИмяКолонки = ЗначениеАтрибутаУзлаDOM(ЭлементКолонка, "r");
                ИмяКолонкиБезЦифр = ЗаменитьОдниСимволыДругими("0123456789", ИмяКолонки, "");
                ИндексКолонки = МассивИменКолонокXLSX.Найти(ИмяКолонкиБезЦифр) + 1;
            Исключение
                ЭлементКолонка = Неопределено;
                ИндексКолонки = НомерКолонки;
            КонецПопытки;
           
            ИмяКолонки = "N" + ИндексКолонки;
           
            ЗначениеЯчейки = Неопределено;
            Если НЕ ЭлементКолонка = Неопределено И НЕ ЭлементКолонка.ПервыйДочерний = Неопределено И (ВРег(ЭлементКолонка.ПервыйДочерний.ИмяУзла) = "V"  ИЛИ ВРег(ЭлементКолонка.ПервыйДочерний.ИмяУзла) = "F") Тогда    // "V" - Значение, "F" - Формула.
               
                Если ВРег(ЭлементКолонка.ПервыйДочерний.ИмяУзла) = "F" Тогда
                    Если НЕ ЭлементКолонка.ПоследнийДочерний = Неопределено И ВРег(ЭлементКолонка.ПоследнийДочерний.ИмяУзла) = "V" Тогда
                        ЗначениеЯчейки = ЭлементКолонка.ПоследнийДочерний.ТекстовоеСодержимое;
                    Иначе
                        Сообщить("Строка " + НомерСтроки + " Колонка " + ИндексКолонки + " значение формулы не определено.");
                    КонецЕсли;
                Иначе
                    ЗначениеЯчейки = ЭлементКолонка.ТекстовоеСодержимое;
                КонецЕсли;
               
                ФорматСтиля = "";
                Если (НЕ ФорматЯчейки = "" И НЕ ФорматЯчейки = Неопределено) Тогда
                    Попытка
                        ФорматСтиля = СоответствиеNumFmtIdFormatCode.Получить(МассивNumFmtId[Число(ФорматЯчейки)]);
                    Исключение
                        ФорматСтиля = "";
                    КонецПопытки;
                КонецЕсли;
               
                Если ЗначениеЗаполнено(ЗначениеЯчейки) Тогда
                   
                    Если ТипЗначения = Неопределено ИЛИ ВРег(ТипЗначения) = "N" ИЛИ ВРег(ТипЗначения) = "B" Тогда    // Тип "Число", "Булево".
                        Попытка
                            Значение1 = Число(ЗначениеЯчейки);
                        Исключение
                            Значение1 = ЗначениеЯчейки;
                        КонецПопытки;
                       
                        ЗначениеЯчейки = Значение1;
                       
                        Если (ФорматСтиля = "" ИЛИ ФорматСтиля = Неопределено) Тогда
                            // ФорматСтиля = Неопределено - Атрибут "s" отсутствует.
                            // MS Office может не формировать в xml-файле описание стиля форматирования для ячейки.
                            // LibreOffice формирует в xml-файле необходимые описания стиля форматирования ячейки.
                            // Сообщить("Не определен стиль форматирования для кода " + ФорматЯчейки + " значения " + ЗначениеЯчейки);
                        КонецЕсли;
                       
                        Если ТипЗнч(ЗначениеЯчейки) = Тип("Строка")
                            И (Найти(ЗначениеЯчейки, "E-") > 0 ИЛИ Найти(ЗначениеЯчейки, "E+") > 0) Тогда
                            ЗначениеЯчейки = ПолучитьЧислоВСтепениИзСтроковогоЗначения(ЗначениеЯчейки);
                        КонецЕсли;
                       
                        Если ТипЗнч(ЗначениеЯчейки) = Тип("Число") Тогда
                            // ПРОЦЕНТ.
                            Если ЭтоПроцентXLSX(ЗначениеЯчейки, ФорматСтиля) Тогда
                                ЗначениеЯчейки = Окр(ЗначениеЯчейки * 100, 3);
                            // БУЛЕВО.
                            ИначеЕсли ЭтоБулевоXLSX(ЗначениеЯчейки, ФорматСтиля) Тогда
                                ЗначениеЯчейки = Булево(ЗначениеЯчейки);
                            // ВРЕМЯ.
                            ИначеЕсли ЭтоВремяXLSX(ЗначениеЯчейки, ФорматСтиля) Тогда
                                ЗначениеЯчейки = КонвертироватьЧислоXLSXвДатуВремя(ЗначениеЯчейки);
                            // ДАТА.
                            ИначеЕсли ЭтоДатаXLSX(ЗначениеЯчейки, ФорматСтиля) Тогда
                                ЗначениеЯчейки = КонвертироватьЧислоXLSXвДату(ЗначениеЯчейки);
                            // ЧИСЛО.
                            ИначеЕсли ТипЗначения = Неопределено
                                ИЛИ ( ЭтоЧислоXLSX(ЗначениеЯчейки, ФорматСтиля)
                                И НЕ ЭтоБулевоXLSX(ЗначениеЯчейки, ФорматСтиля)
                                И НЕ ЭтоВремяXLSX(ЗначениеЯчейки, ФорматСтиля)
                                И НЕ ЭтоДатаXLSX(ЗначениеЯчейки, ФорматСтиля) )
                                Тогда
                                // Без преобразования.
                            Иначе
                                // Прочие форматы.
                            КонецЕсли;
                           
                        Иначе
                           
                            Сообщить("Не удалось преобразовать значение к ""числовому""(число, процент, время, дата, булево) типу.");
                           
                        КонецЕсли;
                       
                    ИначеЕсли ВРег(ТипЗначения) = "S" Тогда
                       
                        // МассивSharedStrings может быть пустым.
                        Попытка
                            ЗначениеЯчейки = СокрЛП(МассивSharedStrings[Число(ЗначениеЯчейки)]);
                        Исключение
                            ЗначениеЯчейки = "";
                        КонецПопытки;
                       
                    ИначеЕсли ВРег(ТипЗначения) = "STR" Тогда
                       
                        Если ТипЗнч(ЗначениеЯчейки) = Тип("Строка") Тогда
                            ЗначениеЯчейки = СокрЛП(ЗначениеЯчейки);
                        КонецЕсли;
                       
                    КонецЕсли;
                   
                КонецЕсли;
               
                НоваяСтрока[ИмяКолонки] = ЗначениеЯчейки;
               
                // Используется при формировании таблицы на форме обработки.
                ШиринаКолонки = ТаблицаРезультат.Колонки[ИмяКолонки].Ширина;
                ДлинаСтроки    = СтрДлина(СокрЛП(НоваяСтрока[ИмяКолонки]));
                ТаблицаРезультат.Колонки[ИмяКолонки].Ширина = ?(ШиринаКолонки < ДлинаСтроки, ДлинаСтроки, ШиринаКолонки);
               
            ИначеЕсли ЭлементКолонка = Неопределено ИЛИ (ЭлементКолонка.ПервыйДочерний = Неопределено И ТаблицаIMAGE.Количество() > 0) Тогда
               
                Для Каждого СтрокаIMAGE ИЗ ТаблицаIMAGE Цикл
                    Если СтрокаIMAGE.ROW = НомерСтроки И СтрокаIMAGE.COL = НомерКолонки Тогда
                        НоваяСтрока[ИмяКолонки] = ZIPКаталог + "XL\" + КаталогMEDIA + "\" + СтрокаIMAGE.FILE;
                        Прервать;
                    КонецЕсли;
                КонецЦикла;
               
                // Используется при формировании таблицы на форме обработки.
                ШиринаКолонки = ТаблицаРезультат.Колонки[ИмяКолонки].Ширина;
                ДлинаСтроки    = СтрДлина(СокрЛП(НоваяСтрока[ИмяКолонки]));
                ТаблицаРезультат.Колонки[ИмяКолонки].Ширина = ?(ШиринаКолонки < ДлинаСтроки, ДлинаСтроки, ШиринаКолонки);
               
            КонецЕсли;
           
        КонецЦикла;
       
    КонецЦикла;
   
    // Завершение работы.
    // Закрытие Объектов.
    ДокументDOM = Неопределено;
   
    УдалитьКолонкиСНулевойШириной(ТаблицаРезультат);
   
    Возврат ТаблицаРезультат;
   
КонецФункции

&НаСервере
Функция ПолучитьИмяКаталогаВременныхФайловДляРаспаковкиXLSX()
    Возврат КаталогВременныхФайлов() + "XLSX\";
КонецФункции

&НаСервере
Функция ПредварительнаяОбработкаФайлаXLSX(ФайлEXCEL, ZIPКаталог)
    Перем Файл;
   
    Файл = ПолучитьОбъектФайл(ФайлEXCEL);
    Если Файл = Неопределено Тогда
        Сообщить("Невозможно загрузить данные, т.к. невозможно открыть для чтения файл:
        |" + ФайлEXCEL);
        Возврат Ложь;
    КонецЕсли;
   
    Если НЕ ВРег(Файл.Расширение) = ".XLSX" Тогда
        Сообщить("Файл с расширением " + Файл.Расширение + " не поддерживается методом NativeXLSX:
        |" + ФайлEXCEL);
        Возврат Ложь;
    КонецЕсли;
   
    Если НЕ РаспаковатьXLSXвКаталогВременныхФайлов(ФайлEXCEL, ZIPКаталог) Тогда
        Сообщить("Ошибка распаковки файла.
        |Возможно каталог временных файлов занят.
        |" + ФайлEXCEL);
        Возврат Ложь;
    КонецЕсли;
   
    Возврат Истина;
   
КонецФункции

&НаСервере
Функция ПолучитьОбъектФайл(Знач ФайлEXCEL)
    Перем Файл;
   
    Если НЕ ЗначениеЗаполнено(ФайлEXCEL) Тогда
        Возврат Неопределено;
    КонецЕсли;
   
    Файл = Новый Файл(ФайлEXCEL);
    Если НЕ ФайлСуществуетИДоступен(Файл.ПолноеИмя) Тогда
        Сообщить("Файл не существует/не доступен:
        |" + ФайлEXCEL);
        Возврат Неопределено;
    КонецЕсли;
   
    Возврат Файл;
   
КонецФункции

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

&НаСервере
Функция РаспаковатьXLSXвКаталогВременныхФайлов(ФайлEXCEL, ZIPКаталог)
    Перем ZIPФайл;
   
    Попытка
        УдалитьФайлы(ZIPКаталог);
       
        ZIPФайл = Новый ЧтениеZipФайла;
        ZIPФайл.Открыть(ФайлEXCEL);
        ZIPФайл.ИзвлечьВсе(ZIPКаталог, РежимВосстановленияПутейФайловZIP.Восстанавливать);
        Возврат Истина;
    Исключение
        Возврат Ложь;
    КонецПопытки;
   
    Возврат Истина;
   
КонецФункции

&НаСервере
Функция ПолучитьДокументDOM_NativeXLSX(ФайлSheetXML)
    Перем ЧтениеXML, ПостроительDOM, ДокументDOM;
   
    ЧтениеXML = Новый ЧтениеXML;
    ЧтениеXML.ОткрытьФайл(ФайлSheetXML);
   
    ПостроительDOM = Новый ПостроительDOM;
    Попытка
        ДокументDOM = ПостроительDOM.Прочитать(ЧтениеXML);
        //Сообщить("Версия XML: " + ДокументDOM.ВерсияXML);
    Исключение
        Сообщить(ОписаниеОшибки());
        ДокументDOM = Неопределено;
    КонецПопытки;
   
    // Завершение работы.
    // Закрытие Объектов.
    ЧтениеXML.Закрыть();
   
    Возврат ДокументDOM;
   
КонецФункции

&НаСервере
Функция ПолучитьЭлементыROW_NativeXLSX(Знач ДокументDOM)
    Перем ЭлементыROW;
   
    Попытка
        ЭлементыROW = ДокументDOM.ПолучитьЭлементыПоИмени("row");
    Исключение
        Сообщить(ОписаниеОшибки());
        Возврат Неопределено;
    КонецПопытки;
   
    // Если строки пусты, то они не включаются в список элементов.
    // Если строки пусты и отдельные ячейки содержат оформление (например задан тип "Текст"),
    // то эти строки включаются в список (содержание: пустые).
    Возврат ЭлементыROW;
   
КонецФункции

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

&НаСервере
Функция ПолучитьМассивИменКолонокНаЛистеXLSX(ДокументDOM, ЭлементыROW)
    Перем DIMENSION, ДиапазонДанных, ДиапазонКолонок, ПерваяКолонка, ПоследняяКолонка, НомерПервойК, НомерПоследнейК;
    Перем ЭлементыCOL, Колонка;
    Перем МассивИменКолонокXLSX, КолвоКолонокEXCEL;
   
    // DIMENSION.
    Попытка
        DIMENSION = ДокументDOM.ПолучитьЭлементыПоИмени("DIMENSION");
        ДиапазонДанных     = ЗначениеАтрибутаУзлаDOM(DIMENSION[0], "ref");
        ДиапазонКолонок = ЗаменитьОдниСимволыДругими("0123456789", ДиапазонДанных, "");
        ПерваяКолонка     = Лев(ДиапазонКолонок, Найти(ДиапазонКолонок ,":") - 1);
        ПоследняяКолонка= Сред(ДиапазонКолонок, Найти(ДиапазонКолонок ,":") + 1);
        НомерПервойК    = НомерКолонкиДесятичный(ПерваяКолонка);
        НомерПоследнейК    = НомерКолонкиДесятичный(ПоследняяКолонка);
    Исключение
        НомерПоследнейК = Неопределено;
        Сообщить("Не удалось определить конечную колонку диапазона файла XLSX");
    КонецПопытки;
   
    МассивИменКолонокXLSX = Новый Массив;
   
    ЭлементыCOL = ЭлементыROW[0].ДочерниеУзлы;
    Для Каждого Колонка ИЗ ЭлементыCOL Цикл
        ИмяКолонки = ЗначениеАтрибутаУзлаDOM(Колонка, "r");
        ИмяКолонки = ЗаменитьОдниСимволыДругими("0123456789", ИмяКолонки, "");
        МассивИменКолонокXLSX.Добавить(ИмяКолонки);
    КонецЦикла;
   
    КолвоКолонокEXCEL = МассивИменКолонокXLSX.Количество();
    Если НЕ НомерПоследнейК = Неопределено Тогда
        Если КолвоКолонокEXCEL < НомерПоследнейК Тогда
            Сообщить("Строка заголовков колонок (1-я строка) заполнена не полностью:
            |К-во колонок строки меньше объявленной: " + КолвоКолонокEXCEL + "<" + НомерПоследнейК);
            ДополнитьМассивИменКолонокXLSX(НомерПоследнейК, МассивИменКолонокXLSX);
        ИначеЕсли МассивИменКолонокXLSX.Количество() > НомерПоследнейК Тогда
            Сообщить("Строка заголовков колонок (1-я строка) содержит больше колонок, чем объявлено:
            |К-во колонок строки больше объявленной:" + КолвоКолонокEXCEL + ">" + НомерПоследнейК);
        КонецЕсли;
    КонецЕсли;
   
    Возврат МассивИменКолонокXLSX;
   
КонецФункции

&НаСервере
Функция НомерКолонкиДесятичный(ИмяКолонкиXLSX)
    Перем Латиница, ДлинаНомера, Поз, ит;
    Перем НомерКолонки;
   
    Латиница = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";    // 26.
    ДлинаНомера = СтрДлина(ИмяКолонкиXLSX);
    НомерКолонки = 0;
    Для ит = 1 ПО ДлинаНомера Цикл
        Поз = Найти(Латиница, Сред(ИмяКолонкиXLSX, (ДлинаНомера + 1 - ит), 1));
        НомерКолонки = НомерКолонки + Поз * Pow(26, ит - 1);
    КонецЦикла;
   
    Возврат НомерКолонки;
   
КонецФункции

&НаСервере
Процедура ДополнитьМассивИменКолонокXLSX(Знач КолвоКолонокExcel, МассивИменКолонокXLSX, Индекс = - 1)
    Перем Алфавит, ит, Буква;
   
    Алфавит = РазложитьСтрокуВМассивПодстрок("A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z", ",");
   
    Если МассивИменКолонокXLSX.Количество() >= КолвоКолонокExcel Тогда
        Возврат;
    КонецЕсли;
   
    Если Индекс > Алфавит.Количество() - 1 Тогда
        Возврат;
    КонецЕсли;
   
    Буква = ?(Индекс = -1, "", Алфавит[Индекс]);
    Для ит = 0 ПО Алфавит.Количество() - 1 Цикл
        Если МассивИменКолонокXLSX.Найти(Буква + Алфавит[ит]) = Неопределено Тогда
            МассивИменКолонокXLSX.Добавить(Буква + Алфавит[ит]);
        КонецЕсли;
        Если МассивИменКолонокXLSX.Количество() >= КолвоКолонокExcel Тогда
            Возврат;
        КонецЕсли;
    КонецЦикла;
   
    Если МассивИменКолонокXLSX.Количество() > КолвоКолонокExcel Тогда
        Возврат;
    Иначе
        Индекс = Индекс + 1;
        ДополнитьМассивИменКолонокXLSX(КолвоКолонокExcel, МассивИменКолонокXLSX, Индекс);
    КонецЕсли;
   
    Возврат;
   
КонецПроцедуры

&НаСервере
Функция ИзвлечьДанныеИзФайла_StylesXML(ZIPКаталог, СоответствиеNumFmtIdFormatCode)
    Перем Файл, ДокументDOM, ЭлементыNnumFmts, ЭлементыCellXfs, ЭлементыКоллекции, Элемент;
    Перем МассивNumFmtId, ит;
   
    МассивNumFmtId = Новый Массив;
    СоответствиеNumFmtIdFormatCode = Новый Соответствие;
   
    Файл = Новый Файл(ZIPКаталог + "XL\Styles.xml");
    Если НЕ Файл.Существует() Тогда
        Возврат Новый Массив;
    КонецЕсли;
   
    ДокументDOM = ПолучитьДокументDOM_NativeXLSX(Файл.ПолноеИмя);
   
    Попытка
        ЭлементыNnumFmts = ДокументDOM.ПолучитьЭлементыПоИмени("numFmts");
    Исключение
        Сообщить(ОписаниеОшибки());
        Возврат Новый Массив;
    КонецПопытки;
   
    Если ЭлементыNnumFmts.Количество() > 0 Тогда
        ЭлементыКоллекции = ЭлементыNnumFmts[0].ДочерниеУзлы;
        Для Каждого Элемент ИЗ ЭлементыКоллекции Цикл
            СоответствиеNumFmtIdFormatCode.Вставить(ЗначениеАтрибутаУзлаDOM(Элемент, "numFmtId"), ВРег(ЗначениеАтрибутаУзлаDOM(Элемент, "formatCode")));
        КонецЦикла;
    КонецЕсли;
   
    Попытка
        ЭлементыCellXfs = ДокументDOM.ПолучитьЭлементыПоИмени("cellXfs");
    Исключение
        Сообщить(ОписаниеОшибки());
        Возврат Новый Массив;
    КонецПопытки;
   
    Если ЭлементыCellXfs.Количество() > 0 Тогда
        ЭлементыКоллекции = ЭлементыCellXfs[0].ДочерниеУзлы;
        Для Каждого Элемент ИЗ ЭлементыКоллекции Цикл
            МассивNumFmtId.Добавить(ЗначениеАтрибутаУзлаDOM(Элемент, "numFmtId"));
        КонецЦикла;
    КонецЕсли;
 
    // Проверка сопоставления кодов массива и соответствия.
    // MS Office может не формировать в xml-файле описание стиля форматирования для ячейки.
    // LibreOffice формирует в xml-файле необходимые описания стиля форматирования ячейки.
    Для Каждого ит ИЗ МассивNumFmtId Цикл
        Если СоответствиеNumFmtIdFormatCode.Получить(ит) = Неопределено Тогда
            Если ит = "0" Тогда    // Стандарт для числа (Целое число).
                СоответствиеNumFmtIdFormatCode.Вставить(ит, "GENERAL");
            ИначеЕсли ит = "9" ИЛИ ит = "10" Тогда    // Форматы для % ("0%", "0.00%").
                СоответствиеNumFmtIdFormatCode.Вставить(ит, "0%");
            ИначеЕсли ит = "14" ИЛИ ит = "16" Тогда    // Форматы для даты.
                СоответствиеNumFmtIdFormatCode.Вставить(ит, "DD.MM.YYYY");
            ИначеЕсли ит = "45" ИЛИ ит = "46" ИЛИ ит = "47" Тогда    // Форматы для времени.
                СоответствиеNumFmtIdFormatCode.Вставить(ит, "HH:MM:SS");
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;
   
    Возврат МассивNumFmtId;
   
КонецФункции

&НаСервере
Функция ИзвлечьДанныеИзФайла_SharedStringsXML(ZIPКаталог)
    Перем Файл, ДокументDOM, ЭлементыSharedStrings, ЭлементыКоллекции, Элемент;
    Перем МассивSharedStrings;
   
    // Если в файле EXCEL не содержится значений, имеющих тип "СТРОКА", то файл "SharedStrings.xml" не формируется.
   
    МассивSharedStrings = Новый Массив;
   
    Файл = Новый Файл(ZIPКаталог + "XL\SharedStrings.xml");
    Если НЕ Файл.Существует() Тогда
        Возврат Новый Массив;
    КонецЕсли;
   
    ДокументDOM = ПолучитьДокументDOM_NativeXLSX(Файл.ПолноеИмя);
   
    Попытка
        ЭлементыSharedStrings = ДокументDOM.ПолучитьЭлементыПоИмени("sst");
    Исключение
        Сообщить(ОписаниеОшибки());
        Возврат Новый Массив;
    КонецПопытки;
   
    Если ЭлементыSharedStrings.Количество() > 0 Тогда
        ЭлементыКоллекции = ЭлементыSharedStrings[0].ДочерниеУзлы;
        Для Каждого Элемент ИЗ ЭлементыКоллекции Цикл
            МассивSharedStrings.Добавить(Элемент.ТекстовоеСодержимое);
        КонецЦикла;
    КонецЕсли;
   
    Возврат МассивSharedStrings;
   
КонецФункции

&НаСервере
Функция ИзвлечьДанныеИзФайла_DrawingXML(Знач ZIPКаталог, Знач ФайлНомерЛиста, Знач КаталогMEDIA)
    Перем Файл, ДокументRELS, ЭлементыRELS, НомерDRAWING, ДокументDRAWING, ЭлементыDRAWING, Атрибут, ФайлDRAWING;
    Перем ЭлементыКоллекции1, Элемент1, ЭлементыКоллекции2, Элемент2, ЭлементыКоллекции3, Элемент3;
    Перем ТаблицаIMAGE, НоваяСтрока, СтруктураПараметров, НайденныеСтрокиТЗ, СтрокаТЗ;
   
    // Если в файле EXCEL не содержится значений, имеющих тип "ИЗОБРАЖЕНИЕ", то файл "drawing...xml" не формируется.
   
    ТаблицаIMAGE = Новый ТаблицаЗначений;
    ТаблицаIMAGE.Колонки.Добавить("ID");
    ТаблицаIMAGE.Колонки.Добавить("rID");
    ТаблицаIMAGE.Колонки.Добавить("NAME");
    ТаблицаIMAGE.Колонки.Добавить("ROW");
    ТаблицаIMAGE.Колонки.Добавить("COL");
    ТаблицаIMAGE.Колонки.Добавить("FILE");
   
    Файл = Новый Файл(ZIPКаталог + "XL\WorkSheets\_rels\sheet" + ФайлНомерЛиста + ".xml.rels");
    Если НЕ Файл.Существует() Тогда
        Возврат Новый ТаблицаЗначений;
    КонецЕсли;
   
    ДокументRELS = ПолучитьДокументDOM_NativeXLSX(Файл.ПолноеИмя);
   
    Попытка
        ЭлементыRELS = ДокументRELS.ПолучитьЭлементыПоИмени("Relationships");
    Исключение
        Сообщить(ОписаниеОшибки());
        Возврат Новый ТаблицаЗначений;
    КонецПопытки;
   
    НомерDRAWING = "/Неопределено/";
    Если ЭлементыRELS.Количество() > 0 Тогда
        Элемент1 = ЭлементыRELS[0].ПервыйДочерний;
        НомерDRAWING = ЗначениеАтрибутаУзлаDOM(Элемент1, "Target");    // ="../drawings/drawing2.xml".
        Если Найти(ВРег(НомерDRAWING), ".XML") > 0 Тогда
            НомерDRAWING = СтрЗаменить(НомерDRAWING, "../drawings/drawing", "");
            НомерDRAWING = СтрЗаменить(НомерDRAWING, ".xml", "");
            Попытка
                НомерDRAWING = Число(НомерDRAWING);
            Исключение
                Сообщить("Не удалось получить номер файла Drawing.xml");
            КонецПопытки;
        КонецЕсли;
    КонецЕсли;
   
    Файл = Новый Файл(ZIPКаталог + "XL\Drawings\Drawing" + НомерDRAWING + ".xml");
    Если НЕ Файл.Существует() Тогда
        Возврат Новый ТаблицаЗначений;
    КонецЕсли;
   
    ДокументDRAWING = ПолучитьДокументDOM_NativeXLSX(Файл.ПолноеИмя);
   
    Попытка
        ЭлементыDRAWING = ДокументDRAWING.ПолучитьЭлементыПоИмени("wsDr");
    Исключение
        Сообщить(ОписаниеОшибки());
        Возврат Новый ТаблицаЗначений;
    КонецПопытки;
   
    Если ЭлементыDRAWING.Количество() > 0 Тогда
        ЭлементыКоллекции1 = ЭлементыDRAWING[0].ДочерниеУзлы;
        Для Каждого Элемент1 ИЗ ЭлементыКоллекции1 Цикл
            НоваяСтрока = ТаблицаIMAGE.Добавить();
            ЭлементыКоллекции2 = Элемент1.ДочерниеУзлы;
            Для Каждого Элемент2 ИЗ ЭлементыКоллекции2 Цикл
                ЭлементыКоллекции3 = Элемент2.ДочерниеУзлы;
                Для Каждого Элемент3 ИЗ ЭлементыКоллекции3 Цикл
                    Если Элемент2.ИмяУзла = "xdr:from" Тогда
                        Если Элемент3.ИмяУзла = "xdr:row" Тогда
                            НоваяСтрока.ROW = Число(Элемент3.ТекстовоеСодержимое)+1;
                        КонецЕсли;
                        Если Элемент3.ИмяУзла = "xdr:col" Тогда
                            НоваяСтрока.COL = Число(Элемент3.ТекстовоеСодержимое)+1;
                        КонецЕсли;
                    КонецЕсли;
                    Если Элемент2.ИмяУзла = "xdr:pic" Тогда
                        Если Элемент3.ИмяУзла = "xdr:nvPicPr" И Элемент3.ПервыйДочерний.ИмяУзла = "xdr:cNvPr" Тогда
                            НоваяСтрока.ID = ЗначениеАтрибутаУзлаDOM(Элемент3.ПервыйДочерний, "id");
                            НоваяСтрока.NAME = ЗначениеАтрибутаУзлаDOM(Элемент3.ПервыйДочерний, "name");
                        КонецЕсли;
                        Если Элемент3.ИмяУзла = "xdr:blipFill" И Элемент3.ПервыйДочерний.ИмяУзла = "a:blip" Тогда
                            НоваяСтрока.rID = ЗначениеАтрибутаУзлаDOM(Элемент3.ПервыйДочерний, "r:embed");
                        КонецЕсли;
                    КонецЕсли;
                КонецЦикла;
            КонецЦикла;
        КонецЦикла;
    КонецЕсли;
   
    Файл = Новый Файл(ZIPКаталог + "XL\Drawings\_rels\Drawing" + НомерDRAWING + ".xml.rels");
    Если НЕ Файл.Существует() Тогда
        Возврат Новый ТаблицаЗначений;
    КонецЕсли;
   
    ДокументRELS = ПолучитьДокументDOM_NativeXLSX(Файл.ПолноеИмя);
   
    Попытка
        ЭлементыRELS = ДокументRELS.ПолучитьЭлементыПоИмени("Relationships");
    Исключение
        Сообщить(ОписаниеОшибки());
        Возврат Новый ТаблицаЗначений;
    КонецПопытки;
   
    Если ЭлементыRELS.Количество() > 0 Тогда
        ЭлементыКоллекции1 = ЭлементыRELS[0].ДочерниеУзлы;
        Для Каждого Элемент1 ИЗ ЭлементыКоллекции1 Цикл
            Атрибут = ЗначениеАтрибутаУзлаDOM(Элемент1, "Id");
            ФайлDRAWING = ЗначениеАтрибутаУзлаDOM(Элемент1, "Target");
            СтруктураПараметров = Новый Структура("rID", Атрибут);
            НайденныеСтрокиТЗ = ТаблицаIMAGE.НайтиСтроки(СтруктураПараметров);
            Если Найти(ФайлDRAWING, "../"+КаталогMEDIA+"/") > 0 Тогда
                Для Каждого СтрокаТЗ ИЗ НайденныеСтрокиТЗ Цикл
                    СтрокаТЗ.File = СтрЗаменить(ФайлDRAWING, "../"+КаталогMEDIA+"/", "");
                КонецЦикла;
            Иначе
                Сообщить("Преобразование имени файла не произведено: " + ФайлDRAWING);
            КонецЕсли;
        КонецЦикла;
    КонецЕсли;

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

&НаСервере
Функция ЭтоЧислоXLSX(Знач ЗначениеЯчейки, Знач ФорматСтиля)
   
    Если ( ВРег(ФорматСтиля) = "GENERAL"
        ИЛИ ВРег(ФорматСтиля) = "STANDARD"
        ИЛИ Найти(ФорматСтиля, "0") > 0 )
        Тогда
        Возврат Истина;
    КонецЕсли;
   
    Возврат Ложь;
   
КонецФункции

&НаСервере
Функция ЭтоПроцентXLSX(Знач ЗначениеЯчейки, Знач ФорматСтиля)
   
    Если ( Найти(ФорматСтиля, "%") > 0 )
        Тогда
        Возврат Истина;
    КонецЕсли;
   
    Возврат Ложь;
   
КонецФункции

&НаСервере
Функция ЭтоБулевоXLSX(ЗначениеЯчейки, ФорматСтиля)
   
    Если (ЗначениеЯчейки = 0 ИЛИ ЗначениеЯчейки = 1)
        И Найти(ВРег(ФорматСтиля), "ИСТИНА") > 0 ИЛИ Найти(ВРег(ФорматСтиля), "ЛОЖЬ") > 0
        ИЛИ Найти(ВРег(ФорматСтиля), "TRUE") > 0 ИЛИ Найти(ВРег(ФорматСтиля), "FALSE") > 0
        Тогда
        Возврат Истина;
    КонецЕсли;
   
    Возврат Ложь;
   
КонецФункции

&НаСервере
Функция ЭтоДатаXLSX(Знач ЗначениеЯчейки, Знач ФорматСтиля)
   
    Если ЗначениеЯчейки = Цел(ЗначениеЯчейки) И
        ( Найти(ФорматСтиля, "DD") > 0
        ИЛИ Найти(ФорматСтиля, "MM") > 0
        ИЛИ Найти(ФорматСтиля, "YY") > 0
        ИЛИ Найти(ФорматСтиля, "QQ") > 0
        ИЛИ Найти(ФорматСтиля, "WW") > 0 )
        Тогда
        Возврат Истина;
    КонецЕсли;
   
    Возврат Ложь;
   
КонецФункции

&НаСервере
Функция ЭтоВремяXLSX(Знач ЗначениеЯчейки, Знач ФорматСтиля)
   
    Если ЗначениеЯчейки < 1 И
        ( Найти(ФорматСтиля, "HH:") > 0
        ИЛИ Найти(ФорматСтиля, "[HH]:") > 0
        ИЛИ Найти(ФорматСтиля, "[H]:") > 0
        ИЛИ Найти(ФорматСтиля, "MM:") > 0
        ИЛИ Найти(ФорматСтиля, ":SS") > 0 )
        Тогда
        Возврат Истина;
    КонецЕсли;
   
    Возврат Ложь;
   
КонецФункции

&НаСервере
Функция КонвертироватьЧислоXLSXвДату(Знач Число)
    Перем Дата1900, Разница, ДатаРезультат;
   
    Дата1900 = Дата("19000101");
   
    Разница = Число - 2;    // EXCEL ошибочно считает 1900-й год високосным.
    Разница = ?(Разница < 0, 0, Разница);
   
    ДатаРезультат = Дата1900 + Разница * 24 * 60 * 60;
   
    Возврат ДатаРезультат;
   
КонецФункции

&НаСервере
Функция КонвертироватьЧислоXLSXвДатуВремя(Знач Число)
    Перем КВоСекунд;
    Перем ВремяРезультат;
   
    // 0,0000115740740740741 = 1 сек.
    // 1                     = 24 часа 00 мин 00 сек.
   
    Если ТипЗнч(Число) = Тип("Число") Тогда
        КВоСекунд = Число * 100000 / 1.15740740740741;
        КВоСекунд = Окр(КВоСекунд);
    Иначе
        Сообщить("Ошибка определения значения типа ""Время"".");
 
   КонецЕсли;
   
    ВремяРезультат = Дата("19000101000000") + КВоСекунд;
   
    Возврат ВремяРезультат;
   
КонецФункции

&НаСервере
Функция ПолучитьЧислоВСтепениИзСтроковогоЗначения(Знач ЗначениеЯчейки)
    Перем Поз1Е, Степень;
    Перем Значение;
   
    Если Найти(ЗначениеЯчейки, "E-") > 0 Тогда
        Поз1Е = Найти(ЗначениеЯчейки, "E-");
        Степень = Сред(ЗначениеЯчейки, Поз1Е+2);
        Значение = Лев(ЗначениеЯчейки, Поз1Е-1);
        Попытка
            Степень = Число(Степень);
            Значение = Число(Значение) / Pow(10, Степень);
        Исключение
            Значение = ЗначениеЯчейки;
        КонецПопытки;
    ИначеЕсли Найти(ЗначениеЯчейки, "E+") > 0 Тогда
        Поз1Е = Найти(ЗначениеЯчейки, "E+");
        Степень = Сред(ЗначениеЯчейки, Поз1Е+2);
        Значение = Лев(ЗначениеЯчейки, Поз1Е-1);
        Попытка
            Степень = Число(Степень);
            Значение = Число(Значение) * Pow(10, Степень);
        Исключение
            Значение = ЗначениеЯчейки;
        КонецПопытки;
    Иначе
        Значение = ЗначениеЯчейки;
    КонецЕсли;
   
    Возврат Значение;
   
КонецФункции

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

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

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

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


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

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

Комментарии
Избранное Подписка Сортировка: Древо развёрнутое
Свернуть все
1. StepByStep 3355 02.09.14 14:53 Сейчас в теме
Чтение файла XLSX средствами 1С. ПостоительDOM
Прикрепленные файлы:
ЗагрузитьМетодом_NativeXLSX_ПостроительDOM.txt
RibD; grachev1c; bendarik; chemezov; Pavel_nv; jaroslav.h; kuzyara; +7 Ответить
2. monkbest 108 17.09.14 14:54 Сейчас в теме
Я извиняюсь, а можно в статью написать текст с описанием. А то кроме цитаты из мстителей слов-то и нет:)

По листнингу понять, что рассказывается в статье - сложно. Скомкали все. Дали ссылки на пять статей, в которых та же каша, процитировали. Кроме заголовка ни одного информативного слова нет.
3. StepByStep 3355 17.09.14 17:34 Сейчас в теме
(2) monkbest,
Добавил небольшое описание.
СПАСИБО.
4. arasn 17.09.14 17:12 Сейчас в теме
5. DragEugen 24.09.14 13:54 Сейчас в теме
если бы было с описанием всех функций то вообще бы цены небыло
6. monkbest 108 24.09.14 14:18 Сейчас в теме
так это же получается клевая штука. Читаем ексель без екселя. очень удобно будет для случаев, когда нет возможности создать ОЛЕ оъект екселя в силу его отсутствия или же недостаточности прав

11. Ivon 640 12.11.14 16:44 Сейчас в теме
(6) monkbest, Читать эксель без экселя можно и с помощью ADO. И быстрее, и код меньше, и читать можно файлы любых версий.
ARkiller; +1 Ответить
12. StepByStep 3355 25.11.14 22:18 Сейчас в теме
7. Drizer2000 14 25.09.14 13:29 Сейчас в теме
А этот метод обрабатывает только файлы с расширением XLSX, а обычный xls умеет?
8. awk 714 07.10.14 18:18 Сейчас в теме
(7) Drizer2000, Докумены Microsoft Office с некоторых пор хранятся в формате xml. И сжаты zip.
StepByStep; +1 Ответить
9. awk 714 07.10.14 18:19 Сейчас в теме
(7) Drizer2000, xls хранятся не в zip/xml.
10. hazd 12.10.14 01:07 Сейчас в теме
интересный подход, но как-то все сложно описано, сохраню в блокнот, время будет, разберу.
13. Soikalv 16.12.14 15:02 Сейчас в теме
Интересно. на досуге разберусь.
Как много нам открытий чудных готовит внедрение новых платформ 1с. Вот перехожу на тройку и радуюсь ища новые обработки для тройки.а так хорошо все было настроено в 8.1. и 8.2. Так и не поняла из статьи, эта обработка - то,что я ищу или нет. В 8.2. была типовая внешняя обработка с диска ИТС для загрузки данных из таблиц икселя в любой табличный документ. Целые базы грузили, очень удобно было..
14. StepByStep 3355 17.12.14 15:48 Сейчас в теме
(13) Soikalv,
Обработка, в которой применяется функционал этой статьи: http://infostart.ru/public/120961/
Обработка построена по-другому, если сравнивать ее с обработкой с ИТС.
15. kuzyara 1029 26.12.14 05:21 Сейчас в теме
При применении на практике мне нужна была просто ТаблицаЗначений, идентичная натуральной, доработал несколько моментов:
Во-первых, убрал разделитель разрядов во всех числах которые приводятся к строке, по-моему здесь типизация - лишнее.
Во-вторых, убрал первые три колонки: "НомерСтроки", "Сопоставлено", "УровеньГруппировки".
В-третьих, МассивИменКолонокXLSX определяется по первой строке, пришлось написать свою функцию ДесятичныйВНомерКолонки(х):
Функция ДесятичныйВНомерКолонки(Знач НомерКолонки)
	Перем Латиница, ДлинаНомера, Поз, ит;
	Латиница = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";	// 26.
             // 1   5    0    5    0    5
	
	целое = НомерКолонки;
	слово="";
	
	Пока Целое>0 Цикл
		НовЦелое=Цел(Целое/26);
		
		остаток = Целое%26;
		
		Буква = Сред(Латиница, остаток, 1);
		слово = Буква+слово;
		Целое=НовЦелое;
	КонецЦикла;	
	
	Возврат слово;
	
КонецФункции
Показать


В целом метод рабочий, автору большая благодарность.
18. StepByStep 3355 14.01.15 10:25 Сейчас в теме
(15) kuzyara,
Удачного применения.
16. Cyberhawk 118 28.12.14 12:17 Сейчас в теме
Подскажите, пожалуйста, можно ли в вашей "подсистеме" (назвал так прилагаемый к публикации набор процедур и функций) узнавать цвет фона ячейки xlsx-файла? Если да, то в какой процедуре / функции из прилагаемых это можно сделать?
17. kuzyara 1029 29.12.14 09:16 Сейчас в теме
(16) Cyberhawk, принципиальной сложности в разборе https://en.wikipedia.org/wiki/Microsoft_Office_XML_formats нет.
19. StepByStep 3355 14.01.15 10:28 Сейчас в теме
(16) Cyberhawk,
При распаковке должен сформироваться файл styles.xml, в котором описаны используемые форматы.
20. pedchenko32 14.01.15 15:41 Сейчас в теме
Добрый день! Почему, если в файле xlsx 1 лист, возникает ошибка файл не обнаружен ...sheet2.xml? Если создать 2й лист, с таким же содержимым, считывание происходит...
23. StepByStep 3355 25.02.15 13:58 Сейчас в теме
(20) pedchenko32, (21) pedchenko32, (22) pedchenko32,
1. "sheet2.xml" - не сталкивался.
2. "ячейка пустая" - ЗначениеЗаполнено(ЗначениеЯчейки).
3. "строки с оформлением" - Конкретно это не интересовало. Если строки пусты - то написать доп процедуру.
21. pedchenko32 14.01.15 17:04 Сейчас в теме
и еще вопрос, как определить в этом случае, что ячейка пустая?
22. pedchenko32 14.01.15 17:22 Сейчас в теме
или как сделать, чтобы строки с оформлением тоже не включались в таблицу значений?
24. Жолтокнижниг 250 17.03.15 12:27 Сейчас в теме
Необходимо поправить загрузку SharedStrings
иногда встречаются подобные конструкции:
<si><r><t>mail@mail.ru</t></r><r><rPr><sz val="10"/><color rgb="FF000000"/><rFont val="Arial"/><family val="2"/><charset val="204"/></rPr><t xml:space="preserve">  </t></r><r><rPr><sz val="10"/><color rgb="FF909090"/><rFont val="Arial"/><family val="2"/><charset val="204"/></rPr><t> </t></r></si>

За счет этого сбивается нумерация.
Если SharedStrings.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда  
МассивSharedStrings.Добавить(Строка);
КонецЕсли;

мое исправление ситуации
25. tyfmyl 21.03.16 14:40 Сейчас в теме
Добавте в параметры функции разрядность округления - Окр(). Excel при чтении данных при выгрузке полей не форматированных представляет некоторые числа в виде бесконечной десятичной дроби с "9" ой на конце.
Из справки известно, что excel хранит числа в 8 байтах. Для округления достаточно 14 цифр разрядов.
26. wtlz 150 09.01.20 21:41 Сейчас в теме
Добрый день! Спасибо большое за качественные методы чтения EXCEL - использовал уже не раз.
Столкнулся с файлом на десятки тысяч строк, проблема на цикле:
Для Каждого Элемент ИЗ ЭлементыКоллекции Цикл
МассивSharedStrings.
Добавить(Элемент.ТекстовоеСодержимое);
КонецЦикла;

может есть идеи, как ускорить чтение значений?
Оставьте свое сообщение

См. также

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

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

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

15.01.2019    21592    0    itriot11    23    

Конвертация данных 2. Использование подключаемых обработок в правилах обмена. Конвертация дерева значений

Обмен данными 1С Обмен через XML Перенос данных из 1C8 в 1C8 v8 КД Бесплатно (free)

Разработка правил обмена с использованием подключаемых обработок. В качестве примера рассмотрена реальная задача конвертации дерева значений.

15.06.2020    2225    0    Drivingblind    6    

Групповая обработка контейнеров сертификатов ЭЦП

Универсальные обработки Файловые протоколы обмена, FTP v8 v8::УФ 1cv8.cf Россия Бесплатно (free)

Внешняя обработка для просмотра списка установленных на локальном компьютере контейнеров сертификатов ЭЦП, с возможностью групповой обработки: копирования, установки сертификатов, отправки на EMAIL или FTP.

25.05.2020    1543    0    independ    2    

[БСП] Обмен через Конвертацию данных 2.1

Обмен через XML v8 1cv8.cf Бесплатно (free)

Добавим новый план обмена и настроим в БСП типовой обмен через правила конвертации данных (КД 2.1)

03.02.2020    6609    0    John_d    16    

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

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

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

11.04.2019    34875    0    bolefirenko    116    

Удаление из файла эксель ненужных страниц средствами 1С без COM и через COM

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

Как средствами 1С из файла эксель удалить ненужные листы без COM и с ним. Я разрабатывал на платформе 1С:Предприятие 8.3 (8.3.14.1694)

28.01.2020    2290    0    pavel_pss    12    

Обмен через Конвертацию данных 2.1 во внешней обработке + Запуск внешней обработки по расписанию (БСП)

Обмен через XML v8 1cv8.cf Бесплатно (free)

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

22.01.2020    5259    0    John_d    30    

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

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

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

21.01.2020    21373    295    cprit    94    

Из Excel в 1С запросом Промо

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

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

14.08.2018    19305    0    m-rv    5    

Как сделать обмен данными через универсальный формат быстрее? Реализация многопоточного обмена данными

Обмен данными 1С Обмен через XML v8 1cv8.cf Бесплатно (free)

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

31.12.2019    7409    0    ids79    17    

Использование XML-схемы из макета внешней обработки

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

Простой способ использования XML-схем из макета внешней обработки.

28.10.2019    10022    0    Olesia_Matusevich    10    

Преобразование XML в таблицу значений или иной объект 1С методом XSL преобразования

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

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

24.10.2019    10038    0    kraspila    28    

Регулярные выражения без внешних компонент? Легко! Промо

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

Сложный способ организовать проверку строки с помощью регулярного выражения в 1С. При этом ни одна внешняя компонента не пострадала. Ну и от платформы (Linux, MustDie) - не зависит.

04.03.2016    60324    0    starik-2005    99    

Обертка функций Excel на русском. Ускорение процесса разработки.

Загрузка и выгрузка в Excel Универсальные функции v8 Бесплатно (free)

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

24.10.2019    6767    0    DmitryKotov    6    

Практика XDTO. Нюансы

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

Некоторые практические моменты работы с XDTO. Дополнения к очевидному.

23.09.2019    11978    0    Yashazz    27    

Запись/Чтение XML, пример обмена по COM соединению

Обмен через XML v8 1cv8.cf Россия Бесплатно (free)

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

08.09.2019    10528    0    user5300    7    

Приемы обработки больших данных в 1С Промо

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

Рассказ об эффективных приемах организации обработок больших объемов данных на платформе 1С

07.08.2015    65718    0    tormozit    27    

Новости для пользователей

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

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

05.08.2019    12303    20    sapervodichka    18    

Загрузка картинок в справочники (Универсальная загрузка из табличного документа)

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

Пример загрузки картинок в справочник Номенклатура (с помощью обработки универсальная загрузка данных из табличного документа). Проверялось на конфигурации УТ 11.4.7.

28.05.2019    7092    0    rasdag    5    

Программное создание xml (а можно и HTML) на основе xml схемы (XSD), через фабрику XDTO

Обмен через XML v8 1cv8.cf Бесплатно (free)

Объект XDTO, Фабрика XDTO, ПакетXDTO - как же это все сложно, или нет?

20.05.2019    9389    0    Eret1k    12    

Обработка, делающая все хорошо Промо

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

Обработка, делающая все хорошо. Кроме шуток.

25.12.2015    25076    14    GROOVY    57    

Конвертация 3.0. Пример доработки: два справочника в один

Обмен через XML v8 КД ERP2 БП3.0 Россия Бесплатно (free)

Доработка правил конвертации путем расширения конфигурации: номенклатура и характеристика (ERP) в номенклатуру (БП).

15.05.2019    7295    0    forusing    4    

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

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

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

18.04.2019    25747    9    Eret1k    43    

RabbitMQ + Конвертация Данных 3.0

Внешние источники данных Обмен через XML Интеграция Перенос данных из 1C8 в 1C8 v8 КД Бесплатно (free)

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

21.03.2019    24469    0    barelpro    82    

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

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

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

06.04.2015    232334    0    StepByStep    75    

Повторение строк заголовка на каждой странице при обработке файлов Excel средствами платформы 1С:Предприятие

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

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

23.01.2019    6210    0    senshkr    3    

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

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

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

14.01.2019    20393    0    starik-2005    25    

Как легко загружать данные из электронных таблиц (Excel, OpenOffice и т.д)

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

Как легко загружать данные из электронных таблиц (Excel, OpenOffice и т.д). На примере загрузки в табличную часть документа Поступление товаров и услуг в УТ 11.4.

09.01.2019    12056    0    rasdag    14    

Отладка правил обмена 7.7, 8 Промо

Перенос данных из 1С7.7 в 1C8.X Обмен через XML Перенос данных из 1C8 в 1C8 v8 КД Бесплатно (free)

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

29.10.2013    50967    0    pyrkin_vanya    70    

EnterpriseData – часть 2. Процесс выгрузки данных

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

Основные этапы выгрузки данных через ED, обработчики событий выгрузки, правила обработки данных, правила конвертации объектов, конвертация свойств первого и второго этапов, процедуры БСП, используемые при выгрузке данных, структура «КомпонентыОбмена».

26.12.2018    24757    0    ids79    31    

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

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

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

14.12.2018    37811    0    ids79    72    

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

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

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

16.11.2018    34192    0    ids79    40    

Обмен по расписанию типовыми средствами. Промо

Распределенная БД (УРИБ, УРБД) Обмен через XML Перенос данных из 1C8 в 1C8 v8 1cv8.cf Россия Бесплатно (free)

Часто перед интеграторами стоит задача организовать автообмен (по расписанию или при наступлении какого-либо события) данными между различными конфигурациями. В этой статье я попробую изложить простую инструкцию, как это можно сделать средствами, заложенными в типовые конфигурации 1С (ЗУП, БП, УПП и т.д.). Для обмена используется подсистема "Обмен данными" из БСП

20.06.2012    101644    0    kser87    52    

Работа с Excel через COM

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

Несколько примеров работы с excel (ms office 2010, в моем случае) через COM.

01.10.2018    9588    0    jaroslav.h    0    

Выгрузка в Excel с использованием формата OpenXML, разбор файла sheet1.xml

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

Судя по количеству просмотров темы https://infostart.ru/public/900022/ решил описать структуру файла Листа excel. На полноту не претендую, опишу то, что знаю.

21.09.2018    7396    0    user1045404    2    

Excel: создание в формате xlsx без COM технологии

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

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

10.09.2018    10909    0    user1045404    16    

"Однопальцевое" чтение XML для 8.2 Промо

Обмен через XML v8 1cv8.cf Россия Бесплатно (free)

Простенькое чтение XML файлов или строки произвольной структуры и неограниченной вложенности. Простая и управляемая формы.

18.04.2011    45237    0    anig99    67    

Свертка номенклатуры при выгрузке из Управления Торговлей 11 в Бухгалтерию 3.0

Обмен через XML v8 БП3.0 УТ11 БУ УУ Бесплатно (free)

Свертка номенклатуры при выгрузке из УТ 11 в Бухгалтерию 3. Используется типовой обмен на базе EnterpriseData

20.07.2018    10003    0    Kutuzov    3    

Маркировка ячеек цветом. Отладка загрузки данных из эксель.

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

После 100-ой кривой загрузки родился способ, как отладить алгоритм.

05.07.2018    8988    0    Rustig    7    

Обмен через универсальный формат. Пример нестандартной конвертации данных

Обмен через XML Перенос данных из 1C8 в 1C8 v8 УТ11 Россия Бесплатно (free)

В статье описан небольшой пример обмена данными через EnterpriseData без снятия конфигурации с поддержки. Тестовая площадка: Управление торговлей, редакция 11 (11.4.3.126), версия платформы 8.3.11

18.06.2018    33570    0    artkor    12    

Линия жизни Промо

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

Отображает линию жизни за период во времени по декадам. Линия указывает на подъемы и падения общего характера (дом, работа, учеба, социальное, финансовое положение) не касаясь здоровья.

17.05.2009    17852    0    Svetozor    20    

Создание множественного дополнительного реквизита. Управление торговлей 11

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

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

20.03.2018    15041    0    bad_wag    19    

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

Обмен через XML v8 КД Бесплатно (free)

Довольно часто встречается задача выгрузить при помощи «Конвертация данных, редакция 2.1» контактной информации контрагента из «Управление торговлей", редакция 10.3» в «Бухгалтерия предприятия, редакция 3.0». Сложность заключается в том, что в УТ контактная информация хранится в регистре сведений, а в БП - в табличной части справочника «Контрагенты». Предлагаю мое, достаточно простое, решение данной задачи.

11.12.2017    21263    0    Nicholas    10    

Загрузка из EXCEL в 1С. MS ADODB.Connection Промо

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

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

30.11.2012    143686    0    StepByStep    89    

1С: Конвертация данных 3. Инструкции и примеры. EnterpriseData (универсальный формат обмена)

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

Что такое КД3? Как начать использовать? Полезные дополнения к документации. Что нужно исправить в типовых обработках и конфигурации. Как изменить правила обмена не снимая конфигурацию с поддержки. Как отлаживать правила обмена?

19.11.2017    182238    0    MaxS    285    

Функция сохранения картинок из книги Excel в каталог с определением координат на листе

Загрузка и выгрузка в Excel Универсальные функции v8 Бесплатно (free)

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

12.11.2017    10375    0    user634820_zergemoth    1    

Работа с Excel

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

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

23.10.2017    40890    0    arakelyan    39    

Альтернативные способы работы с XML. Часть 2: Введение в xPath или запросы к XML Промо

Обмен через XML Математика и алгоритмы v8 1cv8.cf Бесплатно (free)

В предыдущей статье "Введение в DOM или объектная модель документа" было описано понятие объектной модели документа (DOM), раскрыты плюсы и минусы использования модели при разборе файлов XML, приведено сравнение с построчным последовательным разбором. Были представлены варианты выборки данных с помощью объекта 1С ДокументDOM. Теперь настало время познакомить читателей с самым, на мой взгляд, интересным способом извлечения данных из XML - при помощи языка запросов xPath.

09.08.2012    41681    0    1cspecialist    13    

Что такое конвертация данных 1С (статья написана исключительно для новичков)

Обмен через XML Перенос данных из 1C8 в 1C8 v8 КД Бесплатно (free)

О том, что "Конвертация данных" - мощный инструмент и прочую терминологию, вы прочтёте в любом источнике. Я хочу поделиться кратким пояснением как пользоваться данной конфигурацией. Речь пойдет о версии 2.1.

07.08.2017    36520    0    perepetulichka    38