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

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

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

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

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

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

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


Методы загрузки из внешнего источника:
- Метод "MS ADO" (Чтение файлов xls, xlsx средствами Microsoft ADO): //shop.azhur-c.ru/public/163640/
- Метод "MS EXCEL" (Чтение файлов xls, xlsx с картинками средствами Microsoft Office): //shop.azhur-c.ru/public/163641/
- Метод "LO CALC" (Чтение файлов xls, xlsx, ods, sxc с картинками средствами LibreOffice): //shop.azhur-c.ru/public/163642/
- Метод "NativeXLSX" (Чтение файлов xlsx с картинками средствами 1С. ПостроительDOM): //shop.azhur-c.ru/public/300092/
- Метод "NativeXLSX". Предыдущий вариант (Чтение файлов xlsx средствами 1С. ЧтениеXML):
//shop.azhur-c.ru/public/225624/
- Метод "Excel1C" (Загрузка на платформе 8.3.6 с картинками. Чтение файлов xls, xlsx, ods): //shop.azhur-c.ru/public/341855/
- Список листов файла: //shop.azhur-c.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 Тогда
            МассивПустыхКолонок.Добавить(Колонка.Имя);
        КонецЕсли;
    КонецЦикла;
   
    // Удалим пустые колонки.
    Для Каждого ПустаяКолонка ИЗ МассивПустыхКолонок Цикл
        ТаблицаРезультат.Колонки.Удалить(ПустаяКолонка);
    КонецЦикла;

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


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

100

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

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

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

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


В целом метод рабочий, автору большая благодарность.
18. StepByStep 3268 14.01.15 10:25 Сейчас в теме
(15) kuzyara,
Удачного применения.
16. Cyberhawk 115 28.12.14 12:17 Сейчас в теме
Подскажите, пожалуйста, можно ли в вашей "подсистеме" (назвал так прилагаемый к публикации набор процедур и функций) узнавать цвет фона ячейки xlsx-файла? Если да, то в какой процедуре / функции из прилагаемых это можно сделать?
17. kuzyara 811 29.12.14 09:16 Сейчас в теме
(16) Cyberhawk, принципиальной сложности в разборе https://en.wikipedia.org/wiki/Microsoft_Office_XML_formats нет.
19. StepByStep 3268 14.01.15 10:28 Сейчас в теме
(16) Cyberhawk,
При распаковке должен сформироваться файл styles.xml, в котором описаны используемые форматы.
20. pedchenko32 14.01.15 15:41 Сейчас в теме
Добрый день! Почему, если в файле xlsx 1 лист, возникает ошибка файл не обнаружен ...sheet2.xml? Если создать 2й лист, с таким же содержимым, считывание происходит...
23. StepByStep 3268 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. Жолтокнижниг 249 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 цифр разрядов.
Оставьте свое сообщение

См. также

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

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

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

28.10.2019    1794    OlesiaM    10       

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

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

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

24.10.2019    2729    kraspila    25       

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

Статья Программист Нет файла v8 Windows Бесплатно (free) Загрузка и выгрузка в Excel Универсальные функции

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

24.10.2019    2003    DmitryKotov    6       

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

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

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

23.09.2019    3939    Yashazz    24       

Чтение файлов PDF из 1С 10

Инструменты и обработки Программист Внешняя обработка (ert,epf) v8 1cv8.cf Windows Бесплатно (free) Внешние источники данных Универсальные обработки

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

09.09.2019    2802    3    da_1c    3       

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

Статья Программист Нет файла v8 1cv8.cf Россия Бесплатно (free) Обмен через XML

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

08.09.2019    1675    user5300    6       

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

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

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

28.05.2019    2585    rasdag    2       

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

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

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

15.05.2019    3513    forusing    4       

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

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

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

18.04.2019    12990    9    Eret1k    43       

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

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

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

21.03.2019    14637    barelpro    82       

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

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

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

15.01.2019    11297    itriot11    21       

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

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

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

14.01.2019    12401    starik-2005    24       

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

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

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

09.01.2019    7176    rasdag    14       

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

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

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

26.12.2018    13540    ids79    27       

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

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

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

14.12.2018    22816    ids79    72       

MDM система для централизованного управления справочниками предприятия типовыми средствами 7

Статья Системный администратор Программист Нет файла v8 1cv8.cf Бесплатно (free) Обработка справочников Обмен через XML

Поставили мне пару недель назад задачу настроить единые справочники номенклатуры во всех базах холдинга. Учитывая количество 1С бухгалтерий, которых в процессе выполнения задачи оказалось 32, и учитывая, что они все разных версий (2.0, 3.0, отраслевые), задача казалась из ряда чистой воды подстава. Но решение с технической точки зрения оказалось простейшим.

27.11.2018    3617    lopatin    5       

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

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

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

16.11.2018    20123    ids79    20       

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

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

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

01.10.2018    5472    jaroslav.h    0       

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

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

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

21.09.2018    4384    user1045404    2       

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

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

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

10.09.2018    7956    user1045404    16       

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

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

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

14.08.2018    14087    m-rv    5       

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

Статья Программист Нет файла v8 БП3.0 УТ11 БУ УУ Бесплатно (free) Обмен через XML

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

20.07.2018    6948    Kutuzov    2       

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

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

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

18.06.2018    23408    artkor    12       

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

Статья Программист Нет файла v8 КД Бесплатно (free) Обмен через XML

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

11.12.2017    15524    Nicholas    9       

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

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

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

19.11.2017    142030    MaxS    251       

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

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

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

12.11.2017    7384    user634820_zergemoth    1       

Работа с Excel 297

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

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

23.10.2017    26665    arakelyan    39       

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

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

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

07.08.2017    30231    perepetulichka    33       

Перенос данных из базы с поврежденными таблицами 15

Статья Системный администратор Программист Нет файла v8 БП2.0 Казахстан БУ УУ Бесплатно (free) Тестирование и исправление Обмен через XML Перенос данных из 1C8 в 1C8

У клиента что-то произошло с жестким диском, что потребовало восстановления данных на нем. Базу 1С вроде бы сохранили, и она даже открылась. Однако при попытке доступа к документу "Платежный ордер, списание денежных средств" база вылетает с ошибкой. Также при получении оборотов за период в целом и по декадам выводились разные цифры. Обработка переноса данных в идентичную конфигурацию не подошла, из-за того, что так же вылетала с ошибкой БД. Ниже опишу мои действия по созданию новой конфигурации.

06.06.2017    12730    ermek6    14       

Почему при загрузке таблицы Excel в 1С возникают ошибки? 9

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

При загрузке из EXCEL в 1С методом MS ADODB.Connection столкнулся с некоторыми проблемами, которые попытался устранить в ниже приведенной статье. Надеюсь, что статья поможет вам сократить время разработки.  Особая благодарность Андрею М. за публикацию //infostart.ru/public/163640/

28.04.2017    12698    dakork    4       

Работа со схемой XML в модуле обмена от Битрикс 18

Статья Программист Нет файла v8 1cv8.cf Бесплатно (free) Обмен через XML

Пошаговое руководство «Как добавить поле для выгрузки в модуль обмена для битрикс» Анамнез: УПП 1.3 (Полиграфия, но не суть важно); модуль обмена 1С-Битрикс 5.0.0.5. Допустим, нам нужно добавить в структуру XML-файла поле «Основной менеджер». Поверхностный анализ модуля обмена дает нам информацию о том, что используется пространство имен «urn:1C.ru:commerceml_2».

28.12.2016    11317    ogroup    6       

Загрузка значений свойств номенклатуры в Альфа-Авто с использованием обработки загрузки данных из табличного документа 15

Статья Программист Руководитель проекта Нет файла v8 1cv8.cf Автомобили, автосервисы Россия УУ Windows Учет ТМЦ Бесплатно (free) Загрузка и выгрузка в Excel

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

13.10.2016    14455    miavolas    15       

Решение проблемы медленной загрузки из файла Excel, защищенного паролем 11

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

Столкнулся с проблемой загрузки из файла Excel. Загрузка занимала около получаса и не всегда заканчивалась успешно. Решение проблемы изложу в данной статье.

27.09.2016    8141    HAMMER_59    4       

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

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

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

04.03.2016    52571    starik-2005    90       

Быстрая выгрузка больших плоских отчетов в Excel 22

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

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

29.11.2015    13161    matveev.andrey.v    17       

Экспорт нескольких MXL таблиц в один XLS файл, на отдельные листы. Простой алгоритм 20

Статья Программист Нет файла v7.7 v8 Windows Бесплатно (free) Практика программирования Загрузка и выгрузка в Excel

Статья посвящена распространённому вопросу - как сохранить несколько таблиц (отчетов) в формате MXL, с которым работает 1С, на отдельные листы одного Excel файла. Освещается простой алгоритм решения проблемы штатными средствами, без использования внешних модулей и библиотек (не относящихся к 1С и Excel).

23.11.2015    14168    etmarket    14       

XDTO на службе у лентяев. Самый простой способ чтения xml 122

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

Это статья для лентяев. Никаких описаний свойств и методов xdto здесь нет. Тем более здесь нет описания формата xml. Здесь лишь простой и удобный метод чтения xml для тех, кому нужно получить быстрый результат без углубления в теоретические дебри.

03.11.2015    25999    Ks_83    29       

Отладка конвертации данных 2.1 в конфигурациях, построенных на БСП 2.1 (БП 3.0, УТ 11 etc.) 49

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

Отладка процесса выгрузки/загрузки данных при проведении синхронизации в новых конфигурациях 1С может вызвать (у меня вызвала) некоторые затруднения. О них и пойдёт речь.

29.10.2015    32372    NittenRenegade    16       

Оптимизация новой типовой схемы обмена через синхронизацию 15

Статья Программист Нет файла v8 1cv8.cf Windows Бесплатно (free) Практика программирования Обмен через XML

В новых типовых конфигурациях УТ11 и БП3 вместо прошлой схемы обмена данными используется синхронизация данных. Однако у неё есть свои недостатки. В статье - краткое описание некоторых нюансов новой схемы и приемы для оптимизации работы с ней.

26.09.2015    20787    fixin    13       

Внедрение адресного склада в логистическом операторе 25

Статья Системный администратор Программист Бизнес-аналитик Пользователь Нет файла v8 v8::ОУ УТ11 Оптовая торговля, дистрибуция, логистика Россия УУ Windows Оптовая торговля Розничная торговля Учет ТМЦ УСН Бесплатно (free) Загрузка и выгрузка в Excel Бухгалтерский учет Рабочее место

Каких-то 10 лет назад бюджет внедрений адресных складов составлял десятки тысяч долларов и месяцы работ целой команды, а теперь - типовое решение от 1С вполне рабочее и без кастомизации: немного интеграции, немного консультирования – и в продуктив. Внедрение адресного склада, в массе внедрений 1С:Управление торговлей, ред. 11.1 (далее УТ), штука до сих пор довольно-таки редкая. Данная статья описывает опыт одного маленького, но свежего внедрения адресного склада в УТ (11.1.10) и может быть интересна как практический кейс.

1 стартмани

10.08.2015    18752    papche    12