Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

1С сервер, Excel и другое.

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

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

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

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

КнигаЭксель.Записать(ИмяФайла, ТипФайлаПакетаОтображаемыхДокументов.XLSX);

   Креатив
 
9 - 05.10.20 - 12:55
(7)А имена листам тоже можно присваивать?
   rphosts
 
10 - 05.10.20 - 12:55
(9)  если потом не пытаться найти их по имени - необязательно
   Креатив
 
11 - 05.10.20 - 12:57
(10)Мне нужно, чтобы в книге листы были с определёнными именами.
   arsik
 
12 - 05.10.20 - 13:03
(9) Если тебе сохранять в Эксель то
ЭлементПакетаОтображаемыхДокументов (RepresentableDocumentBatchItem)

Свойства:
Данные (Data)
Наименование (Title)
Описание:
Содержит описание одного отображаемого документа.
Доступность:
Тонкий клиент, веб-клиент, мобильный клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение (клиент), мобильное приложение (сервер).
Данный объект может быть сериализован в/из XDTO. Тип XDTO, соответствующий данному объекту, определяется в пространстве имен (http://v8.1c.ru/8.2/mngsrv/ws). Имя типа XDTO: RepresentableDocumentBatchItem.

   arsik
 
13 - 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
Как я понимаю, для поиска придётся массив с именами листов заводить?
   arsik
 
16 - 05.10.20 - 13:28
(15) Садись. Два.
   DrZombi
 
17 - 05.10.20 - 13:31
(0) Код покажи, обработки... Всей...
   DrZombi
 
18 - 05.10.20 - 13:33
+(0) Зачем ты ломишься через сеть к файлу, когда можешь файл открыть на сервере.
Либо Открыть на клиенте, а на сервер передать массив Структуры, заменяющую Таблицу Значений. :)
   DrZombi
 
19 - 05.10.20 - 13:34
А можешь файл считывать на Сервере 1С, через АДО... Даже ексель не нужен, но и тут свои удовольствия :)
   Креатив
 
20 - 05.10.20 - 14:05
(16)А как по-другому я найду лист в пакете?
(17)Лучше не стоит. Я формирую печатные формы расписания автобусов. Для этого необходимо расписания по всем остановкам на маршруте поместить в один файл Excel. Мне способ с пакетом отображаемых документов понравился, но я ещё его не пробовал. Пока что все действия с Excel перенёс на клиент. Работать стало медленней.
   fisher
 
21 - 05.10.20 - 15:35
(20) Работать с Excel (если нет альтернативных вариантов) лучше на сервере. В том смысле лучше, что работа не будет зависеть от клиентского окружения. Но не через сетевую шару (она тут лишнее звено), а просто передавать результат на клиента через ДвоичныеДанные. Но придется один раз разобраться с серверным окружением, а у тебя, как я понял, нет доступа к серверу. Что усложняет.
   Cthulhu
 
22 - 05.10.20 - 16:51
(20): двоечник виктор перестукин... полтора землекопа нафихъ... в терминах (13):
Для Каждого ЛистЕксельИзПакета Из КнигаЭксель
Цикл Если ЛистЕксельИзПакета.Наименование = "ИмяЛистаКотороеНадоНайти"
Тогда ЛистЕксельИзПакета.Наименование = "ИмяЛистаКотороеНадоУстановить"; Прервать; КонецЕсли КонецЦикла;
   Креатив
 
23 - 05.10.20 - 20:14
(22)Да фу. Переборами не хочется заниматься.
   arsik
 
24 - 05.10.20 - 22:09
(20) Для этого придумали структуру.
   Креатив
 
25 - 07.10.20 - 08:31
А как этот ПакетОтображаемыхДокументов лучше разместить на сервере, чтобы он не терялся при переходе с сервера на клиент?
   arsik
 
26 - 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с с экселем подружить.
   RomanYS
 
30 - 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
Не взлетает, хотя в СП написано, что в качестве данных может выступать табличный документ.
   Kassern
 
34 - 07.10.20 - 13:22
Я так понимаю, у человека нет четкого понимания клиент-серверной работы.
1) если тебе нужно получить файл с клиента и передать для обработки на сервер. Используй временное хранилище, на клиенте переведи свой ексель файл в двоичные данные, а их запихай в хранилище. На сервере в процедуру/функцию передай адрес хранилища, создай временный файл, получи двоичные данные из хранилища и запиши их во временный файл сервера. А потом уже сможешь без проблем его прочитать через эксель по ком/оле или вообще через табличный документ.
2) если нужно с сервера передать файл на клиент. Логика та же, пихаешь на сервере двоичные данные файла в во временное хранилище, возвращай на клиент адрес во временном хранилище. А дальше уже получай на клиенте ДД и сохраняй куда тебе надо.
П.С. если на сервере 64битная 1с, то предварительно ее нужно подружить с екселем. Вот статья как это делается
http://catalog.mista.ru/1c/articles/325873/
   Креатив
 
35 - 07.10.20 - 16:12
(34)Мне достаточно всё на сервере, но в разных сеансах. То есть я нажал кнопку на клиенте, отработали процедуры на сервере. Часть данных нужно сохранить, чтобы при следующем вызове серверных процедур они были доступны.
   arsik
 
36 - 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);


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.