|
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)
|
|||
8
arsik
гуру
05.10.20
✎
12:49
|
(6) Несколько листов сохраняй через ПакетОтображаемыхДокументов.
КнигаЭксель = Новый ПакетОтображаемыхДокументов;
|
|||
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)
|
|||
13
arsik
гуру
05.10.20
✎
13:04
|
+(12)
КнигаЭксель = Новый ПакетОтображаемыхДокументов;
|
|||
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); |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |