Имя: Пароль:
1C
1С v8
Задача на управляемых формах без модальных окон
0 PR
 
07.05.14
16:59
1. Это легко, решается так... 80% (8)
2. Это крайне сложно, потому что... 10% (1)
3. Свое мнение 10% (1)
Всего мнений: 10

Как бы вы решали следующую задачу на управляемых формах в тонком клиенте без модальных окон? :))
Про модальность написано здесь http://v8.1c.ru/o7/201301nm/.

Обработка в цикле перебирает все строки табличной части "Товары" всех документов "Приходная накладная".
Список документов и строк должен получаться запросом с определенным отбором, ну допустим все накладные по определенному контрагенту, а строки только с определенным товаром.
Все отобранные строки во всех отобранных документах должны быть удалены.

В начале обработки пользователь должен подтвердить, что он действительно хочет выполнить такую обработку.

Потом должны обработаться все отобранные строки всех отобранных документов.
В процессе выполнения перед обработкой каждого следующего документа должно проверяться, не нажал ли пользователь Ctrl + Break.
Также в процессе выполнения перед обработкой каждого следующего документа нужно информировать пользователя, что, к примеру, обрабатывается документ 8 из общего количества 12. Сообщить не подходит.

В конце обработки пользователю нужно вывести предупреждение, что обработка завершена.

Ну что, поехали? :))
1 Чайник Рассела
 
07.05.14
17:01
как автор тупак.

Это легко, решается так...
2 PR
 
07.05.14
17:01
Один немощный отметился :))
3 Torquader
 
07.05.14
17:03
А в чём проблема - мне кажется, что фоновое задание и управление им как раз тут кстати.
И ctrl+Break будет даже не при делах - простая кнопка СТОП пользователю будет намного приятнее.
4 PR
 
07.05.14
17:04
Я лично считаю, что в данной постановке задаче это крайне геморно, в основном из-за клиент-серверного взаимодействия, но не только :))

Это крайне сложно, потому что...
5 Apokalipsec
 
07.05.14
17:05
На форму обработки динамический список(ссылка + поля таб части), в шапку отборы, заполнил отборы, сформировал динамический список.
По кнопке выполнить делаешь что тебе хочется
6 PR
 
07.05.14
17:05
(3) Хм. Ну не знаю. В принципе интересная мысль, надо покумекать :))
7 PR
 
07.05.14
17:06
(5) См. (4) и (0).
8 MaxS
 
07.05.14
17:10
1) процедура Цикл по таблице с колонкой ответа пользователя.
находим необработанную строку, выводим диалог, выходим из цикла, завершаем процедуру.
2) Открывается немодальное окно, задается вопрос, по окончании запускается п.п.1.
3) окончательная обработка при необходимости по результатам диалога с пользователем.

Нужно исходить из задачи. Скорее всего всё можно сделать не так и не мучать пользователя вопросами.

Это легко, решается так...
9 Torquader
 
07.05.14
17:10
(5)
Отобрать не сложно - причём даже в таблицу.
Кнопка "Обработать" становится активной только после отбора.
В процессе обработки можно каждую строку "гасить", снимая галочку или выводя ОК.
P.S. у меня Excel читался и все ошибки в таблицу на форму прекрасно выводились.
А несколько этапов - это классический Wizzard.
10 jsmith82
 
07.05.14
17:11
Ппц

Это легко, решается так...
11 Apokalipsec
 
07.05.14
17:11
(7) В начале обработки пользователь должен подтвердить, что он действительно хочет выполнить такую обработку. <>  в тех ситуациях, когда от пользователя требуется ввод информации, без которой невозможно дальнейшее выполнение алгоритма.

Отбор как устанавливаются? всегда одинаковые?
Слишком много неизвестных.
12 rsv
 
07.05.14
17:12
(0) Есть  решение. Пишите на обычном толстом клиенте.
13 PR
 
07.05.14
17:12
(8) Не будет работать перечисленное в (0).
14 PR
 
07.05.14
17:15
(11) Блин, один раз сказать, да, я хочу действительно удалить все такие строки во всех таких документах.
Отбор устанавливается фиксированно в запросе, я же сказал.
Какие еще неизвестные?
15 su_mai
 
07.05.14
17:35
(0) Устроили тут параллельное программирование, понимаешь. Асинхронные вызовы, синхронизация потоков ляляля...

Как нас учили: нет простых и сложных задач, есть работа которую надо делать :)

Свое мнение
16 H A D G E H O G s
 
07.05.14
17:41
Не вижу никаких проблем.

Где мякотка то, Роман?

Ты помощи ищешь, или кичишься своей "крутизной"?

Это легко, решается так...
17 GROOVY
 
07.05.14
17:43
Так и не понял в чем сложность.

Это легко, решается так...
18 PR
 
07.05.14
18:12
(16), (17)
1. В начале обработки пользователь должен подтвердить, что он действительно хочет выполнить такую обработку.
Это при том, что это должно делаться без модальных окон и что потом в обработке должна срабатывать проверка, не нажал ли человек Ctrl + Break.
Как?

2. Список документов и строк должен получаться запросом с определенным отбором.
То есть на сервере.
То есть потом полученный результат нужно будет передать на клиента, чтобы можно было информировать пользователя после каждого документа.
Причем не линейный результат, потому что будет две вложенных выборки из результата запроса, то есть дерево.
Как?

3. В конце обработки пользователю нужно вывести предупреждение, что обработка завершена.
Ну, это ладно, просто, написано в Зазеркалье, как сделать.
19 H A D G E H O G s
 
07.05.14
18:18
(18)

1. ПоказатьВопрос() для 8.3. Своя форма для 8.2.

2. СписокЗначений на форме, значение элемента - ДокументСсылка, на сервере после запроса храниться соответствие Документ - МассивНомеромСтрокНаУдаление. Во врем. хране.
3) ПоказатьПредупреждение() для 8.3 Своя форма для 8.2


Не ипи мозг.
20 H A D G E H O G s
 
07.05.14
18:19
2. СписокЗначений на форме, значение элемента - ДокументСсылка, на сервере после запроса храниться соответствие Документ - МассивНомеромСтрокНаУдаление. Во врем. хране.

На Клиенте

Для Каждого ЭлементСписка Из СписокДокументов Цикл

ОбработкаПрерываенияПользователя();
ОбработатьДокументНаСервереБезКонтекста(ЭлементСписка.Значение);
Состояние("Обработано документов:");
21 Torquader
 
07.05.14
18:20
Мы хотим кого-то обработать - мы заполняем таблицу на форме значениями, которые пойдёт в обработку.
Потом пользователь напротив каждого значения поставит галочку (или кнопка "устрановить все") - типа это он подтверждает, что он хочет сделать - ну и кнопка "сделать".
На клиенте обходим таблицу и с каждой строкой - к серверу, чтобы он сделал - и результат.
22 Зойч
 
07.05.14
18:20
Лови
http://infostart.ru/public/76309/

Вопрос надеюсь в начале не проблема задать?
23 H A D G E H O G s
 
07.05.14
18:23
Роман Печенкин не успокоился на красном кожаном плаще.
Лавры Г1С тревожат тонкую душевную организацию Романа и заставляют высасывать проблемы из ниоткуда.
24 fisher
 
07.05.14
18:23
(0) Про фоновые задания уже говорили. Не так давно раскапывал, как это решается с использованием БСП: http://infostart.ru/public/274721/
25 PR
 
07.05.14
18:23
(19) Дима, не трахай мозг, раз не умеешь :))

1. ПоказатьВопрос() приводит к тому, что дальнейшая хрень будет выполняться в отдельном обработчике.
А в этом случае обработчик прерывания пользователя уже не выполняется.

2. То есть если у меня не две вложенных выборки, а три например, то я должен вообще облысеть, продумывая связанность данных? Хотелось бы по-человечески, по аналогии с обычной выборкой запроса.

3. Да, я и сказал, что это понятно как делать.
26 PR
 
07.05.14
18:25
(22) >>Вопрос надеюсь в начале не проблема задать?
LOL
Проблема :)) Как? :))
27 H A D G E H O G s
 
07.05.14
18:29
(25) "То есть если у меня не две вложенных выборки, а три например, то я должен вообще облысеть, продумывая связанность данных? Хотелось бы по-человечески, по аналогии с обычной выборкой запроса. "

Ну вот и приводи такой пример. Ты привел пример - получи решение.
28 H A D G E H O G s
 
07.05.14
18:30
(26) Своя форма.

Про не обработку события из ПоказатьВопрос() только счаст почитал.
29 fisher
 
07.05.14
18:32
(26) Уже сказали. ПоказатьВопрос()
Дальше на сервере фоновое задание.
При необходимости пользователь его прерывает кнопкой.
Технологии передачи прогресса на клиента отработаны и даже в БСП реализованы готовые.

Это легко, решается так...
30 PR
 
07.05.14
18:33
(28) Хм. Своя форма — это гуд, да :)) Мерси :))
31 PR
 
07.05.14
18:34
(27) Я привел шаблон задачи, но он должен быть легкомодифицируемым.
32 PR
 
08.05.14
10:23
Продолжим? :)) Кто-нить предложит красивое решение? :))
33 fisher
 
08.05.14
10:56
(32) Чем не устраивает (29)?
34 PR
 
08.05.14
11:31
(33) В (29) про то, как решить 1 из (25).
А это уже решил Дима в (28).

А вот про 2 в (29) ни слова. Не?
35 fisher
 
08.05.14
11:55
(34) В (29) про то, как решить сабж. Т.е. про отображение хода выполнения на клиенте и прерывания при необходимости любого длительного серверного алгоритма. Или сабж не про это?
36 PR
 
08.05.14
11:56
(35) Сабж _не только_ про то.
37 fisher
 
08.05.14
11:57
(36) Сформулируй момент, который остался за пределами формулировки (35). Я его как-то упустил.
38 Новиков
 
08.05.14
12:07
Код не привожу, т.к. ты сам в состоянии его родить.

Концепт уже сказали, только подъ итожу:
1. Своя форма. Ясно, что она уже не модальная.
2. Подключить прогресс-бар из БСП.

Осталось что? Как Ctrl+Break сделать? Или что?
39 PR
 
08.05.14
12:08
(37) См. (31)
40 Адский плющ
 
08.05.14
12:08
Не понял, причем тут отказ от модального режима. Все замечательные телодвижения, которые достались от этого отказа, в задаче не нужно использовать.

Это легко, решается так...
41 PR
 
08.05.14
12:09
(38) Осталось клиент-серверное взаимодействие.
То есть код обработки одного документа выполняется на сервере, но информирование после каждого документа на клиенте.
42 PR
 
08.05.14
12:09
(40) Читай ветку
43 fisher
 
08.05.14
12:10
(39) Сформулируй внятно (37)
В (29) приведен шаблон универсального легко модифицируемого решения.
44 Новиков
 
08.05.14
12:11
(41) Слушай, ну ты ж обновления типовых то видел? Прогресс-бар на клиенте? :) Это хня из бсп. Открой взгляни.
45 fisher
 
08.05.14
12:13
(41) Тебе про это уже мульен раз в этой ветке написали.
46 PR
 
08.05.14
12:13
Короче, надо глянуть, потом продолжим беседу с мордобоем :))
47 Адский плющ
 
08.05.14
12:14
(42) Прочитал. Не впечатлило. Все пользовательские модальные ситуации (вопрос, предупреждение) стартуют сразу на форме.

Т.е. не происходит даже вложений обработок оповещения в параметры других обработок оповещения, как это происходит с интерактивными функциями, расположенными в общих модулях.

Т.е. весь вопрос в организации циклического возвращения на клиент во время обработки. А отказ от модальности тут ни при чем.
48 Адский плющ
 
08.05.14
12:15
+(47) Ну или фоновое задание.
49 PR
 
08.05.14
12:17
(47) Блин, прочитай http://v8.1c.ru/o7/201301nm/. Внимательно.
50 fisher
 
08.05.14
12:23
У кого-то в этой ветке кризис непонимания. И это явно не (47)
51 Kamas
 
08.05.14
12:36
ну блин нарисуй на форме 2 кнопки"да" "нет" и одну надпись "Все кончено" как запрос отработал сделал 2 кнопки видимыми остальное не видимым пользователь нажал на "Да" -стартанул обработку на "нет" Закрыл окно в обработке по цыклу строчки обрабатывать и прерывание пользователя ловиш как все сделал делаешь надпись видимой что  "Все кончено" а всю стороннюю лабуду не видимой

Это легко, решается так...
52 Web00001
 
08.05.14
12:37
Я видимо один не понимаю где сложно.
>>В начале обработки пользователь должен подтвердить, что он действительно хочет выполнить такую обработку.
С этим все просто. Мы же не будем на этом останавливаться?

>>Потом должны обработаться все отобранные строки всех отобранных документов.
С этим все ок. Делим задачу на порции, порции где то сохраняем(у нас БД или где?) и го в цикле из клиента на сервер, выполнять обработку.

>>В процессе выполнения перед обработкой каждого следующего документа должно проверяться, не нажал ли пользователь Ctrl + Break.
Каждого документа не знаю как реализовать. Но между порциями, можно проверять, не было ли нажатия. Порцией может быть отдельный документ.

>>Также в процессе выполнения перед обработкой каждого следующего документа нужно информировать пользователя, что, к примеру, обрабатывается документ 8 из общего количества 12. Сообщить не подходит.
Ну это решается регламентными заданиями реализации есть и описаны подробно.

Проблема только в том, насколько точно тебе нужно обрабатывать прерывание пользователя.
53 PR
 
08.05.14
12:45
(51) То есть пользователь должен нажать две кнопки? Буэ.
54 Kamas
 
08.05.14
12:48
(53) а он и так нажмет их 2 первый раз когда стартанет второй раз когда ответит на вопрос
55 PR
 
08.05.14
12:48
(52) >>>>В начале обработки пользователь должен подтвердить, что он действительно хочет выполнить такую обработку.
>>С этим все просто. Мы же не будем на этом останавливаться?
LOL. Как? :))

>>>>Потом должны обработаться все отобранные строки всех отобранных документов.
>>С этим все ок. Делим задачу на порции, порции где то сохраняем(у нас БД или где?) и го в цикле из клиента на сервер, выполнять обработку.
Блин. Напишешь полстранички простого кода? :))

>>>>В процессе выполнения перед обработкой каждого следующего документа должно проверяться, не нажал ли пользователь Ctrl + Break.
>>Каждого документа не знаю как реализовать. Но между порциями, можно проверять, не было ли нажатия. Порцией может быть отдельный документ.
Опять же, код напишешь? :))

>>>>Также в процессе выполнения перед обработкой каждого следующего документа нужно информировать пользователя, что, к примеру, обрабатывается документ 8 из общего количества 12. Сообщить не подходит.
>>Ну это решается регламентными заданиями реализации есть и описаны подробно.
Регламентное задание будет что-то сообщать пользователю или что?
56 PR
 
08.05.14
12:49
(54) Ну тогда три раза.
57 Kamas
 
08.05.14
12:50
(56) Где 3 раз
58 PR
 
08.05.14
12:51
(57) Нажал выполнить, потом нажал еще раз выполнить, потом пошло выполнение.
59 Kamas
 
08.05.14
12:53
(58) ну так и при вопросе ему придется 2 раза нажимать по другому он не может подтвердить свои дейсвия
60 Kamas
 
08.05.14
12:55
для пользователя мне кажется особой разницы  нет будет ли вопрос на той-же самой форме или на отдельной
61 Web00001
 
08.05.14
13:03
>>LOL. Как? :))
эм метод в (49)? Обработка оповещения?

>>Блин. Напишешь полстранички простого кода? :))
Мне за тебя еще и код написать? Ну так то можно, если об оплате договоримся.

>>Регламентное задание будет что-то сообщать пользователю или что?
1Сник который не умеет гуглить....
http://goo.gl/3EklWH
62 PR
 
08.05.14
13:27
(59) Мля, при вопросе он один раз ответит, если только ты ему не будешь вопрос задавать два раза два раза.
63 PR
 
08.05.14
13:29
(61) >>эм метод в (49)? Обработка оповещения?
эм нет.

>>Мне за тебя еще и код написать? Ну так то можно, если об оплате договоримся.
Если ты его потом купишь, можем договориться. Пока это теоретическая задача.

>>1Сник который не умеет гуглить....
Ну да. Вопрос, почем нынче яблоки, а ответ про урожай зерновых в прошлом году, да :))
64 Web00001
 
08.05.14
13:36
(63)
>>эм нет.
Что тебя не устроило?

>>Если ты его потом купишь, можем договориться. Пока это теоретическая задача.
Какой то бред. Ты предлагаешь написать код. Я говорю, что я(как и 90% сидящих здесь) беру за это деньги. И тебе бесплатно писать пока причин не вижу, вне зависимости от того, теоретическая это задача или клиент у тебя за спиной стоит. Не понимаю, что я должен при этом покупать.

>>Ну да. Вопрос, почем нынче яблоки, а ответ про урожай зерновых в прошлом году, да :))
Вопрос, про информирование пользователя о прогрессе выполнения задачи. Ответ на это есть, а в каком ты виде это покажешь, это уже твоя головная боль.
65 Kamas
 
08.05.14
13:43
(62) либо лыжи не едут либо меня не понимают  какая в п..у разница где ты ему будешь этот вопрос задавать через отдельную форму либо на этой самой форме. Подтверждение то только ожидание реакции пользователя. В качестве подтверждения  мы можем хоть стриптиз возле стула просить станцевать. Вопрос в том что у нас есть какое то действие которое мы можем уловить в стандартном случае открытие модального окна которое тормозит выполнение кода до ответа пользователя если ты хочешь отказаться от модальных окон то я высказал тебе предложение что пользователь должен нажать на кнопку  причем кнопка появляются только после его (пользователя ) определенных действий до того как пользователь не нажмет на эту кнопку работа его приостановится как и при открытии модального окна. Где нарушение логики??
66 PR
 
08.05.14
13:54
(64) >>Что тебя не устроило?
Меня не устраивает то, что не все умеют читать. См (25).

>>И тебе бесплатно писать пока причин не вижу, вне зависимости от того, теоретическая это задача или клиент у тебя за спиной стоит.
Я тебя понял. Ты не видишь причин решать эту задачу. Не решай, я не настаиваю.

>>Вопрос, про информирование пользователя о прогрессе выполнения задачи. Ответ на это есть, а в каком ты виде это покажешь, это уже твоя головная боль.
Вопрос был чисто из любопытства, как регламентное задание сообщает что-то клиенту. А ответ, посмотри сам. Ну OK.
67 PR
 
08.05.14
13:56
(65) Нарушение описано в первом пункте в (25).
68 Kamas
 
08.05.14
14:04
(67) Ок Задача свех трудная почти не выполнимая. Бред. В (25) ваще про другое
69 PR
 
08.05.14
14:06
(68) В (25) написано то, что обработка прерывания пользователя не будет вызываться в обработчике, вызванном после нажатия кнопки по ПоказатьВопрос().
70 Kamas
 
08.05.14
14:31
(69) ну тык у тебя и не будет отдельного обработчика
71 PiVa123
 
08.05.14
14:53
(69) Поэтому надо рисовать свою форму вопроса, и передавать обработчик, жаль тока ОпиманиеОповещения нельзя запихать в параметры формы, а так ...

В основной форме



&НаКлиенте
Процедура Команда1(Команда, Пар=Неопределено) Экспорт
    
    ОткрытьФорму("ВнешняяОбработка.PR.Форма.ФормаВопрос", Новый Структура("Обработчик", "Обработка"),ЭтаФорма,УникальныйИдентификатор, ВариантОткрытияОкна.ОтдельноеОкно);
    
КонецПроцедуры

&НаКлиенте
Процедура Обработка(Результат=Неопределено, Параметры=Неопределено) Экспорт
    
    Процент=0;
    Доки=ПолучитьДокументы();
    Сч=0;
    КолВо=Доки.Количество();
    
    Для каждого Ссылка Из Доки Цикл
        ОбработкаПрерыванияПользователя();
        
        сч=сч+1;
        Процент=Сч/КолВо*100; // Для индикатора
        //ЭтаФОрма.ОбновитьОтображениеДанных();
        
        // Для показа кода
        Состояние("Обработка ", Процент);
        
        ОбработатьДокумент(Ссылка);
        
    КонецЦикла;
    
    ПоказатьПредупреждение(,"Дело сделано");
    
КонецПроцедуры

&НаСервереБезКонтекста
Процедура ОбработатьДокумент(Ссылка)
    
    ДокОбъект=Ссылка.ПолучитьОбъект();

КонецПроцедуры

&НаСервереБезКонтекста
Функция ПолучитьДокументы()
    
    Запрос=Новый Запрос;
    Запрос.Текст="Выбрать первые 100 ССылка из документ.реализациятоваровуслуг";
    Возврат Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка");
    
КонецФункции


В форме вопроса

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    Параметры.Свойство("Обработчик", Обработчик);
    
КонецПроцедуры

&НаКлиенте
Процедура Да(Команда)
    
    Закрыть();
    // Так как нельзя передать ссылку на форму и обработчик оповещения через сервер то считаем обработчик в вызываемой форме
    ВыполнитьОбработкуОповещения(Новый ОписаниеОповещения(Обработчик, ВладелецФормы));
    
КонецПроцедуры

&НаКлиенте
Процедура Нет(Команда)
    
    Закрыть();
    
КонецПроцедуры
72 Web00001
 
08.05.14
14:54
Может я мало писал под УФ, поэтому мне и не понятно. Покажи где ошибка:
1. Нажатие кнопки -> Проц1 на клиенте
2. Проц1 -> Проц2 на сервере
3. Проц2:
3.1 Формирует набор данных для обработки
3.2 Сохраняет этот набор где то.
3.3 Формирует массив ключей для обхода данных из клиента
4. Проц 1 сохраняет массив ключей в реквизит формы
5. Проц 1 вызывает форму которая спросит пользователя
6. Вызванная форма, оповещением запускает проц3, которая обходя массив ключей и выполняя обработку, пишет процент или прогресс на форме.
73 PiVa123
 
08.05.14
15:01
(71) ОписаниеОповещения можно передавать в клиентскую переменную формы вопроса по "Оповестить".
74 PR
 
08.05.14
15:12
(70) А как будет задаваться вопрос пользователю, с помощью Вопрос?
75 PiVa123
 
08.05.14
18:01
(74) Такое ощущение, что ТС не понял что я написал, или понял - принял и теперь молчит. :)
76 PR
 
09.05.14
19:37
(75) Ну, я не только в ветках на МиСте сижу, есть и другие дела, а вообще, да, не понял, что имелось в виду.
77 PiVa123
 
09.05.14
20:38
(75) Как-то приведенный код с комментариями - комментировать лениво.
Ну, если не понял, то печально.
Ошибка? Это не ошибка, это системная функция.