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

v7: Табличное поле: Как ячейку авт. поставить в режим редактирования?

v7: Табличное поле: Как ячейку авт. поставить в режим редактирования?
Я
   Zhuravlik
 
24.01.13 - 13:26
Добрый день. Пишу небольшую обработку для ввода значений, пользую ТП. Хочу сделать нечто похожее на редактирование строки документа (т.е. после окончания редактирования текущей ячейки нужно сделать текущую в той-же строке, в след. колонке, и открыть ее для редактирования). Не пойму как ее "Выбрать", чтобы сработала процедура "Выбор".  Вот код:


//ОКНО ОТКРЫВАЕТСЯ МОДАЛЬНО
Перем ТекКолонка, ТП, тзРедактор;

//======================================================================
Процедура ПриОтжатииКнопкиКлавиатуры(Код, Альт, Шифт, Кнтрл, Сим, ФСО)
   
   Если Код = 45 Тогда
       тзРедактор.НоваяСтрока();        
       ТП.ОбновитьСтроки();        
   ИначеЕсли Код = 46 Тогда
       нс = ТП.ТекущаяСтрока;        
       Если Число(нс) > 0 Тогда            
           тзРедактор.УдалитьСтроку(нс);
           ТП.ОбновитьСтроки();                        
       КонецЕсли;
   КонецЕсли;
   
КонецПроцедуры // ПриОтжатиКнопкиКлавиатуры

//====================================================
Процедура ТаблПоле_ПриАктивизацииКолонки(ТП)
   Если ПустоеЗначение(ТекКолонка)=0 Тогда
       ТекКолонка.ЦветФона=-1;
   КонецЕсли;
   ТП.ТекущаяКолонка.ЦветФона=гд_ПолучитьЦвет(231, 234, 254);
   ТекКолонка=ТП.ТекущаяКолонка;
КонецПроцедуры

//======================================================================
Процедура РедактироватьЗначениеТП(нс)
   Перем зн;
   
   зн = тзРедактор.ПолучитьЗначение(нс, ТекКолонка.Данные);
   
   Длина = 0; Точность = 0; Идент = 0;
   тзРедактор.ПолучитьПараметрыКолонки(ТекКолонка.Данные, ,Длина, Точность, Идент);

   ТП.РедактироватьЗначение(
                           нс,
                           ТекКолонка,
                           3,
                           зн,
                           Длина,
                           Точность,
                           Идент,
                           "");    
КонецПроцедуры // РедактироватьЗначениеТП

//======================================================================
Процедура ТаблПоле_Выбор(ТП, нс, Колонка, ТипРегиона)
   Перем зн;
   
   Если ТипРегиона <> 3 Тогда
       Возврат;
   КонецЕсли;

   РедактироватьЗначениеТП(нс);
КонецПроцедуры // ТаблПоле_ПриАктивизацииЯчейки

//======================================================================
Процедура ТаблПоле_ПриРедактированииЗначения(ТП, стр, кол, рег, зн)
   тзРедактор.УстановитьЗначение(стр, кол.Данные, зн);
   ТП.ОбновитьСтроки();
   
   нк = ТП.Колонки.Индекс(кол);
   Если нк < 2 Тогда
//Вот здесь перехожу к следующей колонке (их всего 3, проверяю по индексу колонки ТП)
       ТП.ТекущаяКолонка = ТП.Колонки.Получить(нк + 1);
       ТаблПоле_ПриАктивизацииКолонки(ТП);
       РедактироватьЗначениеТП(стр);
//Я так понимаю, что здесь нужно программно нажать "Enter" на текущей ячейке, чтобы сработала процедура
//ТаблПоле_Выбор(). Если же я тупо ставлю эту процедуру вот так:
//ТаблПоле_Выбор(ТП, стр, ТекКолонка, 3) - то происходит следующее:
//1. ячейка становится как-бы выбранной, но не активной (курсора в ней нет)
//2. При закрытии окна обработки 1С чуть приторомаживает и вылетает безо всяких ошибок.
   КонецЕсли;
   
КонецПроцедуры // ТаблПоле_ПриРедактированииЗначения(стр, кол, рег, знач)




Процедура ФормаПриСоздании(_Форма)

   тзРедактор = СоздатьОбъект("ТаблицаЗначений");
   тзРедактор.НоваяКолонка("НомерТТН", "Строка", "6");
   тзРедактор.НоваяКолонка("ДатаРейса", "Дата");
   тзРедактор.НоваяКолонка("Кол_АМ", "Число", 2, 0);

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

   ТП.СтильЗаголовков = 1;
   ТП.РежимВыделенияСтроки = 2;
   ТП.ЦветФонаВыделения2 = гд_ПолучитьЦвет(231, 234, 254);
   ТП.Колонки.Добавить("НомерТТН").Данные = "НомерТТН";
   ТП.Колонки.Получить("НомерТТН").Заголовок = "Номер ТТН";

   ТП.Колонки.Добавить("ДатаРейса").Данные = "ДатаРейса";
   ТП.Колонки.Получить("ДатаРейса").Заголовок = "Дата рейса";

   ТП.Колонки.Добавить("Кол_АМ").Данные = "Кол_АМ";
   ТП.Колонки.Получить("Кол_АМ").Заголовок = "Кол а/м";    
   
   ТаблПоле_ПриАктивизацииКолонки(ТП);
   ТП.ОбновитьСтроки();    
   
КонецПроцедуры

//======================================================================
Процедура ПриОткрытии()
   _Форма=СоздатьОбъект("Форма");
   _Форма.УстановитьФорму(Форма);
КонецПроцедуры // ПриОткрытии
 
 
   Zhuravlik
 
1 - 24.01.13 - 13:36
+ Не могу найти в описании метод, чтобы выполнить выбор текущей ячейки...
   Ёпрст
 
2 - 24.01.13 - 13:44
ntreofzrjkjyrf/ntreofzcnhjrf
   Zhuravlik
 
3 - 24.01.13 - 13:45
Уже разобрался)) 
гСервис.ЭмулироватьКлавиатуру("{ENTER}");
   Zhuravlik
 
4 - 24.01.13 - 13:46
(2) текущаяколонка.текущаястрока ? Это надо прожевать...
   Zhuravlik
 
5 - 24.01.13 - 13:48
(2) В смысле устанваливать текущую строку  и текущую колонку? Это я и так делаю, проблема в том, чтобы ячейку "Выбрать". Вот догнал - эмулирую нажатие ентера, но подозреваю что это не совсем хорошо, если можно лучше - подскажите пожалуйста?
   antoneus
 
6 - 24.01.13 - 14:17
Ну и вызывай метод РедактироватьЗначение, подсовывай ему следующую колонку после того как завершишь редактирование в текущей ячейке.
   Zhuravlik
 
7 - 24.01.13 - 14:28
(6) Я так делал, в комментарии забыл сказать. Происходит то же самое, как и при вызове процедуры "Выбор":


//1. ячейка становится как-бы выбранной, но не активной (курсора в ней нет)
 
 
 //2. При закрытии окна обработки 1С чуть приторомаживает и вылетает безо всяких ошибок.
 

Можно еще вопрос? Я читал на форуме, что вроде есть событие "ПриОтменеРедактирования()", но описал в модуле, а реакции нет... В документации описание отсутствует, есть такое событие или нет?
   Mikeware
 
8 - 24.01.13 - 14:31
(7) как описал в модуле?
   antoneus
 
9 - 24.01.13 - 14:34
ПриОтменеРедактированияЗначения
Синтаксис:
ПриОтменеРедактированияЗначения(ТабличноеПоле, стр, кол, рег)
Назначение:
- Завершает отмену ввода значения
Параметры:
стр, кол, рег: строка, колонка, регион - координаты окна
   antoneus
 
10 - 24.01.13 - 14:35
(7) >как-бы выбранной, но не активной (курсора в ней нет)

тут недопонял
 
 Рекламное место пустует
   Zhuravlik
 
11 - 24.01.13 - 14:42
(10) Т.е. она становится "беленькой", но курсора в ней не стоит. Когда я ставлю в нее курсор, все-равно вводить значение не получается, надо выделить пустую область, и вот тогда можно что-нибудь вбить. Это если я вызываю РедактироватьЗначениеТП(стр) в процедуре "ПриРедактированииЗначения" (в коде (0)). А потом 1С вылетает.
(8) Описал неправильно, ПриОтменеРедактирования(), надо было ПриОтменеРедактированияЗначения(), но в доках не нашел.
(9) Спасибо)
   Zhuravlik
 
12 - 24.01.13 - 14:51
+ В принципе обойдусь ЭмулироватьКлавиатуру(), вроде полчаса - полет нормальный) ни глюка, ни вылета. 1С++ рулит)
Спасибо всем за поддержку.
   varelchik
 
13 - 24.01.13 - 19:00
А ты еще список редактируемых колонок используй.
и походу иди по нем определяя где находишься.
Причем для полей с типом Справочник,Документ,Перечисление еще можно эмулировать F4 если значение не вырано, тогда полностью получаеться эмуляция работы с Табличной часть документа.
   ADirks
 
14 - 25.01.13 - 07:45
ну вот так всё работает, например

Процедура тпТЧПослеРедактированияЗначения(Источник, нСтрТП, КолонкаТП, ТипРегиона)
    ИмяКолТП = КолонкаТП.Имя;
    тпТЧ_тзДанные.ПолучитьСтрокуПоНомеру(нСтрТП);
    Если ИмяКолТП = "Материал" Тогда
        Если тпТЧ_тзДанные.КоличествоШтук = 0 Тогда
            кол = тпТЧ.Колонки.КоличествоШтук;
            тпТЧ.ТекущаяКолонка = кол;
            тпТЧВыбор(Источник, нСтрТП, кол, ТипРегиона);
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры
   ADirks
 
15 - 25.01.13 - 07:49
Ну и цитата из описалова, на всякий

РедактироватьЗначение(стр, кол, рег, знач, длина, точность, идентификатор, флаги)

- Открывает окно для редактирования значения по заданным координатам.

Параметры:
стр, кол, рег: строка, колонка, регион - координаты окна
знач: значение, определяет тип контрола и начальные данные
длина: доп. характеристика типа для чисел и строк
точность: доп. характеристика типа для чисел
идентификатор: идентификатор элемента управления (может быть пустым)
флаги: параметры создаваемого контрола; могут задаваться числом и строкой, в том числе шестнадцатиричной (с префиксом 0x)

ЗавершитьРедактированиеЗначения()

- Завершает редактирование с вызовом события
- Возвращает флаг успешности операции (1 или 0)

ОтменитьРедактированиеЗначения()

- Отменяет редактирование без вызова события
- Возвращает флаг успешности операции (пока всегда 1)

--> События ТП:
ПриРедактированииЗначения(стр, кол, рег, знач, фсо)

- Завершает успешный ввод значения

Параметры:
стр, кол, рег: строка, колонка, регион - координаты окна
знач: введенное значение
фсо: флаг стандартной обработки

ПриОтменеРедактированияЗначения(стр, кол, рег)

- Завершает отмену ввода значения

Параметры:
стр, кол, рег: строка, колонка, регион - координаты окна
ПослеРедактированияЗначения(стр, кол, рег)

- Вызывается после успешного ввода значения (и отработки события ПриРедактированииЗначения)
- Событие может быть использовано для запуска нового редактирования значения

Параметры:
стр, кол, рег: строка, колонка, регион - координаты окна завершенного редактирования


Флаги:
dpDoNotTab     0x00000004    // пропускать при вводе
 
dpQuickChoice     0x00000008    // быстрый выбор
 
dpUseHelpString     0x00000010    // использовать описание (в качестве подсказки)
 
dpHasButton     0x00000020    // имеет кнопку выбора
 
dpDisableAutoChoice     0x00000200    // автовыбор выкл
 
dpUndefined     0x00100000    // неопределенный тип (тип может быть назначен)
   Zhuravlik
 
16 - 25.01.13 - 12:23
(13) Текущую колонку я определяю так (это из демо-примера):

Процедура ТаблПоле_ПриАктивизацииКолонки(ТП)
    Если ПустоеЗначение(ТекКолонка)=0 Тогда
        ТекКолонка.ЦветФона=-1;
    КонецЕсли;
    ТП.ТекущаяКолонка.ЦветФона=гд_ПолучитьЦвет(231, 234, 254);
    ТекКолонка=ТП.ТекущаяКолонка;
КонецПроцедуры

(14)(15) "ПослеРедактированияЗначения(стр, кол, рег)" -  Не знал, спасибо)
   ADirks
 
17 - 25.01.13 - 12:32
Зачем определять тек.колонку, когда она тебе в событие передаётся? Ну или ТЧ.ТекущаяКолонка, если нет такого параметра.
   Zhuravlik
 
18 - 25.01.13 - 13:18
(17) Это понятно, но если я уже пользуюсь (для смены фона) этой процедурой, почему бы ее и не юзать? Мне кажется так и код читабельней.
   ADirks
 
19 - 25.01.13 - 13:27
Это тебе кажется. А на самом деле это источник труднообнаружимых ошибок.
   Zhuravlik
 
20 - 25.01.13 - 15:34
(19) Понял, перепишу.

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