Имя: Пароль:
1C
1C 7.7
v7: Табличное поле: Как ячейку авт. поставить в режим редактирования?
,
0 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);
   ТП.Колонки.Добавить("НомерТТН").Данные = "НомерТТН";
   ТП.Колонки.Получить("НомерТТН").Заголовок = "Номер ТТН";

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

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

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


//1. ячейка становится как-бы выбранной, но не активной (курсора в ней нет)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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