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

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

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

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

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

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

19.09.2014. Уточненная редакция.

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


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


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


Публикации других авторов:

"XLSX средствами 1С":
1cmax: Чтение файлов *.xlsx средствами 1С 8.2 (Управляемые формы) в т.ч. Веб-клиент: //expert.bizon22.ru/public/142187
Abadonna: Чтение файлов *.xlsx средствами 1С 8.2: //expert.bizon22.ru/public/139556
Dzenn: Загрузка файлов Excel XLSX через XML: //expert.bizon22.ru/public/205359
webstep: Чтение документа Excel 2007 без офиса, без ВК: //expert.bizon22.ru/public/202023
Душелов: Чтение/Запись документа Excel 2007 без офиса, без ВК. (с примером для 7.7, 8.1 и 8.2 на управляемых формах): //expert.bizon22.ru/public/19139
"Другое: чтение/редактирование XML":
anig99: "Однопальцевое" чтение XML для 8.2: //expert.bizon22.ru/public/84254
Lokiy: Парсинг, преобразование, редактирование XML: //expert.bizon22.ru/public/198131
onec.developer: Редактор XML на управляемых формах 8.2: //expert.bizon22.ru/public/201077
Yashazz: Просмотр xml-файлов: //expert.bizon22.ru/public/203514
Душелов: Создание документа Word 2007: //expert.bizon22.ru/public/16215
"Не 1С, но полезно":
iddqd: akXmlEdit - v1.5.0.7 редактор XML: //expert.bizon22.ru/public/15464


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

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

// Метод "NativeXLSX" (ЧтениеXML).
// Преобразует текст формата 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;
    Перем
SheetX,ЗначениеЯчейки, ТипЗначения, ФорматЯчейки, ФорматСтиля;
    Перем ТаблицаРезультат, НоваяСтрока;
   
    ФайлНомерЛиста  = ИмяНомерЛиста.НомерЛиста;
    ФайлНомерЛиста = ?(ФайлНомерЛиста = 0, 1, ФайлНомерЛиста);
   
    ZIPКаталог = КаталогВременныхФайлов() + "XLSX\";
    Если НЕ ПредварительнаяОбработкаФайлаXLSX(ФайлEXCEL, ZIPКаталог) Тогда
        Возврат Новый ТаблицаЗначений;
    КонецЕсли;
   
    СоответствиеNumFmtIdFormatCode = Новый Соответствие;
    МассивNumFmtId = ИзвлечьДанныеИзФайла_StylesXML(ZIPКаталог, СоответствиеNumFmtIdFormatCode);
   
    МассивSharedStrings = ИзвлечьДанныеИзФайла_SharedStringsXML(ZIPКаталог);
   
    SheetX = Новый ЧтениеXML;
    SheetX.ОткрытьФайл(ZIPКаталог + "XL\WorkSheets\Sheet" + ФайлНомерЛиста + ".xml");
   
    МассивИменКолонокXLSX = ПолучитьМассивИменКолонокНаЛистеXLSX(SheetX);
    КолвоКолонокEXCEL = МассивИменКолонокXLSX.Количество();
   
    // Создание результирующей таблицы, в которую будут записываться считанные из EXCEL данные.
    ТаблицаРезультат = Новый ТаблицаЗначений;
    // Формирование колонок результирующей таблицы.
    // "НомерСтроки" - для наглядности и удобства.
    // В зависимости от разрабатываемой обработки.
    // "Сопоставлено" - может быть другим.
    // Здесь же могут быть добавлены другие колонки, не формируемые из содержимого файла EXCEL.
    ТаблицаРезультат.Колонки.Добавить("НомерСтроки", Новый ОписаниеТипов("Число"), "№", 4);
    ТаблицаРезультат.Колонки.Добавить("Сопоставлено", Новый ОписаниеТипов("Булево"), "Сопоставлено", 1)
;
    ТаблицаРезультат.Колонки.Добавить("УровеньГруппировки", Новый ОписаниеТипов(
"Число"), "Гр", 2); // Группировка строк в файле EXCEL.
    Для ит = 1 ПО КолвоКолонокExcel Цикл
        ИмяКолонки = "N" + ит;
        Колонка = ТаблицаРезультат.Колонки.Добавить(ИмяКолонки);
    КонецЦикла;
   
    SheetX = Новый ЧтениеXML;
    SheetX.ОткрытьФайл(ZIPКаталог + "XL\WorkSheets\Sheet" + ФайлНомерЛиста + ".xml");
   
    ЭтоНачалоДанных = Ложь;
    // Считать очередной узел XML.
    Пока SheetX.Прочитать() Цикл
        Если ВРег(SheetX.Имя) = "SHEETDATA" И SheetX.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
            ЭтоНачалоДанных = Истина;
            Прервать;
        КонецЕсли;
    КонецЦикла;
    Если НЕ ЭтоНачалоДанных Тогда
        Возврат Новый ТаблицаЗначений;
    КонецЕсли;
   
    // Считать очередной узел XML.
    НомерСтроки = 0;
    Пока SheetX.Прочитать() Цикл
        Если ВРег(SheetX.Имя) = "SHEETDATA" И SheetX.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда
            Прервать;   // Окончание данных.
        КонецЕсли;
        Если ВРег(SheetX.Имя) = "ROW" И SheetX.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
            НомерСтроки = НомерСтроки + 1;
            Если НЕ НачСтрока = 0 И НЕ НомерСтроки = 1 И НомерСтроки < НачСтрока Тогда
                Продолжить;
            КонецЕсли;
            НоваяСтрока = ТаблицаРезультат.Добавить();
            НоваяСтрока.НомерСтроки = НомерСтроки
;
            НоваяСтрока.УровеньГруппировки = SheetX.ЗначениеАтрибута("outlineLevel");

            Пока SheetX.Прочитать() Цикл    // Считаем колонки строки EXCEL.
                Если ВРег(SheetX.Имя) = "ROW" Тогда
                    Прервать;
                КонецЕсли;
                Если ВРег(SheetX.Имя) = "SHEETDATA" И SheetX.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда
                    Прервать;   // Окончание данных.
                КонецЕсли;
                Если ВРег(SheetX.Имя) = "C" И SheetX.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
                    ТипЗначения = SheetX.ЗначениеАтрибута("t");
                    ФорматЯчейки = SheetX.ЗначениеАтрибута("s");
                    ИмяКолонки = SheetX.ЗначениеАтрибута("r");
                    ИмяКолонкиБезЦифр = ЗаменитьОдниСимволыДругими("0123456789", ИмяКолонки, "");
                    ИндексКолонки = МассивИменКолонокXLSX.Найти(ИмяКолонкиБезЦифр)+1;
                    SheetX.Прочитать();
                    Если ВРег(SheetX.Имя) = "V"  ИЛИ ВРег(SheetX.Имя) = "F" Тогда   // "V" - Значение, "F" - Формула.
                        Если ВРег(SheetX.Имя) = "F" Тогда
                            Пока НЕ ВРег(SheetX.Имя) = "V" Цикл
                                SheetX.Прочитать();
                            КонецЦикла;
                        КонецЕсли;
                        SheetX.Прочитать();
                        Если ВРег(SheetX.Имя) = "#TEXT" Тогда
                            ЗначениеЯчейки = SheetX.Значение;
                            ФорматСтиля = "";
                            Если (НЕ ФорматЯчейки = "" И НЕ ФорматЯчейки = Неопределено) Тогда
                                Попытка
                                    ИндексФормата = Число(ФорматЯчейки);
                                    ФорматСтиля = СоответствиеNumFmtIdFormatCode.Получить(МассивNumFmtId[ИндексФормата]);
                                Исключение
                                    ФорматСтиля = "";
                                КонецПопытки;
                            КонецЕсли;
                            Если ЗначениеЗаполнено(ЗначениеЯчейки) Тогда
                                Если ТипЗначения = Неопределено ИЛИ ВРег(ТипЗначения) = "N" ИЛИ ВРег(ТипЗначения) = "B" Тогда
                                    Попытка
                                        Значение1 = Число(ЗначениеЯчейки);
                                    Исключение
                                        Значение1 = ЗначениеЯчейки;
                                    КонецПопытки;
                                    ЗначениеЯчейки = Значение1;
                                    Если (ФорматСтиля = "" ИЛИ ФорматСтиля = Неопределено) Тогда
                                        // ФорматСтиля = Неопределено - Атрибут "s" отсутствует.
                                        // MS Office (2010) может не формировать в xml-файле описание стиля форматирования для ячейки.
                                        // LibreOffice (4.1.5) формирует в xml-файле необходимые описания стиля форматирования ячейки.
                                        // Сообщить("Не определен стиль форматирования для кода " + ФорматЯчейки + " значения " + ЗначениеЯчейки);
                                    КонецЕсли;
                                   
                                    Если ТипЗнч(ЗначениеЯчейки) = Тип("Строка")
                                        И (Найти(ЗначениеЯчейки, "E-") > 0 ИЛИ Найти(ЗначениеЯчейки, "E+") > 0) Тогда
                                        ЗначениеЯчейки = ПолучитьЧислоВСтепениИзСтроковогоЗначения(ЗначениеЯчейки);
                                    КонецЕсли;
                                   
                                    Если ТипЗнч(ЗначениеЯчейки) = Тип("Число") Тогда
                                        // ПРОЦЕНТ.
                                        Если ЭтоПроцентXLSX(ЗначениеЯчейки, ФорматСтиля) Тогда
                                            ЗначениеЯчейки = Окр(ЗначениеЯчейки * 100, 3);
                                        // БУЛЕВО.
                                        ИначеЕсли ЭтоБулевоXLSX(ЗначениеЯчейки, ФорматСтиля) Тогда
                                            ЗначениеЯчейки = Булево(ЗначениеЯчейки);
                                        // ВРЕМЯ.
                                        ИначеЕсли ЭтоВремяXLSX(ЗначениеЯчейки, ФорматСтиля) Тогда
                                            ЗначениеЯчейки = КонвертироватьЧислоXLSXвДатуВремя(ЗначениеЯчейки);
                                        // ДАТА.
                                        ИначеЕсли ЭтоДатаXLSX(ЗначениеЯчейки, ФорматСтиля) Тогда
                                            ЗначениеЯчейки = КонвертироватьЧислоXLSXвДату(ЗначениеЯчейки);
                                        // ЧИСЛО.
                                        ИначеЕсли ТипЗначения = Неопределено
                                            ИЛИ ( ЭтоЧислоXLSX(ЗначениеЯчейки, ФорматСтиля)
                                            И НЕ ЭтоБулевоXLSX(ЗначениеЯчейки, ФорматСтиля)
                                            И НЕ ЭтоВремяXLSX(ЗначениеЯчейки, ФорматСтиля)
                                            И НЕ ЭтоДатаXLSX(ЗначениеЯчейки, ФорматСтиля) )
                                            Тогда
                                            // Без преобразования.
                                        Иначе
                                            // Прочие форматы.
                                        КонецЕсли;
                                       
                                    Иначе
                                       
                                        Сообщить("Не удалось преобразовать значение к ""числовому""(процент, время, дата, число) типу.");
                                       
                                    КонецЕсли;
                                   
                                ИначеЕсли ВРег(ТипЗначения) = "S" Тогда
                                   
                                    // МассивSharedStrings может быть пустым.
                                    Попытка
                                        ЗначениеЯчейки = СокрЛП(МассивSharedStrings[Число(SheetX.Значение)]);
                                    Исключение
                                        ЗначениеЯчейки = "";
                                    КонецПопытки;
                                   
                                ИначеЕсли ВРег(ТипЗначения) = "STR" Тогда
                       
                                    Если ТипЗнч(ЗначениеЯчейки) = Тип("Строка") Тогда
                                        ЗначениеЯчейки = СокрЛП(ЗначениеЯчейки);
                                    КонецЕсли;
                       
                                КонецЕсли;
                            КонецЕсли;
                           
                            ИмяКолонки = "N"+ИндексКолонки;
                            НоваяСтрока[ИмяКолонки] = ЗначениеЯчейки;
                            // Используется при формировании таблицы на форме обработки.
                            ШиринаКолонки = ТаблицаРезультат.Колонки[ИмяКолонки].Ширина;
                            ДлинаСтроки = СтрДлина(СокрЛП(ЗначениеЯчейки));
                            ТаблицаРезультат.Колонки[ИмяКолонки].Ширина = ?(ШиринаКолонки < ДлинаСтроки, ДлинаСтроки, ШиринаКолонки);
                           
                        КонецЕсли;
                    КонецЕсли;
                КонецЕсли;
            КонецЦикла;
            Если ((НЕ КонСтрока = 0 И (НомерСтроки + 1) > КонСтрока)
                ИЛИ (НЕ КолвоСтрокExcel = 0  И (НомерСтроки + 1) > КолвоСтрокExcel)) Тогда
                Прервать;   // Окончание диапазона считываемых данных.
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;
   
    // Завершение работы.
    // Закрытие Объектов.
    SheetX.Закрыть();
   
    УдалитьКолонкиСНулевойШириной(ТаблицаРезультат);
   
    Возврат ТаблицаРезультат;
   
КонецФункции

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

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

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

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

&НаСервере
Функция ИзвлечьДанныеИзФайла_StylesXML(ZIPКаталог, СоответствиеNumFmtIdFormatCode)
    Перем Файл, Styles;
    Перем МассивNumFmtId, ит;
   
    МассивNumFmtId = Новый Массив;
    СоответствиеNumFmtIdFormatCode = Новый Соответствие;
   
    Файл = Новый Файл(ZIPКаталог + "XL\Styles.xml");
    Если НЕ Файл.Существует() Тогда
        Возврат МассивNumFmtId;
    КонецЕсли;
   
    Styles = Новый ЧтениеXML;
    Styles.ОткрытьФайл(Файл.ПолноеИмя);
   
    Пока Styles.Прочитать() Цикл
        Если ВРег(Styles.Имя) = ВРег("numFmt") И Styles.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
            СоответствиеNumFmtIdFormatCode.Вставить(Styles.ЗначениеАтрибута("numFmtId"), ВРег(Styles.ЗначениеАтрибута("formatCode")));
        КонецЕсли;
        Если ВРег(Styles.Имя) = ВРег("cellXfs") Тогда
            Пока Styles.Прочитать() Цикл
                Если ВРег(Styles.Имя) = ВРег("xf") И Styles.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
                    МассивNumFmtId.Добавить(Styles.ЗначениеАтрибута("numFmtId"));
                КонецЕсли;
            КонецЦикла;
        КонецЕсли;
    КонецЦикла;
   
    // Завершение работы.
    // Закрытие Объектов.
    Styles.Закрыть();

    // Проверка сопоставления кодов массива и соответствия.
    // 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Каталог)
    Перем Файл, SharedStrings;
    Перем МассивSharedStrings;
   
    // Если в файле EXCEL не содержится значений, имеющих тип "СТРОКА", то файл "SharedStrings.xml" не формируется.
   
    МассивSharedStrings = Новый Массив;
   
    Файл = Новый Файл(ZIPКаталог + "XL\SharedStrings.xml");
    Если НЕ Файл.Существует() Тогда
        Возврат МассивSharedStrings;
    КонецЕсли;
   
    SharedStrings = Новый ЧтениеXML;
    SharedStrings.ОткрытьФайл(Файл.ПолноеИмя);
   
    Пока SharedStrings.Прочитать() Цикл
        Если ВРег(SharedStrings.Имя) = "#TEXT" Тогда
            МассивSharedStrings.Добавить(SharedStrings.Значение);
        КонецЕсли;
    КонецЦикла;
   
    // Завершение работы.
    // Закрытие Объектов.
    SharedStrings.Закрыть();
   
    Возврат МассивSharedStrings;
   
КонецФункции

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

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

&НаСервере
Функция ЭтоЧисло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));
    КонецЦикла;
    Возврат Результат;
КонецФункции

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

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


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

Комментарии
Избранное Подписка Сортировка: Древо развёрнутое
Свернуть все
1. Evgen.Ponomarenko 548 01.11.13 18:50 Сейчас в теме
Мега зачетно! В копилку готовых решений на пожизненно! )))
StepByStep; +1 Ответить
2. peterxx 19 01.11.13 20:59 Сейчас в теме
Очень неплохо, а то внешние компоненты - кот в мешке, ADO - бывает лень возиться и т.п.
StepByStep; +1 Ответить
4. TheGrr 140 03.11.13 12:23 Сейчас в теме
(3) Eugeneer, а вы в каждой публикации, касающейся загрузки из Excel, будете обсирать автора? :) Уже ведь даже не смешно. Я прекрасно понимаю, что это Ваша вотчина. Но я лично за то, чтобы различных решений одной задачи было много и разных, в т.ч. и бесплатных ;)
yuraskas; quNas; StepByStep; +3 Ответить
6. Yashazz 3263 05.11.13 12:46 Сейчас в теме
Ну, пущай будет, как оглавление. А то и правда, неохота иной раз лазить да искать.

(5) Кое в чём склонен согласиться.
StepByStep; +1 Ответить
8. sergnik 06.11.13 12:33 Сейчас в теме
(5) Eugeneer,
Позволю себе с вами не согласиться.
Сама публикация не то чтобы сильно заинтересовала, но была в топе, и я сюда зашел.
Просмотрел остальные 5 публикаций автора, о которых вы написали

Каждая публикация описывает совсем разные методы обработки информации,
поэтому это не выжимание из воздуха.
Кроме того, весь код выложен прямо в публикации, не нужно качать "кота в мешке" чтобы оценить работу
кода. Уже за одно это автору - ОГРОМНЕЙШИЙ ПЛЮС

Быть может, у Вас личная неприязнь к автору? ))
user687869_ip.kolotei; Knych; HitGroove; CratosX; Alex_IT; StepByStep; +6 Ответить
10. Nick_Godspeed 06.11.13 15:14 Сейчас в теме
(5) Eugeneer, не ревнуйте :)
Как верно подметил (8) только за открытый код, да плюс за такую всестороннюю проработку вопроса автор заслужил хоть сто постов по одному вопросу.
14. Abadonna 3858 07.11.13 06:20 Сейчас в теме
(5)
А тут мы видим банальное выжимание рейтинга. Ведь те кто первую публикацию скачал будут еще ставить рейтинги в других пяти. Это очевидно)))

Нет, Евген, тут ты как раз не прав! Плюсуют/качают только то, что на виду. Не будут еще ставить рейтинги в других пяти, за редчайшими исключениями. По личному опыту;)..
P.S. Давным-давно, хохмы ради, я опубликовал свою же обработку под другим ником. Как попёрли плюсы! А самое интересное: продолжали плюсовать даже после того, как я написал, что это шутка и указал первоисточник. Продолжали!
StepByStep; +1 Ответить
7. Pavl0 88 06.11.13 10:27 Сейчас в теме
Замечательно! Утащил к себе, проверю на досуге.
StepByStep; +1 Ответить
12. StepByStep 3355 06.11.13 18:36 Сейчас в теме
(7) Pavl0,
Если не затруднит - отпишитесь, пожалуйста, о результатах.
9. CagoBHuK 32 06.11.13 14:56 Сейчас в теме
Для тех, кто хочет сделать действительно красивое решение: открываете XML XSLX файла и с помощью XSLT преобразуете в сериализованный табличный документ. А дальше - обычная рассериализация с помощью фабрики XDTO. Никакого геморроя и лишнего текста. Все будет работать штатными средствами.
SoNiKa; quNas; nSpirit2; i.kovtun; zarucheisky; StepByStep; +6 Ответить
13. StepByStep 3355 06.11.13 18:47 Сейчас в теме
(9) CagoBHuK,
ПРЕКРАСНО. Существует еще способ.
37. nSpirit2 20.08.14 15:07 Сейчас в теме
Меня очень нервирует способ объявление переменных взятый явно из Делфи. Ну а так полностью согласен с (9) CagoBHuK все намного проще :)
11. LexSeIch 206 06.11.13 16:34 Сейчас в теме
Мир этому дому!
Мне нравиться, когда код публикуется в статье. Автору плюс.
15. Abadonna 3858 07.11.13 07:09 Сейчас в теме
16. StepByStep 3355 07.11.13 10:45 Сейчас в теме
(15) Abadonna,
Упоминание об этой работе встречал. Страница была недоступна. Причина - неизвестна.
А вообще, хорошая мысль, сделать подборку ссылок по вопросу "Загрузки из EXCEL ..." от разных авторов в разных "ракурсах".
Соберу - выложу.
17. StepByStep 3355 07.11.13 13:30 Сейчас в теме
07.11.2013.
Добавлены ссылки на публикации других авторов.
Если что-то не увидел, не обессудьте.
18. soap 58 07.11.13 15:45 Сейчас в теме
Интересно. Оч хор что код прямо в статье.
Автору плюс
19. Abadonna 3858 07.11.13 16:55 Сейчас в теме
(0) В тексте поправь
Импирически:
-Эмпирически ;)
20. StepByStep 3355 07.11.13 20:35 Сейчас в теме
(19) Abadonna,
СПАСИБО. "Велик и Могуч Русский язык".
21. RainyAugust22 248 08.11.13 06:37 Сейчас в теме
Плюсую. Взял на заметку.
22. zspr 22 15.11.13 15:01 Сейчас в теме
Автору большое спасибо
Прикрепленные файлы:
24. mvgfirst 5 20.01.14 13:28 Сейчас в теме
Кто нибудь тестировал это на практических данных?
Значения ячеек с формулами полностью игнорируются при использовании этого метода.
Вернее не метода а если скопировать приведенный исходный код.

Без допиливания руками - никак не обойтись.
dimontit; +1 Ответить
25. StepByStep 3355 30.01.14 13:02 Сейчас в теме
(24) mvgfirst,
СПАСИБО.
Действительно так. Надо "допилить".
26. StepByStep 3355 01.02.14 14:18 Сейчас в теме
(24) mvgfirst,
01.02.2014.
Изменена функция ЗагрузитьМетодом_1CXML().
Дополнена считыванием значений из ячеек, содержащих формулы.
27. Al-X 05.02.14 10:48 Сейчас в теме
+ Актуально-то как !!! Жлобы, не хотят офис покупать !! ))))
28. smilebringer 26.02.14 12:05 Сейчас в теме
Эмпирическая догадка не верна, любое целое, дробное число, процент, время, и другие числовые форматы будут интерпретироваться как дата. Строковые значения будут верно обрабатываться.
30. StepByStep 3355 27.02.14 16:56 Сейчас в теме
(28) smilebringer,
СПАСИБО.
Строки, числа, даты читаются.
Процент, время - посмотрю, подправлю.
32. StepByStep 3355 01.03.14 23:16 Сейчас в теме
01.03.2014 г. Обновление.
(28) smilebringer, (29) igyo,
СПАСИБО за указанные неточности.
Доработал.
Если обнаружите неточности - напишите, пожалуйста.
29. igyo 103 27.02.14 10:08 Сейчас в теме
Косяк если в колонке будет пустая ячейка, смещаются колонки тогда... :(
31. StepByStep 3355 27.02.14 16:58 Сейчас в теме
(29) igyo,
Это проверялось.
В смысле одна или несколько пустых ячеек в колонке или вся колонка пустая?
Если можно - файл выложите, пожалуйста.
33. spaminfostart 15 05.03.14 16:47 Сейчас в теме
и тут спрошу про 255 столбцов... таки не обрабатывает такие файлы?
34. smilebringer 11.03.14 13:43 Сейчас в теме
Тебе бы еще такие вещи вынести на git или другую систему контроля версий, тебе тогда и сообщество укажет, где что поправить, может и свой вариант кто-то предложит. А так изменение читать тяжело и поэтому лениво :)
35. Glk 15.04.14 14:36 Сейчас в теме
// ЧИСЛО.
                                        Если Прав(ЗначениеЯчейки, 5) = "E-003" Тогда
                                            УдалитьПоследнийСимволВСтроке(ЗначениеЯчейки, 5);
                                            Попытка
                                                ЗначениеЯчейки = Число(ЗначениеЯчейки);
                                            Исключение
                                            КонецПопытки;
                                            // ЧИСЛО.
                                        ИначеЕсли Прав(ЗначениеЯчейки, 3) = "E-3" Тогда
                                            УдалитьПоследнийСимволВСтроке(ЗначениеЯчейки, 3);
                                            Попытка
                                                ЗначениеЯчейки = Число(ЗначениеЯчейки);
                                            Исключение
                                            КонецПопытки;
Показать

Обрезать обрезали, а поделить на 1000 забыли.
StepByStep; +1 Ответить
36. StepByStep 3355 20.08.14 15:46 Сейчас в теме
38. Glk 23.08.14 01:13 Сейчас в теме
(36) Кстати, пришлось еще добавить аналогичную конструкцию для
Прав(ЗначениеЯчейки, 3) = "E-2"
, регулярно попадалось в присылаемых нам файликах.
39. StepByStep 3355 27.08.14 21:02 Сейчас в теме
(38) Glk,
Скоро будет новая редакция. В ней будет и Е-..., Е+... и др.
40. StepByStep 3355 03.09.14 13:57 Сейчас в теме
(38) Glk,
03.09.2014. Новая редакция.
41. Glk 03.09.14 16:39 Сейчас в теме
ИндексКолонки = ?(ИндексКолонки = Неопределено, КоличествоСлужебныхКолонок-1, ИндексКолонки+КоличествоСлужебныхКолонок-1);

Непонятно, зачем тут КоличествоСлужебныхКолонок-1, если имя колонки никак от количества служебных не зависит.
У меня добавляется еще одна служебная колонка с уровнем группировки для загрузки иерархических справочников номенклатуры от поставщиков, возможно стоит ее добавить и в вашу обработку для универсальности.
НоваяСтрока.УровеньГруппировки=SheetX.ЗначениеАтрибута("outlineLevel");


StepByStep; +1 Ответить
42. StepByStep 3355 03.09.14 22:43 Сейчас в теме
(41) Glk,
ИндексКолонки = ?(ИндексКолонки = Неопределено, КоличествоСлужебныхКолонок-1, ИндексКолонки+КоличествоСлужебныхКолонок-1);
СПАСИБО.

Атрибут "outlineLevel" может отсутствовать, например, если файл создан в MS EXCEL.
При сохранении в LibreOffice - он есть.
43. Glk 04.09.14 12:47 Сейчас в теме
(42)
Он отсутствует, если нет собственно группировки в текущей строке, но это не мешает загружать его для остальных. А если определить колонку как
ТаблицаРезультат.Колонки.Добавить("УровеньГруппировки", Новый ОписаниеТипов("Число"), "Гр", 4);

то даже проверку на Неопределено делать не приходится - само в 0 преобразуется.
StepByStep; +1 Ответить
44. StepByStep 3355 04.09.14 15:22 Сейчас в теме
45. StepByStep 3355 04.09.14 15:32 Сейчас в теме
46. 7OH 32 05.09.14 01:53 Сейчас в теме
Ни на что не претендую.
Добавил:
1. чистку временного каталога за собой
2. выбор листа
Переделал:
1. Определение колонок (не по первой строке, а по служебным данным "DIMENSION\ref" )
2. Имена колонок - немного подправил аглоритм - вылетало часто.
3. Сорри - но обычных формах - переделать не сложно.
Прикрепленные файлы:
ЗагрузкаXLSX.erf
Ponommax; quNas; StepByStep; Glk; +4 Ответить
47. StepByStep 3355 05.09.14 13:44 Сейчас в теме
(46) 7OH,
Определение колонок (не по первой строке, а по служебным данным "DIMENSION\ref"

Сталкнулся с несоответствием служебных данных и реальных колонок - поэтому по 1-ой строке "по факту".
Имена колонок - немного подправил аглоритм - вылетало часто

Если не сложно опишите пример.
СПАСИБО.
49. 7OH 32 06.09.14 15:30 Сейчас в теме
(47)
в первой строке шапка документа в виде
Склад : техника
ответственный: Пупкин
и тут пошла шапка колонок
итого он определяет всего 2 колонки и при попытке считывания на шапке вываливается с ошибкой
а так в DIMENSION вроде красиво лежит весь диапазон - спеациально ставил спрва снизу подальше одну букву - подхватывало
50. StepByStep 3355 10.09.14 13:53 Сейчас в теме
48. StepByStep 3355 05.09.14 17:14 Сейчас в теме
(46) 7OH,
Не заполненная/не полностью заполненная 1-я строка ?
63. XelOla 17 18.10.15 00:39 Сейчас в теме
(46) 7OH, будет ли это работать в обычном приложении?
Что еще можно использовать для работы с Эксель без установленного Офиса?
66. StepByStep 3355 15.11.15 19:36 Сейчас в теме
(63) XelOla,
будет ли это работать в обычном приложении?
Что еще можно использовать для работы с Эксель без установленного Офиса?

Да, будет.
См. также
Методы загрузки из внешнего источника:
- Метод "MS ADO" (Чтение файлов xls, xlsx средствами Microsoft ADO): http://infostart.ru/public/163640/
- Метод "NativeXLSX" (Чтение файлов xlsx с картинками средствами 1С. ПостроительDOM): http://infostart.ru/public/300092/
- Метод "Excel1C" (Загрузка на платформе 8.3.6 с картинками. Чтение файлов xls, xlsx, ods): http://infostart.ru/public/341855/

При установленном бесплатном LibreOffice:
- Метод "LO CALC" (Чтение файлов xls, xlsx, ods, sxc с картинками средствами LibreOffice): http://infostart.ru/public/163642/
51. Drizer2000 14 24.09.14 15:57 Сейчас в теме
Эх описал бы кто преимущество, того или иного метода, я не читал все статьи автора, может где и есть. Например, мне нужно загружать в базу из экселя прайсы поставщиков. Прайсы могут содержать до 10 тыс строк, вот и думаю какой бы метод использовать. Сейчас сделано классичеси через ОЛЕ,но относительно медленно идет загрузка.
52. jobkostya1c8 24.09.14 16:19 Сейчас в теме
Ставлю "плюс" за подборку решений. Все равно для разных задач приходится свое писать. В одной из нехороших обработок по загрузке основных средств лучшего решения чем вручную указание пользователем номеров колонок не было.
53. Drizer2000 14 24.09.14 20:54 Сейчас в теме
А кто знает какой используется метод для обработки указанной вот по этой ссылке:
http://infostart.ru/public/21810/
54. SinglCOOLer 213 26.09.14 14:08 Сейчас в теме
все бы вроде не плохо, но часть данных колонок почему то берется с нужно листа, а часть с другого
57. StepByStep 3355 25.11.14 23:20 Сейчас в теме
(54), (55) SinglCOOLer,
В ранних версиях обработки "Импорт (загрузка) из внешнего источника (Excel,LibreOffice,SQL,DBF,MXL) в 1С 8.2/8.3: Розница,УТ,БП,КА. /РОССИЯ,УКРАИНА,БЕЛАРУСЬ/" http://infostart.ru/public/120961/ описанный метод использовался и корректно брал данные с необходимого листа.
55. SinglCOOLer 213 26.09.14 14:34 Сейчас в теме
Если делаешь лист 1 и единственным, то перестает путать и грузит корректно
56. MishaHD 29 05.11.14 07:32 Сейчас в теме
Update :) Написал хвалебный комментарий, а потом нашел косяк. В представленных выше процедурах когда мы формируем МассивSharedStrings из файла SharedStrings.xml не учитывается то, что может встречаться значение "пустая строка". То есть условие
Если ВРег(SharedStrings.Имя) = "#TEXT" Тогда
не будет отрабатывать. Соответственно если в файле SharedStrings.xml встретилась пустая строка, то начинаю "плыть" индексы массива МассивSharedStrings, а за ними "плывет" результирующая таблица.

Написал следующий костыль, может кому полезно будет:

Вот это:
Пока SharedStrings.Прочитать() Цикл
        Если ВРег(SharedStrings.Имя) = "#TEXT" Тогда
            МассивSharedStrings.Добавить(SharedStrings.Значение);
        КонецЕсли;
    КонецЦикла;


Меняем на это:
ФлагСтрокаЗаписана = Ложь;
    
	Пока SharedStrings.Прочитать() Цикл
		Если ВРег(SharedStrings.Имя) = "SI" и SharedStrings.ТипУзла = ТипУзлаXML.НачалоЭлемента тогда
			ФлагСтрокаЗаписана = Ложь;
		КонецЕсли;
		
        Если ВРег(SharedStrings.Имя) = "#TEXT" Тогда
            МассивSharedStrings.Добавить(SharedStrings.Значение);
			ФлагСтрокаЗаписана = Истина;
		КонецЕсли;
		
		Если ВРег(SharedStrings.Имя) = "SI" и SharedStrings.ТипУзла = ТипУзлаXML.КонецЭлемента и не ФлагСтрокаЗаписана тогда
			//встретили пустую строку!
			 МассивSharedStrings.Добавить("");
		КонецЕсли;
		
    КонецЦикла;
Показать


Спасибо за процедуры, приятно что все нормально отлажено и работает (как выяснилось кроме некоторых косяков))). Небольшое пожелание, бы бы удобно если бы колонки именовались из заголовочных данных (например если указываем что заголовок - это строка №1).
It-developer; InShallaH; [4EPHbIYY_KOT]; Glk; +4 Ответить
58. StepByStep 3355 25.11.14 23:21 Сейчас в теме
(56) MishaHD,
Рекомендую обратить внимание на "Загрузка из EXCEL в 1С. Чтение файла XLSX средствами 1С. ПостроительDOM" http://infostart.ru/public/300092/
59. MishaHD 29 21.12.14 08:33 Сейчас в теме
(58) спасибо за совет. В принципе допилил то, что в этом посте выложено под свои нужды, все работает без косяков
67. [4EPHbIYY_KOT] 38 09.02.16 10:31 Сейчас в теме
(56) MishaHD, ещё бы автор это подправил - вообще был бы зачёт. А то без разбора кода пооткрывали файлики, плывёт всё жестко. Даже с соседних листов данные берёт :)
68. InShallaH 51 27.02.17 18:00 Сейчас в теме
(56)
Ты просто сделал мой день :)
70. It-developer 20 13.04.18 17:09 Сейчас в теме
60. jobkostya1c8 28.01.15 13:41 Сейчас в теме
Вопрос граждане по отказоустойчивости при чтении из Excel. Тут есть сервер 1С (вроде 64 битный без установленного на нем офисного пакета. Соответственно на нем нет зарегистрированного объекта COMОбъект "Excel.Application". Как раз смотрели недавнюю статью Настройка DCOM компоненты "Excel.Application" на 64-битном сервере приложений 1С
Суть вопроса в чем. Мне прислали такое техническое мнение корпорации Майкрософт:
Корпорация Microsoft на сегодняшний день не рекомендует производить и не поддерживает автоматизацию программ из пакета Microsoft Office с помощью автоматических, неинтерактивных клиентских приложений или компонентов (включая ASP, DCOM и службы NT), поскольку при запуске в этом окружении программы пакета Office могут работать нестабильно или зависать.

Насчет при запуске в этом окружении программы пакета Office могут работать нестабильно или зависать частично согласен. Методы закрытия работают плохо и висят на сервере о чем писали.
Что народ скажед по поводу данного мнения? Не хотелось бы вступать в админские споры. Если загрузка хотя бы периодическая под контролем оператора? Насколько это критично. В чем получается преимущество ADO? В том что не надо пакет офисный ставить (я про уклон в лицензионную политику)? Или еще есть преимущества (про скорость и прочие радости излишне).
64. StepByStep 3355 15.11.15 19:31 Сейчас в теме
(60) kostyaomsk, (61) kostyaomsk,
См. Загрузка из EXCEL в 1С. MS ADODB.Connection : http://infostart.ru/public/163640/
61. jobkostya1c8 28.01.15 14:17 Сейчас в теме
Насчет "универсального ADO" как-то начал обработку чтения xls в тонком клиенте для БП 3.0 с анализом ошибок. Предполагалось сделать универсальной с ведением протокола ошибок на сервере с передачей на клиент.
Сразу предупреждаю, данную обработку запускать осторожно чтоб не повредить данные. Тут выкладываю только с целью сравнения и отладки технологии по чтению из екселя с помощью ADO.
По крайней мере лист начинает читать без всяких настроек ADO и локального Екслея (на компе только Libre office).
Код чтения (главное, метод ADODBConnection.Open(); срабатывает:
// Инициализация основного объекта ADODB.Connection. Открытие соединения.
		ADODBConnection = Новый COMОбъект("ADODB.Connection");		
		ADODBConnection.ConnectionString =  СonnectionString;
		
		ADODBConnection.Provider = "Microsoft.Jet.OLEDB.4.0"; //????? ставился САМ MSSQL -		
		ADODBConnection.Open();
		// Импирически определенный параметр для правильного определения количества строк листа.
		ADODBConnection.CursorLocation = 3;    // По-умолчанию 2.
		
	ТекстЗапроса = "SELECT * FROM [" + ИмяЛиста + "$]";
	
	// Создание Recordset. Дочерний объект ADODBConnection. Набор записей по запросу.
	
		ADODBRecordset = Новый COMОбъект("ADODB.Recordset");
		ADODBRecordset.Open(ТекстЗапроса, ADODBConnection);
		
		// Проверка заполненности листа.
		Если (ADODBRecordset.EOF ИЛИ ADODBRecordset.BOF) Тогда
			КолвоСтрокExcel = 0;
			ДобавитьВЛогНаСервере("Лист екселя " + ИмяЛиста + ": не содержит данных (вообще)!");
			
			// Завершение работы.
			// Закрытие Объектов.
			ADODBRecordset.Close();
			ADODBConnection.Close();
			ADODBRecordset   = Неопределено;
			ADODBConnection = Неопределено;
			
			Возврат;
		КонецЕсли;
		
		// Импирически определенные параметры для правильного определения количества строк листа.
		ADODBRecordset.AbsolutePage     = 1;
		ADODBRecordset.AbsolutePosition = 1;
		
	// Параметр, возвращаемый в вызывающую процедуру.
	КолвоСтрокExcel = ADODBRecordset.RecordCount + 1;    // (+1) - учет Строки-Заголовока, которая "съедается".
	КолвоКолонокExcel = ADODBRecordset.Fields.Count;
	
	// Проверка заполненности листа.
	Если КолвоСтрокExcel <= 2 Тогда
		КолвоСтрокExcel = 0;
		 ДобавитьВЛогНаСервере("Лист екселя " + ИмяЛиста + ": не содержит данных (строк)!");
		
		// Завершение работы.
		// Закрытие Объектов.
		ADODBRecordset.Close();
		ADODBConnection.Close();
		ADODBRecordset   = Неопределено;
		ADODBConnection = Неопределено;
		
		Возврат;
	КонецЕсли;
Показать

обработка прилагается
Прикрепленные файлы:
ЗагрузкаВБухгалтерию3.epf
62. Petrony 20.08.15 16:53 Сейчас в теме
Также не распознаются ячейки с Дата+Время.
Поскольку Дата+Время - это не целое число, которое больше 1, то оно не распознается ни процедурой ЭтоДатаXLSX() ни процедурой ЭтоВремяXLSX
В принципе, можно из функции ЭтоДатаXLSX(Знач ЗначениеЯчейки, Знач ФорматСтиля) убрать проверку на то, что значение ячейки - целое число. Или отдельно создать функцию.
65. StepByStep 3355 15.11.15 19:32 Сейчас в теме
69. vladismi 161 12.10.17 16:41 Сейчас в теме
71. It-developer 20 18.04.18 17:52 Сейчас в теме
Все хорошо, но у меня был косяк, когда ничего не было в заголовке - происходило смещение колонок. Помогло исправить изменение функции ПолучитьМассивИменКолонокНаЛистеXLSX_Новый. Не все в ней нужно, но суть, думаю, понятна

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

Функция ИмяКолонкиПоНомеру(НомерКолонки)
	
	Латиница = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";    // 26.
	
	Если НомерКолонки <= 26 Тогда
		Возврат Сред(Латиница, НомерКолонки, 1)
	Иначе
		Возврат Сред(Латиница, Цел((НомерКолонки-1)/26), 1) + Сред(Латиница, НомерКолонки - 26*Цел((НомерКолонки-1)/26), 1)
	КонецЕсли;	
	
КонецФункции
Показать
72. AlexeyPapanov 12.09.18 23:36 Сейчас в теме
Коллеги, я одного не догоню.

Колонки смешиваются по непонятному принципу. Т.е. они не идут в ТЗ в таком порядке как они были в эксель-файле.
Я хочу дать юзеру возможность видеть на форме всю ТЗ результата.

Мне надо взять нужные колонки из ТЗ результата загрузки.
А как я ее выведу, если колонки в неведомом мне порядке идут.
Прикрепленные файлы:
MReshetilov; +1 Ответить
73. fanlexa 2 28.09.18 10:24 Сейчас в теме
Всем доброго дня. С выше указанными доработками, все отлично работает, за что всем огромное спасибо! Но у меня вот какая проблема, при выгрузке из клиент банка(сбербанк) в формате excel, файлы выгруженные на разных компах имеют почему-то разную структуру xml файлов, т.е. на одних компах файлы выгружается с "правильной " структурой и в заголовке файла sheet1.xml: "<?xml version="1.0" encoding="UTF-8" standalone="true"?>

-<worksheet xmlns:x14ac="http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac" mc:Ignorable="x14ac" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main">",

а в НЕ правильных файлах: "<?xml version="1.0" encoding="UTF-8"?>

-<worksheet xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main">", кроме того у них разная структура папок внутри. Но если "не правильный файл" открыть в excel, и просто нажать сохранить, то его структура становится правильной и читается нормально... не понимаю как победить пока, может кто уже сталкивался?
74. fanlexa 2 28.09.18 14:04 Сейчас в теме
Пока ждал проверку модератерами сам починил, может кому пригодится:

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


2.

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



Фишка в том, что сбербанк когда выгружает свои данные в excel, сами данные выгружает не в отдельный файл xl\sharedStrings.xml - как положено, а напрямую в файл xl\worksheets\sheet1.xml, хотя там должны хранится только индексы на данные в файле xl\sharedStrings.xml ))))))))
75. user1114234 26.04.19 09:51 Сейчас в теме
Почему может писать, чтo:
Файл не существует/не доступен:
D:\Товар.xlsx
Хотя файл там. Пробовал разные директории, даже файл пустым делал. Всё равно не хочет видеть
76. Petrony 26.04.19 13:30 Сейчас в теме
(75) Если у вас клиент-сервер, то возможно, загрузка у вас происходит на сервере и тогда файл должен быть там, а не на локальном компьютере. И наоборот. Если нужно выбрать файл на локальном компьютере, а прочитать на сервере, помещайте во временное хранилище.
77. yurant 27.11.19 22:31 Сейчас в теме
(75) починил у себя подобное, выправив руками все слэши в путях, и переведя все наименования в путях в нижний регистр

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

ВременноеИмяФайла = ПолучитьИмяВременногоФайла();
ВыбФайл = Новый Файл(ВременноеИмяФайла);
ВременноеИмяКаталога = СтрЗаменить(ВыбФайл.Имя, ".tmp", "");
ZIPКаталог = КаталогВременныхФайлов() + ВременноеИмяКаталога +  "/xlsx/";


а по итогам возврата таблицы
УдалитьФайлы(СтрЗаменить(ZIPКаталог, "/xlsx/", ""));
дабы удалить временный каталог.

ps для серверов на линуксе во избежание проблем с правами (и чтоб не давать рутовые права службе 1с, либо чтоб не давать владельца на всю папку темпов) - можно в темпе создать отдельную папку дать ей права владельца и модифицировать

ZIPКаталог = КаталогВременныхФайлов() +"папка_с_вашим_названием" + ВременноеИмяКаталога + "/xlsx/";
тогда "папка_с_вашим_названием" будет жить а содержимое дропаться сразу после возврата итоговой таблицы
user1114234; +1 Ответить
78. Vyacheslide 8 20.03.20 10:04 Сейчас в теме
Огроооомное спасибо за подробное описание. Взял к себе, под себя поправил и все гуд. Очень помогли!
Оставьте свое сообщение

См. также

GGraphics - внешняя компонента для работы с картинками jpg (jpeg), png, bmp, gif, tif Промо

Разработка внешних компонент v8 1cv8.cf Платные (руб)

Позволяет автоматизировать работу с картинками. С помощью компоненты можно измерять размер изображений, поворачивать их, наносить водяные знаки, конвертировать из одного формата в другой. Будет очень полезна для интернет-магазинов и всех, кому постоянно требуется работать с различными графическими форматами. Выполнена по технологии NativeAPI. Работает с форматами: jpg (jpeg), png, bmp, gif, tif

2000 руб.

02.09.2010    54353    62    207    

Интеграция "Библиотеки интеграции МДЛП 1.1.2.7" с типовой конфигурацией

Интеграция Конфигурирование 1С v8 Здравоохранение, медицина, стоматология Россия Бесплатно (free)

Инструкция для интеграции “Библиотеки интеграции МДЛП 1.1.2.7” в типовые конфигурации, на примере конфигурации “Управление нашей фирмой, редакция 1.6 (1.6.18.168)”.

02.03.2020    4380    0    RPGrigorev    3    

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

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

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

21.01.2020    21396    295    cprit    94    

Хранение файлов - как уменьшить размер базы данных

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

Хранение файлов в базе 1С можно оптимизировать для уменьшения размера хранимых данных.

09.09.2019    7957    0    2tvad    17    

Коннектор: удобный HTTP-клиент для 1С:Предприятие 8 Промо

Практика программирования Внешние источники данных WEB Универсальные функции Инструментарий разработчика Универсальные обработки v8 1cv8.cf Платные (руб)

Коннектор - библиотека для работы с HTTP запросами. Библиотека берет на себя всю рутину работы с HTTP запросами. Буквально в одну строку можно получать данные, отправлять, не заботясь о необходимости конструирования URL, кодирования данных и т.п.

2000 руб.

31.01.2019    45719    327    156    

1С:Ассемблер. Немного летнего веселья!

Практика программирования Разработка v8 1cv8.cf Абонемент ($m)

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

1 стартмани

21.06.2019    26442    77    Evil Beaver    119    

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

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

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

11.05.2019    26564    0    Eret1k    23    

Немного о графических файлах. Сжатие. Распознавание текста

Инструментарий разработчика v8 v8::УФ 1cv8.cf Россия Абонемент ($m)

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

1 стартмани

06.05.2019    6720    10    tusv    6    

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

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

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

04.03.2016    60335    0    starik-2005    99    

Практика перехода на Linux и Postgres в небольшой компании (10 пользователей)

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

Почему я решил поставить давнему клиенту Linux + Postgres вместо Windows + MS SQL? Что меня останавливало раньше?

22.04.2019    27852    0    starik-2005    169    

HTML-клиент у конфигурации 1С

WEB v8 Бесплатно (free)

Приветствую. В этой публикации опишу свой опыт создания html-клиента для конфигурации 1С с помощью http-сервисов. HTML-клиент в этом случае - это frontend (html + css+ js), который генерирует и выдает пользователю конфигурация + backend, который тоже реализован в этой же конфигурации.

17.04.2019    16933    0    Smaylukk    119    

Уменьшаем трафик: HTTP запрос со сжатием GZIP средствами 1С. На примере выгрузки файлов на Яндекс-диск

WEB v8 1cv8.cf Абонемент ($m)

Обработка демонстрирует отправку тела HTTP запроса со сжатием gzip (метод deflate) средствами платформы 1С. Демонстрация происходит на примере отправки текста или файла на Яндекс.Диск.

1 стартмани

03.09.2018    5852    29    uno-c    0    

Инструменты бухгалтера: Виджеты рабочего стола Промо

Универсальные обработки Рабочее место v8 v8::БУ БП3.0 Абонемент ($m)

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

2 стартмани

28.08.2017    35391    170    Bazil    28    

Чтение сжатого gzip, deflate HTTP ответа сервера. Без ВК. Уменьши время загрузки и сократи трафик в 3 раза

WEB v8 1cv8.cf Абонемент ($m)

В платформе 1С:Предприятие не реализовано штатного механизма декодирования ответа веб серверов, в которых присутствует gzip сжатие. Некоторые использовали WinHttpRequest.5.1 , кто-то писал ВК. Друзья, хватит. Вот вам решение.

1 стартмани

08.06.2018    13654    69    Malfarion    16    

Создание подключаемой обработки табличной части с диалогом запроса параметров заполнения (управляемые формы)

Обработка документов Обработка справочников Практика программирования v8::УФ 1cv8.cf Абонемент ($m)

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

1 стартмани

03.05.2018    45013    116    Mirage78    16    

Обработка печатной формы WORD клиент-сервер УФ

Универсальные печатные формы v8::УФ 1cv8.cf Абонемент ($m)

Это моя первая статья на данном портале, но попытаюсь изложить все понятно и подробно. Долгое время у меня заняло создание такой вот внешней обработки. Есть очень много примеров, как сделать подобное на неуправляемых формах (2.0) и очень мало информации касательно управляемых(3.0), по крайней мере я многого найти не смог в доступе. Создание подобное обработки выглядит вполне несложно, если производить все действия на сервере, как это было с 2.0, но в нашем случае необходимо инициализировать открытие документа на клиенте, чему сильно мешает отсутствие возможности передать макет Active Document с сервера на клиент.

2 стартмани

14.03.2018    23819    83    LeoKeyn    41    

Gant 1C 2.* - диаграмма Ганта с таблицей + Планировщик + Отчет (8.1, на управляемой форме/Такси 8.2, 8.3) Промо

Рабочее место Универсальные обработки Управление проектом Финансовый учет и бюджетирование (FRP) Производство готовой продукции (работ, услуг) Учет рабочего времени Финансовый учет и бюджетирование (FRP) Производство готовой продукции (работ, услуг) Учет рабочего времени v8 1cv8.cf УУ Абонемент ($m)

Внешняя обработка, аналог MS Project в 1Се для работы с задачами: параллельный ввод данных по задачам и график Ганта, дополнительный режим в виде календаря (планировщик), связывание задач и пересчет длительности и дат с учетом выходных, видов связей и запаздываний, расчет затрат, сохранение/открытие проектов в файл на диск или файл ИБ, импорт/экспорт документов Microsoft Project.

1 стартмани

02.12.2011    136019    1068    rare-avis    210    

“Заставим сканер пищать!” или Получаем обратную связь из 1С при сканировании штрихкодов

Сканер штрих-кода Учет ТМЦ Учет ТМЦ v8 1cv8.cf Абонемент ($m)

Получаем обратную связь из 1С при сканировании штрихкодов.

1 стартмани

10.01.2018    40816    100    vadnevzorov    70    

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

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

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

19.11.2017    182290    0    MaxS    285    

Зачем 1С-нику NoSQL и CRDT

WEB Интеграция Бесплатно (free)

В статье речь пойдет о современных инструментах для хранения, транспорта, обработки и обмена данными на примере популярной NoSQL-базы CouchDB.

12.08.2017    22767    0    unpete    27    

Маркировка: 2D Android Штрихкод сканер + драйвер устройства для 1С Промо

Сканер штрих-кода Розничная торговля Розничная торговля v7.7 v8 1cv8.cf 1cv7.md Абонемент ($m)

Драйвер торгового оборудования и приложение для Android, телефон или планшет в качестве стандартного штрихкод сканера для платформы 1С.

3 стартмани

29.11.2016    44090    176    dreamadv    110    

Как я стал одинэсником и переехал из провинции в Москву

О жизни Россия Бесплатно (free)

История покорения Москвы.

29.07.2017    16834    0    DmitryKSL    132    

54 ФЗ своими руками

ККМ Кассовые операции Розничная торговля Кассовые операции Розничная торговля v8 Розница Розничная и сетевая торговля (FMCG) Россия УУ Бесплатно (free)

Практический опыт внедрения изменений в 54ФЗ в розничной сети, работающей на 1С. Если вы не хотите платить каким-либо подрядчикам, которые "всё сделают и настроят за вас", то статься может оказаться крайне полезной.

17.04.2017    57632    0    comol    124    

Формирование штрихкода EAN-13 в SVG с помощью XDTO

Практика программирования v8 1cv8.cf Россия Абонемент ($m)

В версии платформы 8.3.9 было объявлено о поддержке изображений в формате SVG. Данная обработка демонстрирует работу с данным форматом, а именно его формированием (рисованием). Ну а так как самой популярной картинкой в 1С, наверное, является картинка штрихкода EAN - ее я и решил рисовать.

1 стартмани

24.03.2017    11960    53    kot-stas    19    

Удаление организации из 1С. Чистка базы 1С. Удаление "не удаляемых" объектов Промо

Чистка базы v8 1cv8.cf Абонемент ($m)

Удалить все документы, чтобы в базе осталась только одна организация со своими документами? Удалить всю информацию в регистрах, не связанную с указанной фирмой? Удалить "неудаляемую" номенклатуру? Легко! Используйте эту обработку.

10 стартмани

02.10.2015    51121    309    spy-83    84    

План обмена в формате "EnterpriseData" для 1С 7.7

Обмен через XML 1С7.7<->1C7.7 v7.7 1С7:ТиС Абонемент ($m)

Пример организации надёжной синхронизации данных через универсальный формат "EnterpriseData" между конфигурациями на базе 1С 7.7 и произвольными приложениями.

1 стартмани

07.01.2017    21905    24    binex    23    

"Распределение в запросе" или "избавляемся от перебора"

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

Хороший перебор - это отсутствие перебора. Рассмотрим пример замены полного перебора запросом.

16.12.2016    32799    0    alexandersh    48    

Разбираемся с механизмом Дополнительные отчеты и обработки в БСП

Практика программирования БСП (Библиотека стандартных подсистем) v8 1cv8.cf Абонемент ($m)

Чуть более комплексное описание, чем на других ресурсах

1 стартмани

30.10.2016    140879    954    json    66    

Монитор журнала регистрации Промо

Журнал регистрации Администрирование данных 1С WEB v8 1cv8.cf Абонемент ($m)

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

2 стартмани

29.06.2015    39887    106    andy23    49    

Редактирование табличной части объекта с помощью СКД

Инструментарий разработчика Практика программирования v8::СКД 1cv8.cf Россия Абонемент ($m)

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

2 стартмани

16.09.2016    24497    96    Hatson    27    

Примеры скриптов на OneScript

OneScript Россия Абонемент ($m)

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

1 стартмани

14.07.2016    28603    41    Drak0n    43    

Набор данных Объект в СКД для решения задач сортировки, нумерации и вывода в отчет произвольных наборов данных

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

Использование набора данных Объект в СКД, может добавить вашему отчету новые интересные возможности. В этой статье я покажу, как я использовал набор данных Объект при решении одной задачи.

04.07.2016    44756    0    lopatin    12    

Опыт оптимизации и контроля производительности в БД с 3000 пользователей Промо

Производительность и оптимизация (HighLoad) Бесплатно (free)

Данная статья написана по материалам доклада, прочитанного на Конференции Инфостарта IE 2014 29-31 октября 2014 года. Меня зовут Сергей, являюсь руководителем отдела оптимизации и производительности систем в компании "Деловые линии". Цель этого доклада – поделиться информацией о нашем опыте работы с большой базой на платформе 1С, с чем пришлось столкнуться, как удалось обеспечить работоспособность. Уверен, что вам будет интересно, так как подобной информацией мало кто делится, да и про само существование таких систем их владельцы стараются не рассказывать, максимум про это «краем глаза» упоминают участвовавшие в проекте вендоры. **update от 04.03.2016 по вопросам из комментариев

05.08.2015    60368    0    Sergey.Noskov    119    

Учет путевых листов

Обработка документов Печатные формы документов Учет рабочего времени Учет ТМЦ Учет рабочего времени Учет ТМЦ v8 v8::УФ 1cv8.cf БУ УУ Абонемент ($m)

Внешняя обработка по учету путевых листов для управляемых форм. Позволяет сохранять во внешнем файле данные об автомобилях, водителях и путевых листах. Позволяет печатать формы №3 и №4-П. Позволяет вести учет задолженностей водителей за бензин и сравнивать расход по норме (по показаниям спидометра) и фактический расход бензина.

3 стартмани

27.06.2016    14128    79    DrugOn    10    

Google Analytics API, Oauth2.0 и 1c8

Практика программирования WEB v8 1С:Франчайзи, автоматизация бизнеса Бесплатно (free)

Обращение к Google Analytics API, Протокол Oauth 2.0 и запросы от 1С:8 без авторизации пользователя

02.05.2016    25627    0    Ольга_tmp    18    

УПД для документа "Поступление товаров и услуг" (БП 3.0) за поставщика

Печатные формы документов Оптовая торговля Производство готовой продукции (работ, услуг) Оптовая торговля Производство готовой продукции (работ, услуг) v8 v8::БУ БП3.0 Россия БУ Абонемент ($m)

Внешняя печатная форма для документа "Поступление товаров и услуг" позволяет печатать "Универсальный передаточный документ (УПД)" за поставщика в ред. постановления Правительства РФ 1137, 625 и 981

1 стартмани

20.12.2015    22004    273    romanco    18    

Автоматический REST-сервис в «1С:Предприятии». OData. Пример работы из Jscript/AJAX Промо

Практика программирования WEB v8 1cv8.cf Абонемент ($m)

Небольшой обзор REST-сервиса в «1С:Предприятии». Рассмотрен механизм работы c REST-сервером 1С:Предприятия из внешнего приложения - веб-страницы с использованием языка JavaScript и технологии AJAX.

1 стартмани

08.10.2014    76664    75    vano-ekt    48    

Автозаполнение адресов в 1С (API Google autocomplete place)

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

В данной статье вы увидите пример, как можно с помощью API Google autocomplete place делать подсказки при заполнении адреса

19.10.2015    12913    0    d.alexandr    26    

Использование встроенных отчетов для создания анализа корректности данных при исчислении НДС с авансов полученных

Бухгалтерский учет v8 БП2.0 Россия БУ НДС Бесплатно (free)

На Инфостарте много выложено внешних отчетов, направленных на контроль правильности исчисления НДС с авансов полученных. Хочу поделиться своим опытом использования встроенного отчета (для Бухгалтерия предприятия.Редакция 3.0) и порядка создания настроек отчета для процедур контроля за исчислением НДС с авансовых платежей покупателей, особенно в случаях применения различных налоговых ставок НДС

1 стартмани

22.07.2015    8781    0    lvk74    3    

Дополнительные отчеты и обработки для конфигураций, основанных на БСП. Часть 1. Заполнение объектов.

Практика программирования БСП (Библиотека стандартных подсистем) v8 1cv8.cf Россия Абонемент ($m)

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

1 стартмани

08.01.2015    35070    72    acrk    23    

Создание внешних печатных форм под управляемым приложением с нуля Промо

Печатные формы документов v8 v8::УФ 1cv8.cf Абонемент ($m)

Когда мне пришлось создавать внешние печатные формы под приложения на БСП ("1С: Бухгалтерия предприятия 3.0", "1С: Управление торговлей 11"), я обнаружил, что нет грамотных инструкций. Те, что имелись, использовали так называемые шаблоны: готовые обработки, в которых необходимо выполнять определенные корректировки. Но как создать сам шаблон, конкретных мануалов не было, справочную информацию я нашел на сайте ИТС и, обработав ее, написал статью, где подробно и понятно объясняются все этапы создания внешней печатной формы для управляемого приложения на примере конфигурации "1С: Бухгалтерия предприятия 3.0"

1 стартмани

05.06.2014    263808    391    signum2009    127    

Настройка ТСД chiperLab 8001 для УТ 11

Терминал сбора данных Учет ТМЦ Учет ТМЦ v8 УТ10 УУ Абонемент ($m)

Расширяем функционал ТСД chiperLab 8001 и загружаем сразу 10 документов Сканируйте 10 накладных за один раз!!!

1 стартмани

23.10.2014    24528    21    antonlinux    4    

Работа с принтером чеков Posiflex PP 6000, 7000, 8000

POS терминал Россия Абонемент ($m)

Некоторые варианты для работы с принтером чеков POSIFLEX AURA 6000, 7000, 8000.

1 стартмани

18.08.2014    64700    146    MrFlanker    24    

Подписываем файлы с помощью ЭЦП средствами 1с Промо

Универсальные обработки Защита и шифрование v8 1cv8.cf Абонемент ($m)

Обработка для подписи с помощью сертификата (ЭЦП) произвольных файлов, только средствами платформы 1с. Работает на всех конфигурациях, но только на последних платформах 8.2 и 8.3, где есть менеджер криптографии.

1 стартмани

05.09.2013    60640    255    anig99    25    

1С Бухгалтерия 8. Часть 1: Настройка параметров учета Промо

Управленческий учет (прочее) v8 БП2.0 Россия БУ Бесплатно (free)

Залогом правильного ведения бухгалтерского и налогового учета в программе 1С Бухгалтерия 8 является правильная настройка параметров учета и учетной политики. Разработчики 1С постарались, чтобы эти настройки были простыми и понятными. Тем не менее, есть ряд подводных камней, о которые могут спотыкаться даже опытные пользователи.

05.11.2011    223362    0    vdi1950    124