Перешли с файловой 1с на клиент-серверную (MS SQL). И сразу перестала работать обработка в самописной конфигурации. Код простой:

```1c
    &НаСервере
    Функция мПрочитатьТабличныйДокументИзExcel(ИмяФайла, НомерЛистаExcel = 1) Экспорт
    xlLastCell = 11;
    ВыбФайл = Новый Файл(ИмяФайла);
    Если НЕ ВыбФайл.Существует() Тогда
    Сообщить("Файл не существует!");
    Возврат Ложь;
    КонецЕсли;
    Попытка
    Excel = Новый COMОбъект("Excel.Application");
    Excel.WorkBooks.Open(ИмяФайла);
    ExcelЛист = Excel.Sheets(НомерЛистаExcel);
    Исключение
    Сообщить("Ошибка. Возможно неверно указан номер листа книги Excel.");
    Возврат ложь;
    КонецПопытки;
    ...
```

Идет возврат "Файл не существует". Проверяю на файловой системе - все работает. Проверить в отладчике серверную процедуру уже не могу. Чего не хватает в процедуре, чтобы увидела система файл?
---
вот серверный вызов
на форме должен быть реквизит "АдресФайла" произвольного типа

```1c
    &НаКлиенте
    Процедура Загрузить(Команда)

    ОчиститьСообщения();

    Если СокрЛП(Путь) = " Тогда
    ПоказатьПредупреждение(,НСтр("ru = 'Не выбран файл с данными!'"),,"Внимание!!!");
    Возврат;
    КонецЕсли;

    Если НЕ ПодключитьРасширениеРаботыСФайлами() Тогда
    УстановитьРасширениеРаботыСФайлами();
    КонецЕсли;

    ФайлВыгрузки = Новый Файл(Путь);
    Если НЕ ФайлВыгрузки.Существует() Тогда
    ТекстСообщения = НСтр("ru = 'Файл данных для загрузки в 1С:Бухгалтерию для Казахстана не обнаружен'");
    Сообщение = Новый СообщениеПользователю;
    Сообщение.Текст = ТекстСообщения;
    Сообщение.Сообщить();
    Возврат;
    КонецЕсли;

    ОписаниеФайла = Новый ОписаниеПередаваемогоФайла(Путь);

    МассивВызовов = Новый Массив;
    ПомещенныеФайлы = Новый Массив;
    ПомещаемыеФайлы = Новый Массив;

    ПомещаемыеФайлы.Добавить(ОписаниеФайла);

    МассивВызовов.Добавить(Новый Массив);
    МассивВызовов[0].Добавить("ПоместитьФайлы");
    МассивВызовов[0].Добавить(ПомещаемыеФайлы);
    МассивВызовов[0].Добавить(ПомещенныеФайлы);
    МассивВызовов[0].Добавить(");
    МассивВызовов[0].Добавить(Ложь);

    Если ЗапроситьРазрешениеПользователя(МассивВызовов) Тогда
    ПоместитьФайлы(ПомещаемыеФайлы, ПомещенныеФайлы,, Ложь, УникальныйИдентификатор);
    ОписаниеФайлов = ПомещенныеФайлы.Получить(0);
    АдресФайла = ОписаниеФайлов.Хранение;
    КонецЕсли;

    // Передаем на сервер
    Результат = ЗаполнитьДанныеИзФайла();

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

    &НаСервере
    Функция ЗаполнитьДанныеИзФайла()
    ФорматФайла = Прав(Путь, СтрДлина(Путь) - СтрНайти(Путь, ".", НаправлениеПоиска.СКонца));

    ИмяВременногоФайла = ПолучитьИмяВременногоФайла(ФорматФайла);

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

    ДвоичныеДанныеФайлаИзХранилища.Записать(ИмяВременногоФайла);

    Попытка
    Эксель = Новый COMОбъект("Excel.Application");
    Исключение
    Сообщение = Новый СообщениеПользователю;
    Сообщение.Текст = ОписаниеОшибки() + " Программа Exсel не установлена на данном компьютере!";
    Сообщение.Сообщить();
    ДобавитьСообщениеПользователю(Сообщение.Текст);
    Возврат Ложь;
    КонецПопытки;

    Попытка
    Книга = Эксель.WorkBooks.Open(ИмяВременногоФайла);
    Исключение
    Сообщение = Новый СообщениеПользователю;
    Сообщение.Текст = ОписаниеОшибки() + " При откытиии файла воникла ошибка, не верный формат файла!";
    Сообщение.Сообщить();
    ДобавитьСообщениеПользователю(Сообщение.Текст);
    Возврат Ложь;
    КонецПопытки;

    Лист = Книга.WorkSheets(1);

    Объект.ДанныеИзФайла.Очистить();

    КонечнаяСтрокДанных = Книга.WorkSheets(1).UsedRange.Rows.Count;
    КоличествоКолонокДанных = Книга.WorkSheets(1).UsedRange.Columns.Count;
    Область = Эксель.Range(Лист.Cells(1,1), Лист.Cells(КонечнаяСтрокДанных,КоличествоКолонокДанных));
    МассивДанныхEXCEL = Область.Value.Выгрузить();

    ЗагрузитьДанныеНаСервере(МассивДанныхEXCEL);

    Эксель.Application.Quit(); //Закрываем Excel

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

    КонецФункции
```
---
вот рабочий код клиентского вызова с передачей на сервер

```1c
    &НаКлиенте
    Процедура Загрузить(Команда)

    ОчиститьСообщения();

    Если СокрЛП(Путь) = " Тогда
    ПоказатьПредупреждение(,НСтр("ru = 'Не выбран файл с данными!'"),,"Внимание!!!");
    Возврат;
    КонецЕсли;

    Попытка
    Эксель = Новый COMОбъект("Excel.Application");
    Исключение
    Сообщение = Новый СообщениеПользователю;
    Сообщение.Текст = ОписаниеОшибки() + " Программа Exсel не установлена на данном компьютере!";
    Сообщение.Сообщить();
    ДобавитьСообщениеПользователю(Сообщение.Текст);
    Возврат;
    КонецПопытки;

    ФорматФайла = Прав(Путь, СтрДлина(Путь) - Найти(Путь, ".") + 1);
    ИмяВФИсходник = ПолучитьИмяВременногоФайла(ФорматФайла);

    КопироватьФайл(Путь, ИмяВФИсходник);

    Попытка
    Книга = Эксель.WorkBooks.Open(Путь);
    Исключение
    ПоказатьПредупреждение(,НСтр("ru = 'Что-то пошло не так... Запустите загрузку еще раз!'"),,"Внимание!!!");
    ДобавитьСообщениеПользователю("Что-то пошло не так... Запустите загрузку еще раз!");
    Возврат;
    КонецПопытки;

    Лист = Книга.WorkSheets(1);

    Объект.ДанныеИзФайла.Очистить();

    КонечнаяСтрокДанных = Книга.WorkSheets(1).UsedRange.Rows.Count;
    КоличествоКолонокДанных = Книга.WorkSheets(1).UsedRange.Columns.Count;
    Область = Эксель.Range(Лист.Cells(1,1), Лист.Cells(КонечнаяСтрокДанных,КоличествоКолонокДанных));
    МассивДанныхEXCEL = Область.Value.Выгрузить();

    ЗагрузитьДанныеНаСервере(МассивДанныхEXCEL);

    Эксель.Application.Quit(); //Закрываем Excel

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

    КонецПроцедуры //Загрузить()
```
---
Ну, видимо, нет на сервере такого файла.
---
Еще раз: в файловом виде 1С файл открывает. Права на файл у пользователя полные. Открывал и по сети, и на самом сервере локально.
---
Потому что ВЕСЬ код выполнятся на клиентской машине. В случае клиент-серверного варианта выполнение кода СТРОГО разделено между машинами.
---
Сервер ничего не знает про файлы на клиенте.
Необходимо указывать файл, в общем сетевом ресурсе, к которому сервер 1С с правами пользователя, под которым он запущен, будет так же иметь доступ, либо передавать файл с клиента на сервер с помощью временного хранилища.
---
А можно пример кода с передачей через хранилище? С правами позже будем разбираться.
---
На стороне клиента:

```1c
    АдресВХранилище = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ИмяФайлаНаКлиенте), УникальныйИдентификатор);
```

На стороне сервера:

```1c
    ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресВХранилище);
    ДвоичныеДанные.Записать(ИмяФайлаНаСервере);
```
---
Спасибо, сейчас попробую
---
можно тоже самое делать
вместо
&НаСервере

&наКлиенте

тогда обработка будет работать с файлом на клиенте
после получения данных из файла уже отправлять в процедуру на сервере
---
Ексель на клиенте лучше читать.
---
Чем лучше? Дешевле 1 лицензию на сервер поставить, чем покупать на каждую клиентскую машину.
LibreOffice/OpenOffice - на клиентские
---
у автора топика абсолютно неграмотно всё организовано. Платформа сама умеет читать Эксель уже давно, причём делает это без установки Экселя как на клиенте, так и на сервере. Вызов внешнего приложения на сервере есть ахтунг, а вызов офисного приложения - полный ахтунг. Подумайте - как часто у вас глючил офис и что случится с сервером, если офис заглючит на сервере ?
---
На счет ахтунга - преувеличиваете.
На сервер простые пользователи не ходят от слова совсем.
Лично использовал серверный эксель и работало все на протяжении 2-х лет абсолютно без сбоев.
Выгрузки в 25 страничные книги, с количеством срок более 10к и колонок более 10 из БП3.0 выполнялись за минуты.
---
кому и кобыла - невеста (с) Если у вас 10 пользователей и постоянно сидящий админ под боком - то, возможно, это ваша кобыла. Но при иных условиях за подключение офиса на сервере прописывается только одно лечение - расстрел.
---
Я даже спорить не стану. Эта обработка была написана еще на стыке работы в 7.7 и 8. До нее руки не доходили, как обычно. Работает - и ладно. Теперь займусь переделкой поневоле. Сейчас сделал временный рабочий вариант, а то уже народ телефон мне раскалил до красна. :-)
---
да всем лучше. На полноценном сервере ексель вообще не нужен. Это клиентская программа.
---
эксель вообще лучше платформой читать ;)
---
Нет, если вы работаете с "простынями", формата больше, чем 1000 строк х 10 колонок.
---
Да. Эксель с "простынями" по СОМу работает ещё медленнее. Единственное, что может оправдать использование СОМа это какая-то особенность входящих файлов, которая криво воспринимается платформой. Что встречается весьма редко.
---
Ну попробуйте загрузить 50к строк х 20 колонкок в ТЗ из Excel, через COM и через "платформенное чтение"....
---
не поверите - загружал и больше. Выигрыш всегда в пользу платформы. Только, естетственно, не надо это делать на клиенте - 1С очень медленно передаёт большие таблицы между клиентом и сервером (хотя и это решается отключением паковки). Берём файл, пихаем на сервер и читаем платформой.
---
не поверите - загружал и больше. Выигрыш всегда в пользу платформы
Доказать сможете?
---
и ключ от квартиры где деньги лежат ? тому, кто на сервере комами эксель гоняет... пожалуй нет.
Считайте это сливом. Вы правы.
---
вот серверный вызов
на форме должен быть реквизит "АдресФайла" произвольного типа

```1c
    &НаКлиенте
    Процедура Загрузить(Команда)

    ОчиститьСообщения();

    Если СокрЛП(Путь) = " Тогда
    ПоказатьПредупреждение(,НСтр("ru = 'Не выбран файл с данными!'"),,"Внимание!!!");
    Возврат;
    КонецЕсли;

    Если НЕ ПодключитьРасширениеРаботыСФайлами() Тогда
    УстановитьРасширениеРаботыСФайлами();
    КонецЕсли;

    ФайлВыгрузки = Новый Файл(Путь);
    Если НЕ ФайлВыгрузки.Существует() Тогда
    ТекстСообщения = НСтр("ru = 'Файл данных для загрузки в 1С:Бухгалтерию для Казахстана не обнаружен'");
    Сообщение = Новый СообщениеПользователю;
    Сообщение.Текст = ТекстСообщения;
    Сообщение.Сообщить();
    Возврат;
    КонецЕсли;

    ОписаниеФайла = Новый ОписаниеПередаваемогоФайла(Путь);

    МассивВызовов = Новый Массив;
    ПомещенныеФайлы = Новый Массив;
    ПомещаемыеФайлы = Новый Массив;

    ПомещаемыеФайлы.Добавить(ОписаниеФайла);

    МассивВызовов.Добавить(Новый Массив);
    МассивВызовов[0].Добавить("ПоместитьФайлы");
    МассивВызовов[0].Добавить(ПомещаемыеФайлы);
    МассивВызовов[0].Добавить(ПомещенныеФайлы);
    МассивВызовов[0].Добавить(");
    МассивВызовов[0].Добавить(Ложь);

    Если ЗапроситьРазрешениеПользователя(МассивВызовов) Тогда
    ПоместитьФайлы(ПомещаемыеФайлы, ПомещенныеФайлы,, Ложь, УникальныйИдентификатор);
    ОписаниеФайлов = ПомещенныеФайлы.Получить(0);
    АдресФайла = ОписаниеФайлов.Хранение;
    КонецЕсли;

    // Передаем на сервер
    Результат = ЗаполнитьДанныеИзФайла();

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

    &НаСервере
    Функция ЗаполнитьДанныеИзФайла()
    ФорматФайла = Прав(Путь, СтрДлина(Путь) - СтрНайти(Путь, ".", НаправлениеПоиска.СКонца));

    ИмяВременногоФайла = ПолучитьИмяВременногоФайла(ФорматФайла);

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

    ДвоичныеДанныеФайлаИзХранилища.Записать(ИмяВременногоФайла);

    Попытка
    Эксель = Новый COMОбъект("Excel.Application");
    Исключение
    Сообщение = Новый СообщениеПользователю;
    Сообщение.Текст = ОписаниеОшибки() + " Программа Exсel не установлена на данном компьютере!";
    Сообщение.Сообщить();
    ДобавитьСообщениеПользователю(Сообщение.Текст);
    Возврат Ложь;
    КонецПопытки;

    Попытка
    Книга = Эксель.WorkBooks.Open(ИмяВременногоФайла);
    Исключение
    Сообщение = Новый СообщениеПользователю;
    Сообщение.Текст = ОписаниеОшибки() + " При откытиии файла воникла ошибка, не верный формат файла!";
    Сообщение.Сообщить();
    ДобавитьСообщениеПользователю(Сообщение.Текст);
    Возврат Ложь;
    КонецПопытки;

    Лист = Книга.WorkSheets(1);

    Объект.ДанныеИзФайла.Очистить();

    КонечнаяСтрокДанных = Книга.WorkSheets(1).UsedRange.Rows.Count;
    КоличествоКолонокДанных = Книга.WorkSheets(1).UsedRange.Columns.Count;
    Область = Эксель.Range(Лист.Cells(1,1), Лист.Cells(КонечнаяСтрокДанных,КоличествоКолонокДанных));
    МассивДанныхEXCEL = Область.Value.Выгрузить();

    ЗагрузитьДанныеНаСервере(МассивДанныхEXCEL);

    Эксель.Application.Quit(); //Закрываем Excel

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

    КонецФункции
```
---
Спасибо. Адаптировал этот код под себя, и заработало.
---
просто оставлю это здесь