Как открыть файл excel на сервере

Содержание

  1. О том, как мы на PHP запускали настоящий MS Excel и что из этого вышло
  2. Требуется
  3. Сервер под Windows? А почему бы нет!
  4. Настраиваем сборку на Windows или Как наступить на все подводные камни?
  5. COM-объекты в PHP
  6. Вместо заключения
  7. Литература
  8. Загрузка из EXCEL на сервере
  9. Как прочитать файл Excel в 1С 8.3
  10. Содержание
  11. Общая информация
  12. Использование объекта ВременноеХранилище
  13. Вспомогательные процедуры — диалог выбора файла
  14. Двоичные данные во временное хранилище
  15. Помещение файла на сервер в 1С

О том, как мы на PHP запускали настоящий MS Excel и что из этого вышло

Не секрет, что зачастую PHP-программистам приходится решать задачи, весьма далёкие от бытового представления о «веб-разработке». Развитие языка в последние годы привело к тому, что PHP всё чаще считают языком общего назначения, пригодным не только для сайтов, но и для других задач.

Одну из таких «других» задач мне с коллективом пришлось решать совсем недавно. Мы решили поделиться «картой граблей» с теми, кто, возможно, пойдет по этому же пути.

  • Многие наши партнёры (скажем прямо — это крупные банки) любят считать что-то в Excel. Причем «любят» — это очень нежно сказано. Сложнейшие скоринговые модели могут быть «запрограммированы» в Excel, в файле из сотни листов с десятками макросов
  • Перевести «программы», написанные в Excel на какой-либо язык программирования — практически нереально. Это займет уйму времени, а проблема постоянного обновления и проверки корректности делает такую задачу и вовсе нерешаемой

Требуется

  • Основная информационная система нашей компании написана на PHP. Она содержит в себе как веб-интерфейсы, так и множество консольных сервисов и воркеров.
  • С этими «программами» в Excel нужно как-то взаимодействовать из консольных приложений на PHP — передавать в них данные, обсчитывать, получать результаты

Некоторое время нам хватало возможностей популярной библиотеки PHPExcel. Но когда от бизнеса поступило очередное требование «нужно, чтобы работали макросы, и еще бы хорошо всё это сохранять в PDF», стало понятно, что выбранный путь — тупиковый. Нужно не парсить файлы xlsx, не имитировать просчёт, и даже не использовать Open Office, а научиться взаимодействовать с «настоящим» Microsoft Excel.

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

Сервер под Windows? А почему бы нет!

Первым под удар попал отдел dev-ops. Им предстояло подготовить сервер для будущего сервиса. Дело было необычным, поскольку актуального опыта работы с Windows ни у кого нет…

В качестве серверной платформы был выбран Windows Server 2012 R2 standart. Нужно сразу отметить, что «из коробки» Windows совершенно не приспособлена к хостингу приложений на PHP. Требовалось доведение системы до нужного уровня.

Для начала был установлен PowerShellServer. Это позволило нам подключаться к windows-серверу по привычному всем протоколу ssh, не изобретая велосипедов. Поддерживается авторизация по ключам, работает rsync (это важно). Жаль, что в Personal Edition ограничение только на одно одновременное подключение, но для нас это некритично.

Nginx был установлен штатным образом. Взят со страницы nginx.org/ru/download.html Имейте в виду — под windows есть существенные ограничения: только один рабочий процесс, который держит не более 1024 соединений. Впрочем, это опять же было некритично для внутреннего микро-сервиса.

PHP 7.0.9 взят с windows.php.net/download, установлен штатным образом.

Для упрощения перезапуска всего этого «добра» был написан несложный cmd-файл:

Первоначальная настройка сервера закончилась успешным выводом страницы с phpinfo(). Однако это было еще только самое начало…

Настраиваем сборку на Windows или Как наступить на все подводные камни?

Мы внутри компании используем Continuous Integration. Всегда. Для любого, сколь угодно малого проекта. Примерный план развертывания выглядит так:

  • Сервер Teamcity следит за изменениями в нужных ветках репозитория (в данном конкретном случае workflow был упрощен до предела и ветка была фактически одна — master)
  • Он же запускает сборку проекта при появлении изменений:
    • Содержимое репозитория с сервера TeamCity с помощью rsync доставляется на целевой сервер, во временную папку (это даёт нам возможность сэкономить на агентах TeamCity)
    • Там же, с помощью ssh, запускается билд-скрипт на phing, который и делает основную работу:
      • Переносит код в постоянное место
      • Устанавливает зависимости через composer
      • Раскладывает конфиги
      • Применяет миграции и так далее.
      • И, наконец, переключает симлинк current (это у нас wwwroot), на новую папку

Что потребовалось далее? ssh-сервер уже установлен, rsync выполняется корректно. Установим phing:

  • Исполняемый файл (phing.phar) берем с www.phing.info/trac/wiki/Users/Installation
  • Аккуратный и красивый bat-ник можно взять на www.phing.info/trac/browser/bin/phing.bat
  • Не забываем добавить путь до phing в PATH, чтобы получить system-wide команду

Git for Windows берем с git-scm.com, устанавливаем, проверяем корректную работу.

Точно по такой же схеме поступаем с composer, только bat-файл пишем сами и он будет значительно проще:

Вроде бы всё готово. Запускаем сборку… fail!

Причина 1. Нужно установить расширение php_openssl.dll, иначе Phing не сможет работать с репозиториями через SSL. Проблем не доставило.

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

В результате получается что-то вроде
symlink: «c:serverdomainsthis.servicemastercurrent» => «c:serverdomainsthis.servicemaster2016-04-01-12-34-56»

Оказалось, что создать символическую ссылку на NTFS — не проблема. Проблема ее удалить… Отчего-то операция удаления симлинка требует прав администратора, которых у обычного PHP нет и быть не может.

Нам помогла утилита junction ( technet.microsoft.com/en-us/sysinternals/bb896768 ). С ней вышеуказанный кусок сценария стал выглядеть примерно так:

Итак, всё встало на свои места, сборка заработала, как ей и положено. Настала пора писать код!

COM-объекты в PHP

Надо отметить, что собственно код сервиса не доставил никаких проблем.

Как запустить приложение Microsoft Excel и загрузить в приложение существующий файл?

Как закрыть приложение после окончания работы скрипта?

Получить список всех именованных диапазонов?

Установить значение ячейки или диапазона?

Прочесть значение из ячейки или диапазона?
Возвращается либо скалярное значение из одной ячейки, либо массив значений, если мы запрашиваем диапазон.

Экспортировать книгу в PDF?

Что надо сделать, чтобы вся эта безумная магия заработала?
Добавить расширение php_com_dotnet.dll

Вместо заключения

Довольно феерично наблюдать за сервером: при приходе запроса мгновенно открывается Excel, запускается экспорт и потом также мгновенно всё это хозяйство закрывается.

Удачи и не наступайте на те же грабли!

Литература

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

1. Нет, задача не сводится к тому, чтобы какой-то библиотекой для PHP уметь писать в файлы формата Excel или читать данные из них. Статья не об этом. Задача — запускать расчеты, алгоритм которых задан извне в виде файлов Excel (и нет никакой возможности алгоритм преобразовать во что-то другое), подавать на вход данные, получать ответы, формировать отчет. Для этой цели нет другого решения, кроме как запустить файл в «родном» приложении Microsoft Excel.

2. Файлов — сотни. Запросов на расчеты (то есть на запуск таких файлов) — тысячи в день. Это приводит нас к невозможности решения «а пусть кто-то сам вручную запускает эти файлы». Требуется полная и надежная автоматизация.

3. См. предыдущий пункт. Перевод алгоритмов на какой-либо язык программирования невозможен, поскольку затраты на верификацию и QA превысят затраты на windows-сервер на три порядка.

4. Веб-сервис написан для использования другими сервисами, а не клиентами-людьми.

5. Немного изменил метод public function getValue($range), чтобы показать, как прочесть диапазон ячеек, как одно целое. Добавил метод получения списка всех именованных диапазонов.

Источник

Загрузка из EXCEL на сервере

Здравствуйте! Подскажите что может быть, ситуация следующая.
Есть сервер, на нем крутится 1С.
Есть база в которую идет загрузка из 1С(КС вариант).
Так вот при передачи фала EXCEL с клиента на сервер происходит сохранение данного файла в определенной папке(в контексте сервера), потом так же в контексте сервера происходит попытка открытия этого файла — но вылетает ошибка :
————————————————-
<Документ.КонкурсПоУслугам.Форма.ФормаЗагрузкиИзEXCEL.Форма(36)>: Ошибка при вызове метода контекста (Open)
Книга = Эксель.WorkBooks.Open(ИмяФайла);
по причине:
Произошла исключительная ситуация (Microsoft Excel): Приложению Microsoft Excel не удается получить доступ к файлу «G:1C_TempШахматка_08_11_2012_02_06_32.xlsx». Это может быть вызвано одной из следующих причин.

• Указан несуществующий файл или путь.
• Файл используется другой программой.
• Имя книги, которую вы пытаетесь сохранить, совпадает с именем другой книги, открытой в данный момент.
————————————————-
Код который все это делает ниже:
————————————————-
//2. Получим файлик для загрузки из временного хранилища
ИмяФайла = «G:1C_TempШахматка_»+Формат(ТекущаяДата(),»ДФ=dd_MM_yyyy_hh_mm_ss»)+».xlsx»;//Сисадмины сказали что в темпе хранит не феншуйно и выделили отдельную папку
Файлик = ПолучитьИзВременногоХранилища(АдресВовременномХранилище);
Файлик.Записать(ИмяФайла);

//3. Попробуем открыть EXCEL
Попытка Эксель = Новый COMОбъект(«Excel.Application»);
Исключение Сообщить(ОписаниеОшибки()); УдалитьФайлы(ИмяФайла); Возврат Неопределено;
КонецПопытки;
————————————————-
Перед открытием файлика, в режиме отладки, проверял — он существует(ФС.Существует()). Другой программой он не используется так как создается. у пользователя под которым выполняется код на стороне сервера разрешение на чтение/запись файла есть.
Что может быть, куда копать?

выложил не весь код.Вот весь:
//2. Получим файлик для загрузки из временного хранилища
ИмяФайла = «G:1C_TempШахматка_»+Формат(ТекущаяДата(),»ДФ=dd_MM_yyyy_hh_mm_ss»)+».xlsx»;//Сисадмины сказали что в темпе хранит не феншуйно и выделили отдельную папку
Файлик = ПолучитьИзВременногоХранилища(АдресВовременномХранилище);
Файлик.Записать(ИмяФайла);

//3. Попробуем открыть EXCEL
Попытка Эксель = Новый COMОбъект(«Excel.Application»);
Исключение Сообщить(ОписаниеОшибки()); УдалитьФайлы(ИмяФайла); Возврат Неопределено;
КонецПопытки;

//4. Откроем файлик и книгу
Книга = Эксель.WorkBooks.Open(ИмяФайла);
Лист = Книга.WorkSheets(НомерЛиста);

(1) если бы.Ставил точку останова на
Книга = Эксель.WorkBooks.Open(ИмяФайла);
находил этот файлик по ИмяФайла, открывал его, закрывал и продолжал откладку.Все равно куй.

Вызов на стороне клиента:
&НаКлиенте
Процедура Загрузить(Команда)

//1. Поместим наш файлик во временное хранилище
Перем АдресВовременномХранилище;
Если Не ЗначениеЗаполнено(Файл) Тогда Возврат; КонецЕсли;
ПоместитьФайл(АдресВовременномХранилище, Файл, , Ложь);

//2. Произведем чтение и разбор этого файла
Адрес = ПроизвестиЧтениеГоризонтальнойШахматки(АдресВовременномХранилище);

//3. Оповестим о том что все сделано
Если ЭтоАдресВременногоХранилища(Адрес) Тогда
ОповеститьОВыборе(Новый Структура(«ДанныеЗагрузки», Адрес));
Иначе
ЭтаФорма.Закрыть();
КонецЕсли;
КонецПроцедуры

Вызов на стороне сервера:
&НаСервере
Функция ПроизвестиЧтениеГоризонтальнойШахматки(АдресВовременномХранилище)

//1. Сформируем табличку в которую будем загружать
тзУслуги = Новый ТаблицаЗначений;
тзУслуги.Колонки.Добавить(«Лот» , Новый ОписаниеТипов(«СправочникСсылка.Объекты»));
тзУслуги.Колонки.Добавить(«Услуга» , Новый ОписаниеТипов(«СправочникСсылка.Объекты»));
тзУслуги.Колонки.Добавить(«Марка» , Новый ОписаниеТипов(«Строка»));
тзУслуги.Колонки.Добавить(«ЕдиницаИзмерения», Новый ОписаниеТипов(«СправочникСсылка.ЕдиницыИзмерения»));
тзУслуги.Колонки.Добавить(«Количество» , Новый ОписаниеТипов(«Число»));
тзУслуги.Колонки.Добавить(«ПДЦБезНДС» , Новый ОписаниеТипов(«Число»));
тзУслуги.Колонки.Добавить(«ПДЦ» , Новый ОписаниеТипов(«Число»));
тзУслуги.Колонки.Добавить(«Дорога» , Новый ОписаниеТипов(«СправочникСсылка.Дороги»));
тзУслуги.Колонки.Добавить(«УчастникКонкурса», Новый ОписаниеТипов(«СправочникСсылка.Организации»));
тзУслуги.Колонки.Добавить(«ФКП» , Новый ОписаниеТипов(«Число»));
тзУслуги.Колонки.Добавить(«ФКП_БезНДС» , Новый ОписаниеТипов(«Число»));

//2. Получим файлик для загрузки из временного хранилища
//ИмяФайла = «G:1C_TempШахматка_»+Формат(ТекущаяДата(),»ДФ=dd_MM_yyyy_hh_mm_ss»)+».xlsx»;//Сисадмины сказали что в темпе хранит не феншуйно и выделили отдельную папку
ИмяФайла = «G:1С ОбработкиШахматка.xlsx»;
Файлик = ПолучитьИзВременногоХранилища(АдресВовременномХранилище);
Файлик.Записать(ИмяФайла);
Файлик = «»;

//3. Попробуем открыть EXCEL
Попытка Эксель = Новый COMОбъект(«Excel.Application»);
Исключение Сообщить(ОписаниеОшибки()); УдалитьФайлы(ИмяФайла); Возврат Неопределено;
КонецПопытки;

//4. Откроем файлик и книгу
Книга = Эксель.WorkBooks.Open(ИмяФайла);
Лист = Книга.WorkSheets(НомерЛиста);

//5. Получим количество колонок и строк
ВсегоКолонок = Лист.Cells(1,1).SpecialCells(11).Column;
ВсегоСтрок = Лист.Cells(1,1).SpecialCells(11).Row;

//Далше всякая ерунда, она не нужна что бы глаз не мозолить
КонецФункции

Источник

Как прочитать файл Excel в 1С 8.3

Весьма частая задача, с которой сталкивается 1С разработчик – это чтение файлов Excel и загрузка их в 1С. Есть как минимум два способа прочитать файл Excel – средствами платформы 1С, или используя COM-объект приложения MS Excel. В статье рассматривается чтение файлов xls, xlsx при помощи табличного документа.

Содержание

Общая информация

В платформе 1С 8 существует объект ТабличныйДокумент, который позволяет формировать и выводить на экран печатные формы в табличном виде. Но у табличного документа есть еще одно применение – чтение данных из табличных файлов. Поддерживаются форматы xls, xlsx и ods. Т.е. можно загружать табличные файлы, созданные в пакете MS Office или OpenOffice Calc.

Значения типа Число или Дата, содержащиеся в ячейках исходного табличного файла, можно считать двумя способами – как значение, либо как текст. Рассмотрим пример: пусть в ячейке содержится число 123,456, и установлен формат с округлением до целого числа; в этом случае отображаться будет текст “123”, а значение будет храниться 123,456

  1. Если прочитать с указанием способа чтения как “Значение”, в табличный документ 1С будет прочитано исходное значение 123,456
  2. Если прочитать с указанием способа чтения как “Текст”, значение будет потеряно, и в табличный документ прочитается текст “123”

Использование объекта ВременноеХранилище

Вспомогательные процедуры — диалог выбора файла

Следующий код не является обязательным для решения задачи – путь к исходному файлу можно указать в коде, ввести вручную, скопировать из адресной строки ОС или прочитать из БД – вариантов очень много. Мы же рассмотрим пример, когда пользователь сам указывает файл на клиентском компьютере, и путь к этому файлу помещается в реквизит. В примере будем использовать реквизит формы ПутьКФайлу

Создадим обработчик события НачалоВыбора:

Для того чтобы код был универсальным, и работал в случае отказа от модальных синхронных методов, нам понадобится создать асинхронную процедуру ВыбратьФайлНаКлиенте(). В ней мы создаем диалог выбора для открытия файла, указываем фильтр с нужными форматами – xls и xlsx, а также отключаем множественный выбор файлов. Перед методом ВыбратьАсинх добавляем ключевое слово Ждать, с тем чтобы дальнейший код дождался возвращаемого значения.

Двоичные данные во временное хранилище

Логика кода будет следующая. Нам понадобятся двепроцедуры – клиентский обработчик команды, и серверный метод который и будет непосредственно считывать переданный файл.

  1. проверяем, указан ли путь к файлу. Если не указан – прекращаем выполнение
  2. Получаем двоичные данные из файла по указанному пути
  3. Помещаем эти двоичные данные во временное хранилище
  4. Далее передаем на сервер адрес этого временного хранилища
  1. Создаем временный файл с нужным расширением (в примере – xlsx)
  2. Получаем двоичные данные из временного хранилища
  3. Записываем во временный файл
  4. Определяем вариант чтения файла – читать значения табличного документа как текст, или как значения
  5. Далее используем метод Прочитать, и считываем из временного файла данные в табличный документ

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

Рассмотренный пример является достаточно универсальным – процедуру ПрочитатьИзВХНаСервере() можно использовать с любыми двоичными данными, помещенными во временное хранилище. Это могут быть двоичные данные, полученные с веб-сервиса, считанные из базы данных, полученные из макета, созданного в конфигураторе – код от этого не изменится.

Помещение файла на сервер в 1С

Более простой, но менее универсальный способ, предназначенный исключительно для передачи файла с клиента на сервер – это использование метода НачатьПомещениеФайлаНаСервер. В платформе предусмотрено несколько методов для помещения файлов – как одиночных, так и нескольких одновременно. Эти методы делятся на синхронные и асинхронные. Начиная с версии 8.3.18 появились методы, использующие ключевые слова Асинх и Ждать. Аналогичный метод мы рассмотрели при работе с диалогом. Далее разберем “классический” вариант с обработкой оповещения.

Логика кода следующая:

  1. Создаем описание оповещения и указываем в нем процедуру, которая будет вызвана после окончания помещения файла на сервер
  2. Указываем параметры диалога выбора файла и добавляем фильтр
  3. Вызываем помещение файла на сервер
  4. После того как файл помещен во временное хранилище, используем ту же процедуру, которую мы реализовали в первом примере – ПрочитатьИзВХНаСервере. В этом примере мы для разнообразия используем способ чтения значений как “Текст”.

Источник

Весьма частая задача, с которой сталкивается 1С разработчик – это чтение файлов Excel и загрузка их в 1С. Есть как минимум два способа прочитать файл Excel – средствами платформы 1С, или используя COM-объект приложения MS Excel. В статье рассматривается чтение файлов xls, xlsx при помощи табличного документа.

Содержание

Общая информация

В платформе 1С 8 существует объект ТабличныйДокумент, который позволяет формировать и выводить на экран печатные формы в табличном виде. Но у табличного документа есть еще одно применение – чтение данных из табличных файлов. Поддерживаются форматы xls, xlsx и ods. Т.е. можно загружать табличные файлы, созданные в пакете MS Office или OpenOffice Calc.

Значения типа Число или Дата, содержащиеся в ячейках исходного табличного файла, можно считать двумя способами – как значение, либо как текст. Рассмотрим пример: пусть в ячейке содержится число 123,456, и установлен формат с округлением до целого числа; в этом случае отображаться будет текст “123”, а значение будет храниться 123,456

  1. Если прочитать с указанием способа чтения как “Значение”, в табличный документ 1С будет прочитано исходное значение 123,456
  2. Если прочитать с указанием способа чтения как “Текст”, значение будет потеряно, и в табличный документ прочитается текст “123”

Использование объекта ВременноеХранилище

Вспомогательные процедуры — диалог выбора файла

Следующий код не является обязательным для решения задачи – путь к исходному файлу можно указать в коде, ввести вручную, скопировать из адресной строки ОС или прочитать из БД – вариантов очень много. Мы же рассмотрим пример, когда пользователь сам указывает файл на клиентском компьютере, и путь к этому файлу помещается в реквизит. В примере будем использовать реквизит формы ПутьКФайлу

Чтение файла Excel. Диалог выбора файла

Создадим обработчик события НачалоВыбора:

&НаКлиенте
Процедура ПутьКФайлуНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	ВыбратьФайлНаКлиенте();
	
КонецПроцедуры

Для того чтобы код был универсальным, и работал в случае отказа от модальных синхронных методов, нам понадобится создать асинхронную процедуру ВыбратьФайлНаКлиенте(). В ней мы создаем диалог выбора для открытия файла, указываем фильтр с нужными форматами – xls и xlsx, а также отключаем множественный выбор файлов. Перед методом ВыбратьАсинх добавляем ключевое слово Ждать, с тем чтобы дальнейший код дождался возвращаемого значения.

&НаКлиенте
Асинх Процедура ВыбратьФайлНаКлиенте()
	
	Перем Диалог;
	
	Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
	Диалог.Фильтр = "Excel файлы(*.xls;*.xlsx)|*.xls;*.xlsx";
	Диалог.ИндексФильтра = 0;
	Диалог.ПредварительныйПросмотр = Ложь;
	Диалог.МножественныйВыбор = Ложь; 
	РезультатВыбора = Ждать Диалог.ВыбратьАсинх();
	Если РезультатВыбора <> Неопределено Тогда
		ПутьКФайлу = РезультатВыбора[0];
	КонецЕсли;
	
КонецПроцедуры

Двоичные данные во временное хранилище

Логика кода будет следующая. Нам понадобятся двепроцедуры – клиентский обработчик команды, и серверный метод который и будет непосредственно считывать переданный файл.

Клиентский код:

  1. проверяем, указан ли путь к файлу. Если не указан – прекращаем выполнение
  2. Получаем двоичные данные из файла по указанному пути
  3. Помещаем эти двоичные данные во временное хранилище
  4. Далее передаем на сервер адрес этого временного хранилища
&НаКлиенте
Процедура ДвоичныеДанныеВоВременноеХранилище(Команда)

	Если Не ЗначениеЗаполнено(ПутьКФайлу) Тогда
		Возврат;
	КонецЕсли;
	
	ДД = Новый ДвоичныеДанные(ПутьКФайлу);
	АдресВХ = ПоместитьВоВременноеХранилище(ДД);
	ПрочитатьИзВХНаСервере(АдресВХ);
	
КонецПроцедуры

Серверный код:

  1. Создаем временный файл с нужным расширением (в примере – xlsx)
  2. Получаем двоичные данные из временного хранилища
  3. Записываем во временный файл
  4. Определяем вариант чтения файла – читать значения табличного документа как текст, или как значения
  5. Далее используем метод Прочитать, и считываем из временного файла данные в табличный документ

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

&НаСервере
Процедура ПрочитатьИзВХНаСервере(АдресВХ, Режим = "Значение")
	
	ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xlsx");
	
	ДД = ПолучитьИзВременногоХранилища(АдресВХ);
	ДД.Записать(ИмяВременногоФайла);

	Если Режим = "Текст" Тогда
		СпособЧтения = СпособЧтенияЗначенийТабличногоДокумента.Текст;
	Иначе
		СпособЧтения = СпособЧтенияЗначенийТабличногоДокумента.Значение;
	КонецЕсли;

	Попытка
		ТабДок.Прочитать(ИмяВременногоФайла, СпособЧтения);
	Исключение
	КонецПопытки;	
	
КонецПроцедуры

Рассмотренный пример является достаточно универсальным – процедуру ПрочитатьИзВХНаСервере() можно использовать с любыми двоичными данными, помещенными во временное хранилище. Это могут быть двоичные данные, полученные с веб-сервиса, считанные из базы данных, полученные из макета, созданного в конфигураторе – код от этого не изменится.

Помещение файла на сервер в 1С

Более простой, но менее универсальный способ, предназначенный исключительно для передачи файла с клиента на сервер – это использование метода НачатьПомещениеФайлаНаСервер. В платформе предусмотрено несколько методов для помещения файлов – как одиночных, так и нескольких одновременно. Эти методы делятся на синхронные и асинхронные. Начиная с версии 8.3.18 появились методы, использующие ключевые слова Асинх и Ждать. Аналогичный метод мы рассмотрели при работе с диалогом. Далее разберем “классический” вариант с обработкой оповещения. 

Логика кода следующая:

  1. Создаем описание оповещения и указываем в нем процедуру, которая будет вызвана после окончания помещения файла на сервер
  2. Указываем параметры диалога выбора файла и добавляем фильтр
  3. Вызываем помещение файла на сервер
  4. После того как файл помещен во временное хранилище, используем ту же процедуру, которую мы реализовали в первом примере – ПрочитатьИзВХНаСервере. В этом примере мы для разнообразия используем способ чтения значений как “Текст”.
&НаКлиенте
Процедура ПередачаФайла(Команда)
	
ОбработкаОкончанияПомещения = Новый ОписаниеОповещения("ОбработчикОкончанияПомещения", ЭтотОбъект);
ПараметрыДиалога = Новый ПараметрыДиалогаПомещенияФайлов;
ПараметрыДиалога.Фильтр = "Excel файлы(*.xls;*.xlsx)|*.xls;*.xlsx";
НачатьПомещениеФайлаНаСервер(ОбработкаОкончанияПомещения, , , АдресВХ, ПараметрыДиалога, ЭтотОбъект.УникальныйИдентификатор);
	
КонецПроцедуры

&НаКлиенте
Процедура ОбработчикОкончанияПомещения(ОписаниеПомещенногоФайла, ДополнительныеПараметры) Экспорт
	
АдресФайла = ОписаниеПомещенногоФайла.Адрес;
ПрочитатьИзВХНаСервере(АдресФайла, "Текст");
	
КонецПроцедуры

Использование потока для чтения файла

В случае, если нам нужно просто передать файл с клиента на сервер для сохранения в базу данных, либо мы хотим прочитать файл в формате ods(Open Documents Spreadsheet) или mxl(встроенный формат табличных документов 1С), мы можем воспользоваться еще одним способом – с использованием потоков данных.

В этом случае нам не понадобится создавать временный файл и следить за его корректным удалением. Код будет очень похож на прерыдущий пример. Мы также выбираем файл с использованием метода НачатьПомещениеФайлаНаСервер, но указываем другой фильтр. А в обработчике оповещения вызываем серверную процедуру ПрочитатьВПоток. В методе Прочитать() нам нужно явным образом указать тип файла табличного документа, который мы считываем.

&НаКлиенте
Процедура ПрочитатьЧерезПоток(Команда)

ОбработкаОкончанияПомещения = Новый ОписаниеОповещения("ОбработчикОкончанияПомещенияПоток", ЭтотОбъект);
ПараметрыДиалога = Новый ПараметрыДиалогаПомещенияФайлов;
ПараметрыДиалога.Фильтр = "файлы ODS или MXL|*.ods;*.mxl";

НачатьПомещениеФайлаНаСервер(ОбработкаОкончанияПомещения, , , АдресВХ, ПараметрыДиалога, ЭтотОбъект.УникальныйИдентификатор);

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

&НаКлиенте
Процедура ОбработчикОкончанияПомещенияПоток(ОписаниеПомещенногоФайла, ДополнительныеПараметры) Экспорт

АдресФайла = ОписаниеПомещенногоФайла.Адрес;
ПрочитатьВПоток(АдресФайла);

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

&НаСервере
Процедура ПрочитатьВПоток(АдресФайла)

ДД = ПолучитьИзВременногоХранилища(АдресФайла);
Поток = ДД.ОткрытьПотокДляЧтения();
ТабДок.Прочитать(Поток,,ТипФайлаТабличногоДокумента.ODS);
Поток.Закрыть();

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

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

Introduction

Very often, Excel spreadsheets are used to transfer data between applications. CSV files are also used for the same purpose.

There are a number of methods available to work with Excel spreadsheets and CSV files.

Read and Write Excel Documents using OLEDB Automation

You will need to add references to Microsoft.Office.Interop.Excel library located in C:WindowsassemblyGAC_MSILMicrosoft.Office.Interop.Excel or similar folder.

Statement using Excel = Microsoft.Office.Interop.Excel; is also required.

The followed steps could be used to create Excel spreadsheet from dataset:

  1. Create Excel objects:
    Application excel = new Excel.Application();
    Workbook workBook = excel.Workbooks.Add();
    Worksheet sheet = workBook.ActiveSheet;
  2. Create header row:
    foreach (DataColumn dc in ds.Tables[0].Columns)
    {
        sheet.Cells[1, c + 1] = dc.Caption;
        c++;
    }
  3. Load the data from dataset:
    foreach (DataRow dr in ds.Tables[0].Rows)
    {
        foreach (DataColumn dc in ds.Tables[0].Columns)
        {
            sheet.Cells[r + 1, c + 1] = dr[dc].ToString();
            c++;
        }
        r++;
        c=0;
    }
  4. Save results in desired format:
    workBook.SaveAs(OutputFileName, XlFileFormat.xlExcel8); 
    workbook.Close();

Application can read and write Excel documents in the latest format, or use 2003 or earlier formats of spreadsheet, can work with CSV or tab-separated documents.

However, this method is not recommended. It is slow, heavy and unreliable. Microsoft Excel must be installed on the server. Developer should expect many bad surprises.

Jet OLEDB Provider

Another way to manipulate with spreadsheets and text files is a JET OLEDB provider.

Steps to create Excel file are:

  1. Create connection string:
    excelConStr = string.Format(@"Provider=Microsoft.Jet.OLEDB.4.0;
    Data Source={0};Extended Properties=""Excel 8.0;""", OutputFileName);
  2. Create and populate spreadsheet:
    using (OleDbConnection conn = new OleDbConnection(excelConStr))
    {
         conn.Open();
         oledbcmd = new OleDbCommand();
         oledbcmd.Connection = conn;
    
         string ssql = "CREATE TABLE [table1] (";
    
         foreach (DataColumn dc in ds.Tables[0].Columns)
            ssql += "" + dc.Caption + " VARCHAR, ";
        
         ssql += ")";
         ssql = ssql.Replace(", )", ")");
    
         oledbcmd.CommandText = ssql;
         oledbcmd.ExecuteNonQuery();
    
         foreach (DataRow dr in ds.Tables[0].Rows)
         {
             ssql = "INSERT INTO [table1] VALUES(";
             foreach(DataColumn dc in ds.Tables[0].Columns)
                 ssql += "'" + dr[dc].ToString() + "',";
    
             ssql += ")";
             ssql = ssql.Replace(",)", ")");
    
             oledbcmd.CommandText = ssql;
             oledbcmd.ExecuteNonQuery()
         }
         conn.Close()
    }

This code illustrates how to create Excel spreadsheet from dataset. You will get Excel 2003 format. Different formats could be created by updating extended properties of connection string.

Microsoft Access Database Engine Redistributable

This is not a replacement for the Jet OLEDB Provider in server-side applications, but it has many nice features. For instance, you can use the steps below to read CSV file by using SQL statement:

  1. Create connection string:
    string CSVConStr = string.Format(@"Provider=Microsoft.ACE.OLEDB.12.0;
    Data Source={0};Extended Properties=""Text;HDR=YES;IMEX=2;FMT=Delimited""", 
    System.IO.Path.GetDirectoryName(FileName));

    The first line of CSV file must have a header.

  2. Create dataset from CSV file:
    using (excelCon = new OleDbConnection(CSVConStr))
    {
        excelCon.Open();   
        SQL = "SELECT * FROM [" + System.IO.Path.GetFileName(FileName) + "]";
        cmd = new OleDbCommand(SQL, excelCon);
        ds = new DataSet();
        da = new OleDbDataAdapter(cmd);
        da.Fill(ds, "MyData");
    }

Microsoft Access Database Engine 2010 Redistributable (https://www.microsoft.com/en-us/download/details.aspx?id=13255) should be installed on the host box. Excel installation on the server is not required.

ClosedXML Library

Example below shows how to create Excel 2007/2010 spreadsheet from dataset:

  1. Add references to ClosedXML library
  2. Add using ClosedXML.Excel
  3. Add actual code:
    var wb = new XLWorkbook();
    wb.Worksheets.Add(ds);
    wb.SaveAs(OutputFileName);

SDK and documentation are available here.

This SDK works very fast, and provides a nice object oriented way to manipulate the files, and Excel installation on the server is not required.

Another powerful tool you can consider is EPPlus (https://epplus.codeplex.com/).

This member has not yet provided a Biography. Assume it’s interesting and varied, and probably something to do with programming.

   Avalone2010

08.11.12 — 14:10

Здравствуйте! Подскажите что может быть, ситуация следующая.

Есть сервер, на нем крутится 1С.

Есть база в которую идет загрузка из 1С(КС вариант).

Так вот при передачи фала EXCEL с клиента на сервер происходит сохранение данного файла в определенной папке(в контексте сервера), потом так же в контексте сервера происходит попытка открытия этого файла — но вылетает ошибка :

————————————————-

{Документ.КонкурсПоУслугам.Форма.ФормаЗагрузкиИзEXCEL.Форма(36)}: Ошибка при вызове метода контекста (Open)

   Книга = Эксель.WorkBooks.Open(ИмяФайла);

по причине:

Произошла исключительная ситуация (Microsoft Excel): Приложению Microsoft Excel не удается получить доступ к файлу «G:1C_TempШахматка_08_11_2012_02_06_32.xlsx». Это может быть вызвано одной из следующих причин.

• Указан несуществующий файл или путь.

• Файл используется другой программой.

• Имя книги, которую вы пытаетесь сохранить, совпадает с именем другой книги, открытой в данный момент.

————————————————-

Код который все это делает ниже:

————————————————-

//2. Получим файлик для загрузки из временного хранилища

   ИмяФайла = «G:1C_TempШахматка_»+Формат(ТекущаяДата(),»ДФ=dd_MM_yyyy_hh_mm_ss»)+».xlsx»;//Сисадмины сказали что в темпе хранит не феншуйно и выделили отдельную папку    

   Файлик   = ПолучитьИзВременногоХранилища(АдресВовременномХранилище);

   Файлик.Записать(ИмяФайла);          

   
   //3. Попробуем открыть EXCEL          

   Попытка        Эксель = Новый COMОбъект(«Excel.Application»);

   Исключение    Сообщить(ОписаниеОшибки()); УдалитьФайлы(ИмяФайла); Возврат Неопределено;

   КонецПопытки;

————————————————-

Перед открытием файлика, в режиме отладки, проверял — он существует(ФС.Существует()). Другой программой он не используется так как создается. у пользователя под которым выполняется код на стороне сервера разрешение на чтение/запись файла есть.

Что может быть, куда копать?

   mikecool

1 — 08.11.12 — 14:14

файл не успевает сохраниться?

   Avalone2010

2 — 08.11.12 — 14:16

выложил не весь код.Вот весь:

//2. Получим файлик для загрузки из временного хранилища

   ИмяФайла = «G:1C_TempШахматка_»+Формат(ТекущаяДата(),»ДФ=dd_MM_yyyy_hh_mm_ss»)+».xlsx»;//Сисадмины сказали что в темпе хранит не феншуйно и выделили отдельную папку    

   Файлик   = ПолучитьИзВременногоХранилища(АдресВовременномХранилище);

   Файлик.Записать(ИмяФайла);          

   
   //3. Попробуем открыть EXCEL          

   Попытка        Эксель = Новый COMОбъект(«Excel.Application»);

   Исключение    Сообщить(ОписаниеОшибки()); УдалитьФайлы(ИмяФайла); Возврат Неопределено;

   КонецПопытки;

   
   //4. Откроем файлик и книгу

   Книга = Эксель.WorkBooks.Open(ИмяФайла);

   Лист  = Книга.WorkSheets(НомерЛиста);

(1) если бы.Ставил точку останова на

Книга = Эксель.WorkBooks.Open(ИмяФайла);

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

   GLazNik

3 — 08.11.12 — 14:17

(0) Почему-то напрашивается конструкция типа Файлик.Закрыть() после записи:)

Файлик что за тип?

Может стоит после записи обнулить эту переменную

   mikecool

4 — 08.11.12 — 14:18

кстате — а нафик передавать через хранилище файл, если достаточно безконтекстный вызов сервера с передачей имени файла?

   mikecool

5 — 08.11.12 — 14:18

+4 а по имени уже открывать

   FreeHunter

6 — 08.11.12 — 14:19

попробуй что бы все это делалось под админскими правами

   FreeHunter

7 — 08.11.12 — 14:21

ах да проверь у тебя данные есть в ИмяФайла

   Avalone2010

8 — 08.11.12 — 14:25

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

(3)Файл — xlsx(EXCEL).Закрыть не получится, потому что

Файлик   = ПолучитьИзВременногоХранилища(АдресВовременномХранилище);

Передает двоичные данные. Файлик — это двоичные данные.Название просто у него такое :)

(6) Если бы я мог под админскими правами проверить, организация большая — я в дочке. Пока прав допросишся пол года пройдет. Но на файл, после того как он создался но еще не прочитался(точка останова на Книга = Эксель.WorkBooks.Open(ИмяФайла)) я давал полные права всем.

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

   Avalone2010

9 — 08.11.12 — 14:27

Кстати, еще одна закономерность. Выгрузил базу. Развернул на сервере в файловом варианте  — все работает.

   GLazNik

10 — 08.11.12 — 14:28

(8) я в том плане, что после записи, система считает что этот файл открыт одинэсиной. Попробуй просто прописать Файлик = «» после записи.

   FreeHunter

11 — 08.11.12 — 14:28

т.е. в ИмяФайла название твоего файла и путь, теперь проверь есть ли у тебя права на его чтение

   GLazNik

12 — 08.11.12 — 14:30

(9) тогда не (9). А если файлик на сервер вручную бросить и попробовать открыть через 1С на сервере? открывает?

   Avalone2010

13 — 08.11.12 — 14:31

(11) у меня права есть на него.Я его открываю. У пользователя под которым выполняются серверные процедуры я не знаю есть права или нет. Но с одной стороны он этот файл записывает, значит наверное и читать может. Кроме того перед тем как файл будет прочитан я на него даю полные права(Мой файл-сфойства-безопасность-Группы и пользователи + все(чтение/запись))

   Avalone2010

14 — 08.11.12 — 14:31

(12) — отличная мысл.Чет сам не допер.Ша попробую

   Ахиллес

15 — 08.11.12 — 14:31

G:1C_Temp Это локальный путь на сервере или подключённый сетевой диск на клиенте? Мож перепутал вызовы и на клиенте файл экселя пытаешься открыть?

   Avalone2010

16 — 08.11.12 — 14:35

(15) — локальный путь. Диск G физически висит на сервере

   Avalone2010

17 — 08.11.12 — 14:39

(12) не сработало. Давайте код выложу.Может где накосячил. А то право неловко — такая ерунда а уже часа 3 мозг себе ипу этим.

(15), кстати сейчас что бы избежать этой ошибки запуская 1С предприятие по РДП на сервере. Т.е. и клиент и сервер один и тот же комп, путаници с дисками быть не должно. Кроме того файл проверя в режиме отладки на стороне сервера — он существет(ФС = новый Файл(ИмяИмяФайла); ФС.Существует())

   Ахиллес

18 — 08.11.12 — 14:39

(16) Перепутал вызовы, открываешь эксель на клиенте.

Не хватает каких то прав на сервере.

Версия экселя не подходит.

Наоткрывал кучу КОМ объеков, они все в памяти сидят и не могут решить чей это файл :-) С открытием экселя часто такая фигня. При какой то ошибке 1С эксель остаётся висеть в памяти. Открой диспечер задач на серваке и погляди.

   Avalone2010

19 — 08.11.12 — 14:39

Вызов на стороне клиента:

&НаКлиенте

Процедура Загрузить(Команда)

   
   //1. Поместим наш файлик во временное хранилище

   Перем АдресВовременномХранилище;

   Если Не ЗначениеЗаполнено(Файл) Тогда Возврат; КонецЕсли;

   ПоместитьФайл(АдресВовременномХранилище, Файл, , Ложь);

   
   //2. Произведем чтение и разбор этого файла

   Адрес = ПроизвестиЧтениеГоризонтальнойШахматки(АдресВовременномХранилище);    

   
   //3. Оповестим о том что все сделано

   Если ЭтоАдресВременногоХранилища(Адрес) Тогда

       ОповеститьОВыборе(Новый Структура(«ДанныеЗагрузки», Адрес));

   Иначе

       ЭтаФорма.Закрыть();

   КонецЕсли;

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

   Avalone2010

20 — 08.11.12 — 14:41

Вызов на стороне сервера:

&НаСервере

Функция ПроизвестиЧтениеГоризонтальнойШахматки(АдресВовременномХранилище)

   
   //1. Сформируем табличку в которую будем загружать

   тзУслуги = Новый ТаблицаЗначений;

   тзУслуги.Колонки.Добавить(«Лот»             , Новый ОписаниеТипов(«СправочникСсылка.Объекты»));

   тзУслуги.Колонки.Добавить(«Услуга»          , Новый ОписаниеТипов(«СправочникСсылка.Объекты»));

   тзУслуги.Колонки.Добавить(«Марка»           , Новый ОписаниеТипов(«Строка»));

   тзУслуги.Колонки.Добавить(«ЕдиницаИзмерения», Новый ОписаниеТипов(«СправочникСсылка.ЕдиницыИзмерения»));

   тзУслуги.Колонки.Добавить(«Количество»      , Новый ОписаниеТипов(«Число»));

   тзУслуги.Колонки.Добавить(«ПДЦБезНДС»       , Новый ОписаниеТипов(«Число»));

   тзУслуги.Колонки.Добавить(«ПДЦ»             , Новый ОписаниеТипов(«Число»));

   тзУслуги.Колонки.Добавить(«Дорога»          , Новый ОписаниеТипов(«СправочникСсылка.Дороги»));

   тзУслуги.Колонки.Добавить(«УчастникКонкурса», Новый ОписаниеТипов(«СправочникСсылка.Организации»));

   тзУслуги.Колонки.Добавить(«ФКП»             , Новый ОписаниеТипов(«Число»));

   тзУслуги.Колонки.Добавить(«ФКП_БезНДС»      , Новый ОписаниеТипов(«Число»));

   
   //2. Получим файлик для загрузки из временного хранилища

   //ИмяФайла = «G:1C_TempШахматка_»+Формат(ТекущаяДата(),»ДФ=dd_MM_yyyy_hh_mm_ss»)+».xlsx»;//Сисадмины сказали что в темпе хранит не феншуйно и выделили отдельную папку    

   ИмяФайла = «G:1С ОбработкиШахматка.xlsx»;

   Файлик   = ПолучитьИзВременногоХранилища(АдресВовременномХранилище);

   Файлик.Записать(ИмяФайла);

   Файлик = «»;

   
   //3. Попробуем открыть EXCEL          

   Попытка        Эксель = Новый COMОбъект(«Excel.Application»);

   Исключение    Сообщить(ОписаниеОшибки()); УдалитьФайлы(ИмяФайла); Возврат Неопределено;

   КонецПопытки;

   
   //4. Откроем файлик и книгу

   Книга = Эксель.WorkBooks.Open(ИмяФайла);

   Лист  = Книга.WorkSheets(НомерЛиста);

   
   //5. Получим количество колонок и строк

   ВсегоКолонок = Лист.Cells(1,1).SpecialCells(11).Column;

   ВсегоСтрок   = Лист.Cells(1,1).SpecialCells(11).Row;

   
   //Далше всякая ерунда, она не нужна что бы глаз не мозолить

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

   Ахиллес

21 — 08.11.12 — 14:43

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

   Avalone2010

22 — 08.11.12 — 14:45

(21) :/, млять. они под другим пользователем висят. У меня прав нет что бы смотреть процессы других пользователей

   Ахиллес

23 — 08.11.12 — 14:46

(22) Отладку то под своим надо делать.

   Avalone2010

24 — 08.11.12 — 14:48

(23) не понял. Вызов экселя идет в контексте сервера, т.е. от имени пользователя под которым стартанула служба агента серверов. А это не я, это другой пользователь. Под ним возможно и висят зомби эксели. Ша буду админов теребить

   Ахиллес

25 — 08.11.12 — 14:48

+21 Я обычно дополнительно закрываю эксель при закрытии формы. Чтоб уж наверняка его прибить. И то эта ска каким то образом иногда умудряется выживать.

   Мыш

26 — 08.11.12 — 14:52

Файлик=Неоределено;

   Avalone2010

27 — 08.11.12 — 14:59

Что вы к Файлику прикопались. Это двоичные данные, это не эксел.

(21) админы говорят что процессов по экселю нет ни под кем. человеки. Мож я скину кому cf с одним этим документом, кто нить глянте в КС варианте у себя, а?

   ЧеловекДуши

28 — 08.11.12 — 14:59

>>> «У пользователя под которым выполняются серверные процедуры»

Ну все… если у вас голубчик стоит серверная версия 8-ки, то то-что выполняется на сервере, выполняется под серверным пользователем «Локальным относительно сервера».

А вообще, телепат устал, так что…

   ЧеловекДуши

29 — 08.11.12 — 15:00

(27)Он рабочий… а вот у вас смутное представление о работе сервера 1С.

А у нас нехватка данных , для того что бы вас послать в правильном пути :)

   Avalone2010

30 — 08.11.12 — 15:01

(28,27) какие данные нужны?

   Serginio1

31 — 08.11.12 — 15:03

   Avalone2010

32 — 08.11.12 — 15:07

(31), спасибо, хоть что то.Шас буду смотреть

   hhhh

33 — 08.11.12 — 15:07

(30) я всё-таки за (1) Поэтому лучше так

     
   //3. Попробуем открыть EXCEL          

   Попытка        Эксель = Новый COMОбъект(«Excel.Application»);

   Исключение    Сообщить(ОписаниеОшибки()); УдалитьФайлы(ИмяФайла); Возврат Неопределено;

   КонецПопытки;

Файлик   = ПолучитьИзВременногоХранилища(АдресВовременномХранилище);

   Файлик.Записать(ИмяФайла);

   ЧеловекДуши

34 — 08.11.12 — 15:12

(30)КтоЗдесь?

(32)Не заработает :)

   Avalone2010

35 — 08.11.12 — 15:15

(33) сделал даже так:

//3. Попробуем открыть EXCEL          

   Попытка        Эксель = Новый COMОбъект(«Excel.Application»);

   Исключение    Сообщить(ОписаниеОшибки());

       //УдалитьФайлы(ИмяФайла);

       Эксель = Неопределено;

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

   КонецПопытки;

   
   НачальноеВремя = ТекущаяДата();    

   Пока ТекущаяДата()< НачальноеВремя + 5 Цикл КонецЦикла;

   
   //2. Получим файлик для загрузки из временного хранилища

   ИмяФайла = «G:1C_TempШахматка_»+Формат(ТекущаяДата(),»ДФ=dd_MM_yyyy_hh_mm_ss»)+».xlsx»;//Сисадмины сказали что в темпе хранит не феншуйно и выделили отдельную папку        

   Файлик   = ПолучитьИзВременногоХранилища(АдресВовременномХранилище);

   Файлик.Записать(ИмяФайла);

   
   //4. Откроем файлик и книгу

   Книга = Эксель.WorkBooks.Open(ИмяФайла);

   Лист  = Книга.WorkSheets(НомерЛиста);

все равно не работает, та же ошибка.

   Avalone2010

36 — 08.11.12 — 15:16

На сервере с помошью

    WshNetwork   = Новый COMОбъект(«WScript.Network»);

        ПодКемСеанс  =  WshNetwork.UserName;

Проверил под кем работа. Работа идет под доменным администратором

   Ахиллес

37 — 08.11.12 — 15:16

(35) Пистят твои админы. Если Эксель не закрывался, то куда он мог деться?

   Avalone2010

38 — 08.11.12 — 15:20

(37) может и пистят. Но объясните мне тогда, почему все отрабатывает если я на сервере(под рдп) работаю с фаловой копией этой базы? Все таки какая то куйня получается с доменным админом под которым работает сервер 1с? Или я, как сказал 29, смутно представляю работу сервера 1с?

  

Serginio1

39 — 08.11.12 — 15:31

(38) Прочитай ветку в 31 и разберись с правами DCOM

Тест

Эксперт 1С

383 / 162 / 56

Регистрация: 26.02.2010

Сообщений: 1,241

1

1C 8.x

Открыть эксель на сервере

17.05.2018, 09:09. Показов 16644. Ответов 40


Студворк — интернет-сервис помощи студентам

Управляемые формы. MS SQL. И база и эксель физически лежат на одной машине. Но эксель упорно не открывается, мол 1с не видит его. COMОбъект на клиенте вроде как нельзя создавать. Как боритесь с этой ситуевиной?

Добавлено через 38 минут
Нашел на инфостарте способ, как сделать через каталог временных файлов, но оказывается на папку пользователя USR1CV82 нужны права админа, и я в растерянности.



0



1830 / 1248 / 445

Регистрация: 16.01.2015

Сообщений: 5,457

17.05.2018, 09:20

2

_ЕГОР_, открываешь готовый файл или эксель для создания файла? Код покажите как делаете



0



_ЕГОР_

Тест

Эксперт 1С

383 / 162 / 56

Регистрация: 26.02.2010

Сообщений: 1,241

17.05.2018, 09:22

 [ТС]

3

Готовый файл

1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
&НаКлиенте
Процедура ЭксельНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    
    Диалог = новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
    Диалог.Фильтр    ="Лист Excel (*.xlsx)|*.xlsx|Лист Excel (*.xls)|*.xls";
    Если Диалог.Выбрать() Тогда
        ИмяФайла = Диалог.ПолноеИмяФайла;
    КонецЕсли;
    
    
    Двоичное = Новый ДвоичныеДанные(ИмяФайла);
    Адрес = ПоместитьВоВременноеХранилище(Двоичное, ЭтаФорма.УникальныйИдентификатор);
 
    ЗагрузкаНаСервере(Адрес)
    
КонецПроцедуры
 
&НаСервере
Процедура ЗагрузкаНаСервере(Адрес)
 
    темп_Путь = КаталогВременныхФайлов()+ "prncss_Megan_"+Формат(ТекущаяДата()-Дата(2012,01,01), "ЧГ=0")+".xls";
    
    темп_файл = ПолучитьИзВременногоХранилища(Адрес);
    темп_файл.Записать(темп_Путь);
        
    //ТабЛицСчетов = ЗагрузитьЭксель(темп_Путь);
    ОбработатьДанные(темп_Путь);
    
    Попытка
        УдалитьФайлы(темп_Путь); 
    Исключение
        Сообщить(ОписаниеОшибки());
    КонецПопытки;
    
КонецПроцедуры
 
Процедура ОбработатьДанные(ИмяФайла)
 
    //подключаемся к эксел
    Попытка
        Excel = Новый COMОбъект("Excel.Application");
        Excel.WorkBooks.Open(ИмяФайла);
        //Состояние("Обработка файла Microsoft Excel...");
    Исключение
        Сообщить("Ошибка при открытии файла с помощью Excel! Загрузка не будет произведена!");
        Сообщить(ОписаниеОшибки());
        Возврат;
    КонецПопытки;
    
    Попытка
        //Открываем необходимый лист
        Excel.Sheets(1).Select(); // лист 1, по умолчанию
    Исключение
        //Закрываем Excel
        Excel.ActiveWorkbook.Close();
        Excel = 0;
        Сообщить("Файл "+Строка(ИмяФайла)+" не соответствует необходимому формату! Первый лист не найден!");
        ОтменитьТранзакцию();
        Возврат;
    КонецПопытки;
КонецПроцедуры

Код то работает в файловом варианте. а в серверном не дает открыть эксель. Встречались с такой ошибкой?



0



1830 / 1248 / 445

Регистрация: 16.01.2015

Сообщений: 5,457

17.05.2018, 09:30

4

_ЕГОР_, Предположение. Полный путь к файлу как определяется в отладчике? Если что-то типа С: то это локальный путь. Должно быть сетевое имя компа



0



Тест

Эксперт 1С

383 / 162 / 56

Регистрация: 26.02.2010

Сообщений: 1,241

17.05.2018, 09:34

 [ТС]

5

polax, а это значит папка расшарена должна быть ведь?



0



1830 / 1248 / 445

Регистрация: 16.01.2015

Сообщений: 5,457

17.05.2018, 09:39

6

_ЕГОР_, Конечно доступ должен быть открыт

Добавлено через 3 минуты
Попрбуй вру ную прописать сетевой путь к файлу в процедуре с сом объектом. Увидит?



0



Тест

Эксперт 1С

383 / 162 / 56

Регистрация: 26.02.2010

Сообщений: 1,241

17.05.2018, 09:48

 [ТС]

7

polax, ох в этом то и будет загвоздка…

Добавлено через 8 минут
polax, если прописываю путь типа \192.168.0.1 то такая же ошибка



0



1830 / 1248 / 445

Регистрация: 16.01.2015

Сообщений: 5,457

17.05.2018, 10:03

8

_ЕГОР_, а если путь указать по имени компа? Типа \Server1 Делал когда-то. БП выкладывает файл на сервер, ЗУП использует этот файл. Брал файл по пути с именем компа



0



Тест

Эксперт 1С

383 / 162 / 56

Регистрация: 26.02.2010

Сообщений: 1,241

17.05.2018, 10:08

 [ТС]

9

polax, так же…
Может на клиенте как то можно это сделать?



0



82 / 69 / 19

Регистрация: 12.11.2015

Сообщений: 629

17.05.2018, 10:12

10

а почему ЗагрузкаНаСервере(Адрес) не использовать на клиенте? Формировать на сервер временный файл, а на клиенте его записать



0



Тест

Эксперт 1С

383 / 162 / 56

Регистрация: 26.02.2010

Сообщений: 1,241

17.05.2018, 10:19

 [ТС]

11

slypower, на клиенте тоже пробовал



0



206 / 180 / 31

Регистрация: 24.10.2011

Сообщений: 738

17.05.2018, 11:00

12

Процедура ОбработатьДанные(ИмяФайла) поставь директиву &НаСервере



0



Тест

Эксперт 1С

383 / 162 / 56

Регистрация: 26.02.2010

Сообщений: 1,241

17.05.2018, 11:07

 [ТС]

13

Volexovich, так же



0



206 / 180 / 31

Регистрация: 24.10.2011

Сообщений: 738

17.05.2018, 11:09

14

Дай текст сообщения



0



Тест

Эксперт 1С

383 / 162 / 56

Регистрация: 26.02.2010

Сообщений: 1,241

17.05.2018, 11:10

 [ТС]

15

{ВнешняяОбработка.ЗагрузкаЭксель.Форма.Форма.Форма (81)}: Ошибка при вызове метода контекста (Open): Произошла исключительная ситуация (Microsoft Excel): Приложению Microsoft Excel не удается получить доступ к файлу «\server2obmenplatonovСписок готовый к загрузке Белашов ПОДУШКИ, ОДЕЯЛА (15.05.2018) — в работе.xlsx». Это может быть вызвано одной из следующих причин.

• Указан несуществующий файл или путь.
• Файл используется другой программой.
• Имя книги, которую вы пытаетесь сохранить, совпадает с именем другой книги, открытой в данный момент.



0



Volexovich

206 / 180 / 31

Регистрация: 24.10.2011

Сообщений: 738

17.05.2018, 11:25

16

Пошлость какая то:

1C
1
темп_Путь = КаталогВременныхФайлов()+ "prncss_Megan_"+Формат(ТекущаяДата()-Дата(2012,01,01), "ЧГ=0")+".xls";

дает типа C:Users%UserName%AppDataLocalTempprncss_Mega n_дата.xls
А у тебя пытается открыть из \server2obmenplatonovСписок готовый к загрузке Белашов ПОДУШКИ, ОДЕЯЛА (15.05.2018) — в работе.xlsx
Мониторь в какой момент темп_Путь забивается этим тупым путем.



0



Тест

Эксперт 1С

383 / 162 / 56

Регистрация: 26.02.2010

Сообщений: 1,241

17.05.2018, 11:28

 [ТС]

17

Volexovich, ну это я менял уже вот ошибка с временным каталогам

{ВнешняяОбработка.ЗагрузкаЭксель.Форма.Форма.Форма (81)}: Ошибка при вызове метода контекста (Open): Произошла исключительная ситуация (Microsoft Excel): Приложению Microsoft Excel не удается получить доступ к файлу «C:Userse.platonovAppDataLocalTemp14prncss_ Megan_201188086.xls». Это может быть вызвано одной из следующих причин.

• Указан несуществующий файл или путь.
• Файл используется другой программой.
• Имя книги, которую вы пытаетесь сохранить, совпадает с именем другой книги, открытой в данный момент.



0



206 / 180 / 31

Регистрация: 24.10.2011

Сообщений: 738

17.05.2018, 11:34

18

Так, а у тебя на сервере эксель не повесился? Глянь процессы Экселя

Добавлено через 1 минуту
Возможно он сам себя блокирует, так как ты время у файла убрал (плохая практика).



0



Тест

Эксперт 1С

383 / 162 / 56

Регистрация: 26.02.2010

Сообщений: 1,241

17.05.2018, 11:37

 [ТС]

19

Volexovich, неа, нет висячих процессов.
Про время немного не понял…



0



206 / 180 / 31

Регистрация: 24.10.2011

Сообщений: 738

17.05.2018, 11:38

20

Цитата
Сообщение от _ЕГОР_
Посмотреть сообщение

Про время немного не понял…

Если Эксель не виснет, значит проблема в другом.
Ставил точку останова перед открытием файла, файл существует?



0



Понравилась статья? Поделить с друзьями:

А вот еще интересные статьи:

  • Как открыть файл excel на макбуке
  • Как открыть таблицу в vba excel
  • Как открыть файл excel на айфоне
  • Как открыть таблицу xml в excel
  • Как открыть файл excel на android

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии