Имя: Пароль:
1C
1С v8
Передать ТЗ с сервера на клиента
, ,
0 leon92
 
22.01.19
21:13
Ребят, Получил на Сервере ТЗ список листов в эксель файле
&НаСервере
Процедура ОткрытьНаСервере(Наименование)


Ексель = Новый COMОбъект("Excel.Application");
НомерЛиста = 2;
файл = Ексель.WorkBooks.Open(ПолеВвода);
Лист = файл .WorkSheets(НомерЛиста);

СписокЛистов = Новый СписокЗначений;
Для Каждого ТекущийЛист Из файл .WorkSheets Цикл
СписокЛистов.Добавить(ТекущийЛист.Name);
КонецЦикла;


Создал поле выбора листа на форме

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

Что надо написать, чтобы в этом поле отобразился полученный список листов?
1 МихаилМ
 
22.01.19
21:19
"ребята" на подростковых форумах
2 leon92
 
22.01.19
21:24
что ж ты тут делаешь тогда
3 Fram
 
22.01.19
21:29
(0) надо вызвать сервер и дождаться ответа от сервера со списком
4 Fram
 
22.01.19
21:32
правда возникает вопрос зачем открывать excel на сервере. почему бы на клиенте не открыть. ресурс недоступен с клиента?
5 OldCondom
 
22.01.19
21:51
Открывай через ado, открывай на клиенте
6 palsergeich
 
22.01.19
22:15
А сейчас дядя Паша раскажет страшную вещь.
На сервере путь, который Вы вводите на форме может быть недоступен.
7 palsergeich
 
22.01.19
22:16
И вот такой отлаживаешь дома в уютной песочнике на файловой и все хорошо.
А потом релизишь клиенту и привет факап.
8 Сияющий в темноте
 
22.01.19
22:17
список передается на клиента и через ПоказатьВыборЗначения из него можно выбирать.
только,когда мы ушли на клиента,на сервере эксель погиб вместе со всем остальным.
9 palsergeich
 
22.01.19
22:17
А пот теме открой для себя паттерн: Массив структур.
На собеседованиях спрашивают чуть реже чем всегда.
10 Смотрящий
 
22.01.19
22:21
(7) Да и пох, клиент чехлит.
11 palsergeich
 
22.01.19
22:24
(10) Вроде как прошли те времена.
Сейчас клиент как правило платит тыщу, а мозг сушит на 10.
12 Смотрящий
 
22.01.19
22:27
(11) Т.е. ты убеждаешь что клиенту надо, реализовываешь это надо, потом защищаешь счет выставленный за надо ?
Вот это факап.
13 leon92
 
22.01.19
22:33
Есть у кого Код примера не? (0)
14 palsergeich
 
22.01.19
22:39
(12) Нет потом слушаешь что за это 1000 рублей много, племянник за 500 сделает, а давай еще сделай это...
Это уже давно пройденный этап, но таких мозготрахов ну просто дофигищщу.
(13) А ЗП я тоже за тебя получу?
Я и путь реализации и опасные места указал. Остальное гуглится за 3 минуты.
15 palsergeich
 
22.01.19
22:53
Тема названа некорректно.
Вариант 1: у элемента ставится режим выбора из списка и в список загружается список, полученный с сервера.
Вариант 2.
На клиенте пишешь стандартнаяобработка = ложь;
ДанныеВыбора = твой список.
Но есть ньюанс. В обработчиками событий элементов формы категорически не рекомендуются контекстные серверные вызовы. Это ведёт иногда к багам
16 palsergeich
 
22.01.19
22:58
Я бы написал так

&НаСервереБезКонтекста // ИМХО должно быть &НаКлиенте
Функция СписокЛистовФайла(ПутьКФайлу)


Ексель = Новый COMОбъект("Excel.Application");
НомерЛиста = 2;
файл = Ексель.WorkBooks.Open(ПутьКФайлу);
Лист = файл .WorkSheets(НомерЛиста);

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

Создал поле выбора листа на форме

&НаКлиенте
Процедура ВыберитеНомерЛистаНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
ДанныеВыбора = СписокЛистовФайла(ПолеВвода);
КонецПроцедуры
17 leon92
 
22.01.19
22:59
(15) вариант второй пробовал. переменная не определена
ДанныеВыбора = СписокЛистов
18 palsergeich
 
22.01.19
22:59
(17) СМ (16)
19 Смотрящий
 
22.01.19
23:01
(14) Так пусть племянник и делает, кули ко мне то обратились ?
20 BeerHelpsMeWin
 
22.01.19
23:02
Зачем на сервере открывать непонятный эксель и как этот эксель там вообще оказался?
21 BeerHelpsMeWin
 
22.01.19
23:03
(6) а потом приходишь к клиенту, а там опенофис, ага :)
ну или просто линукс :)
22 palsergeich
 
22.01.19
23:04
(19) Племянника до актов нет, а работа сделана. Риск невозвратных потерь. Торгуются так. Типа или давай скидос\доп работы или нихера не получишь.
(20) Это за рамками задачи, но я об этом уже писал.
23 leon92
 
22.01.19
23:04
(18) есть ньюанс...код уже готовый, состоит примерно из 50-70 строк...взять и переименовать процедуру в функцию я не могу. Просто когда дописал код, приспичило сделать поле выбора...как без функции сделать?
24 palsergeich
 
22.01.19
23:06
(23) Процедура от ффункции отличается тем, что:
У функции есть оператор ВОЗВРАТ.
Код, после попадания на оператор ВОЗВРАТ не выполняется.
Если ты переименуешь процедуру в функцию и возврат сделаешь на самой последней строке - ничего не сломается.
25 palsergeich
 
22.01.19
23:08
(24) И функция возвращает значение. но это не относится к телу функции
С точки зрения кода внутри функция конецФункции отличие только в (24)
26 Смотрящий
 
22.01.19
23:08
(22) Шантаж ? Вариантов действий несколько.
Начиная от съема доработок, заканчивая принятием невозвратной потери.
27 palsergeich
 
22.01.19
23:10
(26) На старте карьеры рук под таких гнулся, и вместо премии процентом у меня был чистый оклад.
Было дико противно.
Наверное по этому тот франч и загнулся в итоге.
28 palsergeich
 
22.01.19
23:16
А еще, что бы не дклать процедура-> функция, можно создать Реквизит формы СписокЛистов, и он будет глобальным для клиента и контекстного серверного вызова и перезаполнится в процедуре.
29 palsergeich
 
22.01.19
23:16
Тип значения - список значенйи
30 leon92
 
22.01.19
23:25
(28) так у меня и есть реквизит оно же поле
31 palsergeich
 
22.01.19
23:25
Это так не работает.
32 palsergeich
 
22.01.19
23:27
Тогда тебе не нужно ВыберитеНомерЛистаНачалоВыбора это событие
33 leon92
 
22.01.19
23:28
(24) сделал так, почти работает. но в коде указан номерЛиста = 2
и еще есть переменная Лист
закоментировать не могу они в коде хорошо подвязаны...
то есть при выборе из списка листа допустим третьего все равно грузится второй
34 leon92
 
22.01.19
23:29
(32) так и есть
35 leon92
 
22.01.19
23:30
(32) &НаКлиенте
Процедура ВыберитеНомерЛистаНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    
     СтандартнаяОбработка = Ложь;
ДанныеФормы = ОткрытьНаСервере(ВыберитеНомерЛиста);

КонецПроцедуры
36 palsergeich
 
22.01.19
23:30
(33) Уж коли ты в обители говнокода - напиши свою процедуру.
Тупо получаешь из Excel список листов и помещаешь его в реквизит формы.
37 palsergeich
 
22.01.19
23:30
Так ты не будешь привязан к этой процедуре.
Так себе решение.
38 palsergeich
 
22.01.19
23:31
Но оно лучше, чем копаться в процедуре код которой состоит из магических чисел
39 leon92
 
22.01.19
23:31
(37) это моя первая работа с кодом вообще
40 Fram
 
22.01.19
23:32
Палсергеич, я смотрю у тебя много свободного времени :)
41 palsergeich
 
22.01.19
23:33
НомерЛиста = 2; - одно это без внятного комментаря уже не гуд.
(40) Я кофе упился и меня штырит)
42 palsergeich
 
22.01.19
23:35
А чем тебе мешает НомерЛиста = 2;
В цикле по заполнению списка это не учитывается
43 palsergeich
 
22.01.19
23:37
СписокЛистов = Новый СписокЗначений;
Для Каждого ТекущийЛист Из файл.WorkSheets Цикл
СписокЛистов.Добавить(ТекущийЛист.Name);
КонецЦикла;

При заполнении он обходит коллекцию всех листов и записывает в список.
Конкрето здесь все нормально же.
По идее должно работать
44 leon92
 
22.01.19
23:38
(42) Лист = файл .WorkSheets(НомерЛиста); вот это мешает. переменная Лист фигурирует везде
45 leon92
 
22.01.19
23:39
(43) работатет. все видно. но выбираю. но грузит все равно НомерЛиста = 2
46 palsergeich
 
22.01.19
23:43
(45) Вот.
Теперь следующий шаг.
Если решить его быстро, то тогде так.
Меняешь
НомерЛиста = 2;
На
НомерЛиста = 1
Для Каждого ТекущийЛист Из файл.WorkSheets Цикл
Если ТекущийЛист.Name = Наименование Тогда
Преррвать;
КонецЕсли
НомерЛиста = НомерЛиста+1;
КонецЦикла;
При условии, что Процедура ОткрытьНаСервере(Наименование) тут Наименование это имя листа
47 palsergeich
 
22.01.19
23:44
Быстрое и не очень хорошее решение, но в нормальное решение - никто не поверит что ты сам)
48 leon92
 
22.01.19
23:57
(47) У меня сейчас нигде не указан НомерЛиста = 2, но НомерЛиста = Число(ВыберитеНомерЛиста); смотрю через отладку, номерЛиста = 2, ВыберитеНомерЛиста = "КОл"(он же в книги четвертый)..че за фигня не знаешь?
49 palsergeich
 
22.01.19
23:59
(48) См реквизиты формы.
50 palsergeich
 
23.01.19
00:00
может эти числа забиты в данныее формы ранее
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший