8.х Переход по колонкам и строкам табличного поля

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем Samouchka, 10 сен 2015.

  1. TopicStarter Overlay
    Samouchka
    Offline

    Samouchka Опытный в 1С

    Регистрация:
    20 мар 2013
    Сообщения:
    214
    Симпатии:
    1
    Баллы:
    29
    Переход по колонкам и строкам табличного поля

    Бодрого дня всем! Есть табличная часть ДеталРасчетПоле. В ней колонки КоличествоЗакупка, ЦенаЗакупка, режим редактирования для них - Непосредственно. Нужно при окончании редактирования КоличествоЗакупка перейти на ЦенаЗакупка текущей строки. А при окончании редактирования ЦенаЗакупка выполнить следующее:
    Если это не последняя строка ТП, то перейти на следующую строку в КоличествоЗакупка
    Если была последняя строка ТП, то добавить строку и в ней перейти к КоличествоЗакупка
    Ну т.е. короче говоря "бегать курсором" по нужным колонкам и всем строкам ТП.

    На данный момент задача решена, но как! За счет двух процедур: ОкончаниеВводаТекста - для табличного поля и ОбновлениеОтображения - для формы документа. Думаю, если будет много строк, то все это дело будет тормозить. Пытался объединить код двух процедур только в обработчик ТП ОкончаниеВводаТекста, результат - вылет программы 1С. Есть у кого-нибудь лучший вариант? Прошу не предлагать мне устанавливать свойство ПропускатьПриВвводе для других колонок, ибо в общем случае их также необходимо заполнять.

    Вот мой код для события ТП "ОкончаниеВводаТекста":

    Код:
    Процедура ДеталРасчетПолеЦенаЗакупкаОкончаниеВводаТекста(Элемент, Текст, Значение, СтандартнаяОбработка)
        СтрокаТЧ = ЭлементыФормы.ДеталРасчетПоле.ТекущаяСтрока;
        Если СтрокаТЧ <> Неопределено Тогда
            ИндексСтрокиТЧ = ДеталРасчет.Индекс(СтрокаТЧ);
            Если ИндексСтрокиТЧ >= 0 И ИндексСтрокиТЧ+1 < ДеталРасчет.Количество() Тогда
                мСледующаяСтрокаЦенаЗакупка = ДеталРасчет[ИндексСтрокиТЧ+1];
                мСменитьСтрокуЦенаЗакупка = Истина;
            КонецЕсли;
           
            Если ИндексСтрокиТЧ >= 0 И ИндексСтрокиТЧ+1 >= ДеталРасчет.Количество() Тогда
                ДеталРасчет.Добавить();
                мСледующаяСтрокаЦенаЗакупка = ДеталРасчет[ИндексСтрокиТЧ+1];
                мСменитьСтрокуЦенаЗакупка = Истина;
            КонецЕсли;
        КонецЕсли;
    КонецПроцедуры
    
    Процедура ДеталРасчетПолеКоличествоЗакупкаОкончаниеВводаТекста(Элемент, Текст, Значение, СтандартнаяОбработка)
        мСменитьКолонкуЗакупки = Истина;
    КонецПроцедуры
    Вот код для события ОбновлениеОтображения формы документа:

    Код:
    Если мСменитьСтрокуЦенаЗакупка Тогда
            мСменитьСтрокуЦенаЗакупка = Ложь;
            ЭлементыФормы.ДеталРасчетПоле.ТекущаяСтрока = мСледующаяСтрокаЦенаЗакупка;
            ЭлементыФормы.ДеталРасчетПоле.ТекущаяКолонка=ЭлементыФормы.ДеталРасчетПоле.Колонки.КоличествоЗакупка;
        КонецЕсли;
       
        Если мСменитьКолонкуЗакупки Тогда
            мСменитьКолонкуЗакупки=ложь;
            ЭлементыФормы.ДеталРасчетПоле.ТекущаяКолонка=ЭлементыФормы.ДеталРасчетПоле.Колонки.ЦенаЗакупка;
    КонецЕсли;
    Ну и соответственно, устанавливаюпеременные в начале и конце модуля:

    Код:
    //в начале модуля
    Перем мСменитьСтрокуЦенаЗакупка;
    Перем мСледующаяСтрокаЦенаЗакупка;
    Перем мСменитьКолонкуЗакупки;
    
    //в конце модуля
    мСменитьСтрокуЦенаЗакупка = Ложь;
    мСменитьКолонкуЗакупки=Ложь; 
  2. Катюфка
    Offline

    Катюфка Профессионал в 1С

    Регистрация:
    3 июн 2013
    Сообщения:
    412
    Симпатии:
    72
    Баллы:
    54
    Здравствуйте.
    Мой дядя всегда говорит: "Работает? Не трогай!" Количество строк кода - не главный показатель скорости работы. Особенно в 1С.
  3. TopicStarter Overlay
    Samouchka
    Offline

    Samouchka Опытный в 1С

    Регистрация:
    20 мар 2013
    Сообщения:
    214
    Симпатии:
    1
    Баллы:
    29
    Да меня не длинный код смущает, а обработчик формы ОбновлениеОтображения. Насколько он быстро срабатывает? Будет ли все корректно при быстром заполнении табличного поля? Не будет ли косяков если в ТП появится много строк?
  4. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.572
    Симпатии:
    717
    Баллы:
    204
    если интерактивно заполнять, то я не думаю, что пользователь сможет физически заполнять колонки со скоростью выше 1-2 в секунду :)
  5. TopicStarter Overlay
    Samouchka
    Offline

    Samouchka Опытный в 1С

    Регистрация:
    20 мар 2013
    Сообщения:
    214
    Симпатии:
    1
    Баллы:
    29
    Вот в чем еще прикол. Если на форме сделать кнопку, то в ее действие можно зафигачить весь нужный код. При ее нажатии можно будет переходить на следующую строчку - сам делал. Думаю, можно доработать процедуру кнопки и на добавление строки, и на смену колонки. Почему-то действие кнопки 1С хавает, а если делать тоже для поля ввода, то вылетает. Тогда в обработчик поля ввода ОкончаниеВводаТекста можно допетрить имитацию нажатия кнопки через комобъект (если самой кнопки назначить клавишу) - подобный код где-то встречался на просторах Инета. Саму кнопку остается сделать невидимой, или на худой конец уменьшить до мизерных размеров. Но вот тут я не знаю тонкостей платформы 1С. Что будет с комобъектом дальше при его создании? Он будет удаляться после создания, или с каждым созданием эти виртуальные объекты будут накапливаться и засорять кэш? Какой бы Вы выбрали вариант, или же у кого есть мысли получше?

Поделиться этой страницей