Как в 1С 7.7 определить активную строку табличной части документа

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

При разработке интерфейсов в платформе 1С:Предприятие 7.7 часто возникает задача динамического отображения сопутствующих данных по выбранной позиции (например, показ остатков товара по складам, цен, резервов или истории взаиморасчетов). Однако при попытке прочитать номер активной строки через свойство НомерСтроки разработчики нередко сталкиваются с ситуацией, когда система всегда возвращает номер последней строки документа или значение, равное общему количеству строк.

Разберем детально, почему так происходит и как правильно получать данные текущей активной строки табличной части документа.

Почему НомерСтроки возвращает последнюю строку документа

Проанализируем механику работы контекста документа в 1С 7.7. Внутренний указатель текущей строки табличной части в контексте формы является общим как для визуального отображения, так и для программного кода модуля формы. К сбиванию фокуса активной строки обычно приводят следующие причины:

  1. Программный обход строк в модуле формы: Если в процедуре ПриОткрытии, в функции пересчета итогов или в формуле любого другого элемента диалога выполняется цикл обхода строк вида ВыбратьСтроки() ... ПолучитьСтроку(), указатель документа смещается. После завершения такого цикла внутренний курсор всегда остается на последней позиции (равной КоличествоСтрок()). Любое дальнейшее обращение к переменным табличной части или НомерСтроки вернет данные последней строки.
  2. Порядок расчета формул на форме: Элементы диалога типа «Текст» с назначенными формулами вычисляются в определенной последовательности. Если перед вашей функцией отрабатывает чужой программный код, выполняющий перебор табличной части, контекст строки смещается до момента вызова нужного метода.
  3. Отсутствие метода ТекущаяСтрока(): В отличие от объекта ТаблицаЗначений, встроенная табличная часть объекта Документ в платформе 7.7 не имеет метода ТекущаяСтрока(), поэтому обращаться к ней напрямую таким способом нельзя.

Правильный способ получения текущей строки через текстовый реквизит формы

Рассмотрим базовый и наиболее надежный штатный механизм платформы 1С 7.7. Для динамического отслеживания строки табличной части разместим на форме документа визуальный элемент диалога типа «Текст» и назначим ему функцию-обработчик.

Разберем по шагам, как это реализовать:

  1. Открываем форму документа в конфигураторе и добавляем элемент управления Текст (разместить его можно как в рабочей области, так и за пределами видимой части формы).
  2. В свойствах элемента на вкладке «Дополнительно» в поле Формула прописываем вызов функции, например: ПоказатьДанныеСтроки().
  3. В модуле формы документа описываем саму функцию, обязательно проверяя наличие строк и валидность индекса:

Функция ПоказатьДанныеСтроки()
    Если (КоличествоСтрок() > 0) И (НомерСтроки > 0) Тогда
        // Читаем реквизиты текущей активной строки
        ТекТовар = Номенклатура;
        ТекНомер = НомерСтроки;
        
        // Выполняем требуемые действия, например, расчет остатков
        // Возвращаем текст для отображения на форме
        Возврат "Строка " + ТекНомер + ": " + Строка(ТекТовар);
    КонецЕсли;
    
    Возврат "";
КонецФункции

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

Способы предотвращения сбоя указателя строки при расчетах

Если в форме документа необходимо выполнить служебный перебор строк табличной части (для подсчета сумм, проверки заполнения или выгрузки), важно не сбивать контекст формы. Рассмотрим проверенные варианты решения этой проблемы.

Вариант 1. Изоляция обхода через отдельный объект документа

Посмотрим на пример использования независимого объекта. Создаем отдельный экземпляр документа через СоздатьОбъект и выполняем перебор строк в нем. При этом контекст формы остается нетронутым:


Док = СоздатьОбъект("Документ." + Вид());
Если Док.НайтиДокумент(ТекущийДокумент()) = 1 Тогда
    Док.ВыбратьСтроки();
    Пока Док.ПолучитьСтроку() = 1 Цикл
        // Обработка данных строки без влияния на курсор формы
    КонецЦикла;
КонецЕсли;

Вариант 2. Выгрузка табличной части в Таблицу Значений

Разберем вариант с предварительной выгрузкой строк. Этот подход не меняет позицию курсора и работает значительно быстрее прямого перебора:


ТЗ = СоздатьОбъект("ТаблицаЗначений");
ВыгрузитьТабличнуюЧасть(ТЗ);

// Далее выполняем любые циклы и расчеты по объекту ТЗ
ТЗ.ВыбратьСтроки();
Пока ТЗ.ПолучитьСтроку() = 1 Цикл
    // Расчет данных
КонецЦикла;

Вариант 3. Сохранение и восстановление позиции курсора

Если программный перебор в контексте формы неизбежен, запомним номер активной строки перед циклом и восстановим его после завершения с помощью метода ПолучитьСтрокуПоНомеру():


ТекПозиция = НомерСтроки;

ВыбратьСтроки();
Пока ПолучитьСтроку() = 1 Цикл
    // Выполнение необходимых операций
КонецЦикла;

// Восстанавливаем исходный указатель
Если ТекПозиция > 0 Тогда
    ПолучитьСтрокуПоНомеру(ТекПозиция);
КонецЕсли;

Важный момент: В платформе 1С 7.7 нет встроенного события «ПриАктивизацииСтроки». Вычисление формулы текстового поля происходит при общей перерисовке диалога. Если требуется принудительно обновить отображение данных на форме после изменения состояния, вызовите метод Форма.Обновить().

← На главную