Имя: Пароль:
1C
1С v8
1С сервер, Excel и другое.
0 Креатив
 
05.10.20
10:44
Пишу обработку на управляемых формах. Она использует Excel по ОЛЕ. У меня локально всё хорошо. У клиента с сервером 1с не работает.
Ругается. https://c.radikal.ru/c39/2010/47/cf7d6a862eb4.jpg
Пробовали запускать на сервере, где работает 1С сервер. Не помогает.
1 HawkEye
 
05.10.20
10:46
(0) ну написано же, нет файла: serv1c8\1\бла бла бла
2 RomanYS
 
05.10.20
10:46
Если код выполняется на сервере, то к файловой системе он обращается от имени пользователя, под которым запущена служба сервера 1С
3 VladZ
 
05.10.20
10:47
Нельзя отказаться от "Excel по ОЛЕ"? Почему нельзя использовать загрузку эксель файла в табличный документ?
4 RomanYS
 
05.10.20
10:48
(0) Если файл выбирает пользователь, то пихай его во временное хранилище для передачи на сервер
5 fisher
 
05.10.20
10:50
(0) "Excel по ОЛЕ" на УФ можно использовать двумя способами. Подключаясь из клиентского кода и из серверного. У тебя какой вариант?
Если из серверного, то для доступа к доменным ресурсам сервер приложений должен запускаться под доменной учеткой с соответствующими доступами.
6 Креатив
 
05.10.20
12:09
(3)Нельзя. Нужна книга Excel с множеством листов.
(4)Файл сохраняется из 1С для того, чтобы оттуда скопировать готовый лист в книгу Excel.
(5)Сервер. Попробую перенести в клиентскую часть.
7 arsik
 
гуру
05.10.20
12:43
(6)
>(3)Нельзя. Нужна книга Excel с множеством листов.
Вот тут непонятно.
Чем вот например вариант не подходит?
Функция ПолучитьСписокЛистов_EXCEL1C(Знач ФайлEXCEL)
    Перем ТабличныйДокумент, ОбластьТД;
    Перем СписокЛистов;

    СписокЛистов = Новый СписокЗначений;
    
    ТабличныйДокумент = Новый ТабличныйДокумент;
    Попытка
        ТабличныйДокумент.Прочитать(ФайлEXCEL);
    Исключение
        Сообщить(ОписаниеОшибки(), СтатусСообщения.Внимание);
        Возврат Новый СписокЗначений;
    КонецПопытки;
    
    Для Каждого ОбластьТД ИЗ ТабличныйДокумент.Области Цикл
        СписокЛистов.Добавить(ОбластьТД.Имя);
    КонецЦикла;
    
    Возврат СписокЛистов;
    
КонецФункции
8 arsik
 
гуру
05.10.20
12:49
(6) Несколько листов сохраняй через ПакетОтображаемыхДокументов.
КнигаЭксель = Новый ПакетОтображаемыхДокументов;
НовыйЛист1 = КнигаЭксель.Состав.Добавить();
НовыйЛист1.Данные = ПоместитьВоВременноеХранилище(ТабличныйДокумент1);

НовыйЛист2 = КнигаЭксель.Состав.Добавить();
НовыйЛист2.Данные = ПоместитьВоВременноеХранилище(ТабличныйДокумент2);

КнигаЭксель.Записать(ИмяФайла, ТипФайлаПакетаОтображаемыхДокументов.XLSX);
9 Креатив
 
05.10.20
12:55
(7)А имена листам тоже можно присваивать?
10 rphosts
 
05.10.20
12:55
(9)  если потом не пытаться найти их по имени - необязательно
11 Креатив
 
05.10.20
12:57
(10)Мне нужно, чтобы в книге листы были с определёнными именами.
12 arsik
 
гуру
05.10.20
13:03
(9) Если тебе сохранять в Эксель то
ЭлементПакетаОтображаемыхДокументов (RepresentableDocumentBatchItem)
Свойства:
Данные (Data)
Наименование (Title)
Описание:
Содержит описание одного отображаемого документа.
Доступность:
Тонкий клиент, веб-клиент, мобильный клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение (клиент), мобильное приложение (сервер).
Данный объект может быть сериализован в/из XDTO. Тип XDTO, соответствующий данному объекту, определяется в пространстве имен (http://v8.1c.ru/8.2/mngsrv/ws). Имя типа XDTO: RepresentableDocumentBatchItem.
13 arsik
 
гуру
05.10.20
13:04
+(12)
КнигаЭксель = Новый ПакетОтображаемыхДокументов;
НовыйЛист1 = КнигаЭксель.Состав.Добавить();
НовыйЛист1.Наименование = "Лист1";
НовыйЛист1.Данные = ПоместитьВоВременноеХранилище(ТабличныйДокумент1);

НовыйЛист2 = КнигаЭксель.Состав.Добавить();
НовыйЛист2.Наименование = "Лист2";
НовыйЛист2.Данные = ПоместитьВоВременноеХранилище(ТабличныйДокумент2);

КнигаЭксель.Записать(ИмяФайла, ТипФайлаПакетаОтображаемыхДокументов.XLSX);
14 Креатив
 
05.10.20
13:08
(13)Это уже лучше.
15 Креатив
 
05.10.20
13:24
Как я понимаю, для поиска придётся массив с именами листов заводить?
16 arsik
 
гуру
05.10.20
13:28
(15) Садись. Два.
17 DrZombi
 
гуру
05.10.20
13:31
(0) Код покажи, обработки... Всей...
18 DrZombi
 
гуру
05.10.20
13:33
+(0) Зачем ты ломишься через сеть к файлу, когда можешь файл открыть на сервере.
Либо Открыть на клиенте, а на сервер передать массив Структуры, заменяющую Таблицу Значений. :)
19 DrZombi
 
гуру
05.10.20
13:34
А можешь файл считывать на Сервере 1С, через АДО... Даже ексель не нужен, но и тут свои удовольствия :)
20 Креатив
 
05.10.20
14:05
(16)А как по-другому я найду лист в пакете?
(17)Лучше не стоит. Я формирую печатные формы расписания автобусов. Для этого необходимо расписания по всем остановкам на маршруте поместить в один файл Excel. Мне способ с пакетом отображаемых документов понравился, но я ещё его не пробовал. Пока что все действия с Excel перенёс на клиент. Работать стало медленней.
21 fisher
 
05.10.20
15:35
(20) Работать с Excel (если нет альтернативных вариантов) лучше на сервере. В том смысле лучше, что работа не будет зависеть от клиентского окружения. Но не через сетевую шару (она тут лишнее звено), а просто передавать результат на клиента через ДвоичныеДанные. Но придется один раз разобраться с серверным окружением, а у тебя, как я понял, нет доступа к серверу. Что усложняет.
22 Cthulhu
 
05.10.20
16:51
(20): двоечник виктор перестукин... полтора землекопа нафихъ... в терминах (13):
Для Каждого ЛистЕксельИзПакета Из КнигаЭксель
Цикл Если ЛистЕксельИзПакета.Наименование = "ИмяЛистаКотороеНадоНайти"
Тогда ЛистЕксельИзПакета.Наименование = "ИмяЛистаКотороеНадоУстановить"; Прервать; КонецЕсли КонецЦикла;
23 Креатив
 
05.10.20
20:14
(22)Да фу. Переборами не хочется заниматься.
24 arsik
 
гуру
05.10.20
22:09
(20) Для этого придумали структуру.
25 Креатив
 
07.10.20
08:31
А как этот ПакетОтображаемыхДокументов лучше разместить на сервере, чтобы он не терялся при переходе с сервера на клиент?
26 arsik
 
гуру
07.10.20
08:35
(25) Зачем? Формируешь файл на сервере и передаешь его через хранилище на клиента.
27 Креатив
 
07.10.20
08:47
(26)А потом обратно на клиент? Причём мне нужен не файл, а объект.
То есть документа у меня будет два: один текущий, который будет сохранён в файл, второй будет содержать результаты предыдущих вызовов.
Например. Есть у меня 15 маршрут. Есть на нём остановка ТЮЗ. Сформировал я экселовский файл по этому маршруту. Потом пользователь решил сформировать расписание по 12-му маршруту. Там тоже есть остановка ТЮЗ. Чтобы второй раз не формировать лист по этой остановке, я хочу его брать готовым из Пакета.
28 Молочный брат
 
07.10.20
09:02
(27) ПАТП?? Если да, то ой
29 Креатив
 
07.10.20
09:06
(28)Всё нормально. Мне вот только 1с с экселем подружить.
30 RomanYS
 
07.10.20
09:10
(27) листы храни в реквизите формы(массив, структура, таблица), а пакет используй для вывода
31 Креатив
 
07.10.20
09:11
(30)Благодарю. Пришёл к той же мысли, только список значений.
32 Креатив
 
07.10.20
09:59
(13)А без помещения во временное хранилище не взлетит?
33 Креатив
 
07.10.20
11:22
Не взлетает, хотя в СП написано, что в качестве данных может выступать табличный документ.
34 Kassern
 
07.10.20
13:22
Я так понимаю, у человека нет четкого понимания клиент-серверной работы.
1) если тебе нужно получить файл с клиента и передать для обработки на сервер. Используй временное хранилище, на клиенте переведи свой ексель файл в двоичные данные, а их запихай в хранилище. На сервере в процедуру/функцию передай адрес хранилища, создай временный файл, получи двоичные данные из хранилища и запиши их во временный файл сервера. А потом уже сможешь без проблем его прочитать через эксель по ком/оле или вообще через табличный документ.
2) если нужно с сервера передать файл на клиент. Логика та же, пихаешь на сервере двоичные данные файла в во временное хранилище, возвращай на клиент адрес во временном хранилище. А дальше уже получай на клиенте ДД и сохраняй куда тебе надо.
П.С. если на сервере 64битная 1с, то предварительно ее нужно подружить с екселем. Вот статья как это делается
http://catalog.mista.ru/1c/articles/325873/
35 Креатив
 
07.10.20
16:12
(34)Мне достаточно всё на сервере, но в разных сеансах. То есть я нажал кнопку на клиенте, отработали процедуры на сервере. Часть данных нужно сохранить, чтобы при следующем вызове серверных процедур они были доступны.
36 arsik
 
гуру
07.10.20
19:14
(35) Мне интересно, для чего хранить промежуточно между сеансами? Неужели эти данные так долго собираются из базы, что их нужно где то хранить?
37 Креатив
 
07.10.20
19:58
(36)секунд 30 на остановку. По остановке может проходить несколько маршрутов. То есть 2-3 минуты плюсом, а остановок больше 200. Не оптимизированное расписание формировалось у меня без малого 3 часа.
38 Сияющий в темноте
 
08.10.20
00:36
также нужно понимать,что машина с сервером приложений может не уметь запускать excel от слова совсем,так как,в общем случае,это разные машины,а на клиенте excel тоже не  всегда установлен.
поэтому,рекомендуется код работы с excel делать с возможностью выполняться и на клиенте и на сервере.

с другой стороны,расписание лучше готовить в pdf,в этом случае его и смотреть и печатать удобнее,только вот 1с при записи pdf не умеет оглавление с переходами делать.
39 Креатив
 
08.10.20
09:06
Получился такой кусок кода. ВрТаблица - таблица, где хранятся уже сформированные листы.
    КнигаЭксель = Новый ПакетОтображаемыхДокументов;
    Для Каждого рез Из Результат Цикл
        Отбор = Новый Структура;
        Отбор.Вставить("IDОстановки", рез.Остановка);
        ност = ТЗ.НайтиСтроки(Отбор);
        Объект.тОстановка = рез.Остановка;
        Объект.тТранспорт = рез.Транспорт;
        счётчик = 1;
        тимя = СокрЛП(ност[0].Остановка);
        тимя = СтрЗаменить(тимя, "/", "");
        тимя = СтрЗаменить(тимя, "\", "");
        тимя = СтрЗаменить(тимя, "*", "");
        тимя = СтрЗаменить(тимя, "[", "");
        тимя = СтрЗаменить(тимя, "]", "");
        Если СтрДлина(тимя) > 25 Тогда
            тимя = Лев(тимя, 25);
        КонецЕсли;
        тимя = тимя + Формат(рез.Остановка, "ЧГ=");
        Отбор = Новый Структура;
        Отбор.Вставить("Название", тимя + 1);
        
        Стр = ВрТаблица.НайтиСтроки(Отбор);
        Если Стр.Количество() > 0 Тогда
            НовыйЛист1 = КнигаЭксель.Состав.Добавить();
            НовыйЛист1.Наименование = тимя + 1;
            НовыйЛист1.Данные = ПоместитьВоВременноеХранилище(Стр[0].ТабДок);
            тимя = тимя + Формат(рез.Остановка, "ЧГ=");
            Отбор = Новый Структура;
            Отбор.Вставить("Название", тимя + 2);
            
            Стр = ВрТаблица.НайтиСтроки(Отбор);
            Если Стр.Количество() > 0 Тогда
                НовыйЛист1 = КнигаЭксель.Состав.Добавить();
                НовыйЛист1.Наименование = тимя + 2;
                НовыйЛист1.Данные = ПоместитьВоВременноеХранилище(Стр[0].ТабДок);
                
            КонецЕсли;
            Продолжить;
        КонецЕсли;
        
        Для Каждого ПФ Из СформироватьПечатнуюФормуИзТабличногоДокумента() Цикл    
            ПечатнаяФорма = Пф.Значение;
            счётчик = счётчик % 2 + 1;
            стВр = ВрТаблица.Добавить();
            стВр.Название = тимя + счётчик;
            стВр.ТабДок = ПечатнаяФорма;
            НовыйЛист1 = КнигаЭксель.Состав.Добавить();
            НовыйЛист1.Наименование = тимя + счётчик;
            НовыйЛист1.Данные =  ПоместитьВоВременноеХранилище(ПечатнаяФорма);
        КонецЦикла;
    КонецЦикла;
    КнигаЭксель.Записать(Папка + "\" + СокрЛП(Объект.тМаршрут) + ".xlsx", ТипФайлаПакетаОтображаемыхДокументов.XLSX);
Ошибка? Это не ошибка, это системная функция.