Имя: Пароль:
1C
1C 7.7
v7: Удалить программно, интерактивно введенную строку в ТЧ дока, не закончив ее редактирование
,
0 MWWRuza
 
гуру
05.11.20
21:15
Собственно - вопрос в заголовке темы. Это вообще, как-то возможно, штатными средствами?
Подробнее... Интерактивно вводится новая строка, начинается ее заполнение. Выбираем значение одного из полей из справочника, после чего выполняем некоторые проверки. При выполнении некого условия, задаем вопрос - хотим продолжить или нет.
Если нет - надо прекратить ввод строки и удалить ее. Вызов метода УдалитьСтроку(), дает ошибку. По хорошему - надо куда-то вставить СтатусВозврата(0), но куда? Логично было-бы в процедуру ПриВводеСтроки(), но, тут еще проверяемое поле не выбрано, и анализировать нечего... После выбора значения поля, процедура ПриВводеСтроки() уже давно отработала, и уже ее не прервать СтатусомВозврата.

Пока сделал очистку значений в строке, если ее не надо вводить, и ее удаление в процедуре ПриОкончанииРедактированияСтроки(), если не заполнено проверяемое поле(это если пользователь все-таки не "Esc" нажмет, а все-таки продолжит ее ввод до завершения).
В принципе - это работает, терпимо... Решили отказаться от ввода строки, получили введенную пустую строку, как-бы в процессе редактирования. Нажали "Esc" она удалилась, "проклацали" "Enter" до конца - тоже удалилась. Можно как-то обмануть систему, и не требовать от пользователя нажатия лишних клавиш - отказались от ввода строки, и она сама исчезла?

PS При программном вводе строки, например при вводе ее из ВнешнегоСобытия, сканером, она спокойно удаляется, если нужно. А если ввод начат интерактивно, то получается и удалить ее можно только интерактивно отменив или завершив ввод?
1 Злопчинский
 
05.11.20
21:25
пошли в буфер клавы нажатие искейпа
2 Злопчинский
 
05.11.20
21:40
хм.. в ОбработкаВыбораЗначения
sendKeys искейпа уходит в никуда...
3 Злопчинский
 
05.11.20
21:45
Процедура ПриНачалеВыбораЗначения(ЭлементДиалога, ФлагСтандОбр)
    
    Если ЭлементДиалога="Номенклатура" Тогда
          Если ТутКодКривогоАрхитектурногоПодходаВыборЗначенияРУчкамиПрописыааемКодом()=0 Тогда
        ФлагСтандОбр = 0;
        глСервис.ЭмулироватьКлавиатуру("{ESC}",0);
        Возврат;
      КонецЕсли;
4 Злопчинский
 
05.11.20
21:45
вот так канает
5 Злопчинский
 
05.11.20
21:47
а вообще злопство так делать В СПИСКЕ.
открой форму элемента штатно новый по инсерту заполняй поля, анализируй, в нужном месте
Если ЧтоТоКриво()=1 Тогда
  СтатусВозврата(0);
  КактоСкинутьМодифицированностьВродеМожно();
  Форма.Закрыть();
КонецЕсли;

кнопка "Записать" - становится активной если все введено правильно.
типа так.. не?
6 MWWRuza
 
гуру
05.11.20
21:48
Ну, ты прямо мои мысли читаешь :-)
Уже пробовал. Делал так:
WSHShell = СоздатьОбъект("WScript.Shell");
WSHShell.SendKeys("{ESC}");
Но, почему-то не срабатывает, как будто и нет этого - строка остается, пустая, с мигающим курсором. Интерактивно "Esc" жмешь - удаляется... Может не из того места вызываю?
7 Злопчинский
 
05.11.20
21:52
ПриНачалеВыбораЗначения - работает
8 MWWRuza
 
гуру
05.11.20
21:54
(5) открой форму элемента штатно новый по инсерту
Зачем? Я не создаю новый элемент справочника, а только выбираю в ТЧ документа имеющийся.

А вот в (3) и (7), очень похоже на правду...
Надо переделать все это безобразие(не мое, поделка от Рарус), именно на ПриНачалеВыбораЗначения...
Сейчас там своя(не предопределенная) процедура выбота значения, вызываемая из поля ТЧ... Видимо по этому и не срабатывает.
9 Злопчинский
 
05.11.20
22:00
(8) перехвати инсерт. открой отдельную обработку-форму ввода строки. далее по тексту
10 MWWRuza
 
гуру
05.11.20
22:00
Это "Автозапчасти Автосервис" от Рарус... Готовлюсь к "колёсьям" :-)
Задумка в этом месте такая - вибираем в ТоварныйЧек товар, если это "Шины", запрашивается сканирование марки в отдельной форме обработки. Там пользователь сканирует код, а может нажать отмену. Если отсканировал - все понятно, код попал в ТЧ. А если отказался - тут два варианта - либо ввести без марки, либо прекратить ввод строки. Вот с последним и проблемка...
11 MWWRuza
 
гуру
05.11.20
22:04
(9) Можно... Но, вариант переделки на "ПриНачалеВыбораЗначения" как-то менее заметно для упертых кассиров будет... Новая форма - это лишний гиморой с объяснениями, как с этим работать. А тут должно все незаметно пройти.
12 MWWRuza
 
гуру
05.11.20
22:59
Спасибо за идею!
Все получилось, даже передача "Esc" не нужна, строчка и так удаляется:

    ИначеЕсли Идент = "Номенклатура" Тогда
        Флаг            = 0;
        Спр             = СоздатьОбъект("Справочник.Номенклатура");
        Рез             = Спр.Выбрать("", "ФормаСписка");
        Номенклатура    = Спр.ТекущийЭлемент();
        Рез            = ПриВыбореЗначения("Номенклатура");
        Если Рез = 0 Тогда
            УдалитьСтроку();
        КонецЕсли;

Функция "ПриВыбореЗначения" это как раз та, которая раньше вызывалась из элемента диалога. Если в ней пользователь отказался от продолжения продажи товара без сканирования марки, то строчка удаляется, как и при вводе по сканеру.
Мелочь, а так приятнее! Еще раз спасибо :-)
13 MWWRuza
 
гуру
06.11.20
01:51
Ну почти все идеально... Но: "А если отказался - тут два варианта - либо ввести без марки, либо прекратить ввод строки. Вот с последним и проблемка..."
С последним как раз проблем теперь нет - отказались, строчка удалилась, активизирую строку предыдущую. Все красиво.
А вот если решили продать без сканирования марки, строка добавляется, всепрекрасно, но она остается как-бы в режиме редактирования, по умолчанию - поле которое вводил - "Номенклатура" - серенькая, курсор мигает и педалька выбора есть... Если интерактивно нажать Esc, строчка удалится, хотя мне этого не надо. Если нажать Ентер несколько раз, то пройдя по всем доступным полям строки, ввод заканчивается, строка выходит из режима редактирования.
Делаешь АктивизироватьСтроку(КоличествоСтрок()); - строка удаляется! И все строки которые были перед ней, как-бы тоже(на самом деле - нет, если сделать Форма.Обновить(), то они появляются опять, кроме последней).
Делаю Активизировать("ОдноИзПолей", 0), выбранный реквизит становится активным и в режиме редактирования, несмотря на параметр "0"... Т.е. Ввод строки как-бы не завершается.
Глюк какой-то... Со сканера через внешнее событие - такого эффекта нет.
Мои "танцы с бубном":

Процедура ПриНачалеВыбораЗначения(Идент,Флаг)
// Управляет подчинением выбираемых справочников
    Если Идент                = "Единица" Тогда
        Флаг                = глДокументПриНачалеВыбораЕдиницы(Контекст);    
    ИначеЕсли Идент = "Номенклатура" Тогда
        Флаг                = 0;
        Спр                 = СоздатьОбъект("Справочник.Номенклатура");
        Рез                 = Спр.Выбрать("", "ФормаСписка");
        Если Рез     = 1 Тогда
            Номенклатура    = Спр.ТекущийЭлемент();
            Рез                = ПриВыбореЗначения("Номенклатура");
        КонецЕсли;    
        Если Рез     = 0 Тогда
            УдалитьСтроку();
            АктивизироватьСтроку(КоличествоСтрок());
        Иначе
            Если Номенклатура.Маркировка = 0 Тогда
                Активизировать("Количество", 1);
            Иначе
                //АктивизироватьСтроку(КоличествоСтрок());
                //рма.Обновить();
                //АктивизироватьСтроку();
                Активизировать("Цена", 0);
                //1Активизировать("Количество", 0);
                //Форма.Количество.Доступность(0);
                //WSHShell     = СоздатьОбъект("WScript.Shell");
                //WSHShell.SendKeys("{ENTER}");
                //WSHShell    = 0;
                //КТН    = "";    
            КонецЕсли;    
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры // ПриНачалеВыбораЗначения

Все что пробовал и не дало эффекта - закомментировано... Есть идеи, как побороть?
14 MWWRuza
 
гуру
06.11.20
01:56
+(13) Такое ощущение, что:

Активизировать(<ИмяРеквизита>,<Режим>)
<Режим> -  необязательный параметр. Имеет смысл только для строк списков. Число: 1 - войти в режим редактирования, 0 - не входить. Значение по умолчанию - 1.

Плевать она хотела на "Режим"... Хоть 0, хоть 1 передаешь, ничего не меняетя, все равно в режиме редактирования...
15 MWWRuza
 
гуру
06.11.20
01:59
+(14) Имеет смысл только для строк списков.
Получается в ТЧ документа не работает и не должно? Как тогда обойти это?
16 Cthulhu
 
06.11.20
02:24
Ctrl+Enter
17 victuan1
 
06.11.20
04:41
Всё делается проще - через "ложное" закрытие формы. У меня так сделано удаление строки, которая редактируется в текущий момент.
18 MWWRuza
 
гуру
06.11.20
16:45
(17) Да, все нормально теперь работает. Спасибо!