Как в 1С 7.7 связать флажок на форме с текущей строкой табличной части

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

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

Решение 1. Синхронизация через скрытое текстовое поле с формулой

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

Рассмотрим порядок реализации данного механизма:

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

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

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

Разберем важные нюансы работы этого метода:

Ограничение на ресурсоемкие операции: Функция ПриТексте() вызывается платформой очень часто (при движении мыши, перерисовке окон, смене фокуса). Внутри нее категорически нельзя выполнять запросы, сложные циклы или вызывать метод Форма.Обновить(), иначе интерфейс начнет заметно зависать и мерцать. Внутри функции должны быть только легковесные проверки реквизитов текущей строки.

Решение 2. Выбор значений по месту через интерактивное меню

Если задача заключается в быстрой простановке определенного текста в колонку табличной части с возможностью ручного редактирования, удобным решением является вызов всплывающего контекстного меню на ячейке с помощью метода ВыбратьЗначение() объекта СписокЗначений.

Посмотрим на пример реализации выпадающего списка при нажатии на реквизит в строке:


Перем МенюВыбора;

Процедура ПриОткрытии()
    МенюВыбора = СоздатьОбъект("СписокЗначений");
    МенюВыбора.ДобавитьЗначение("По себестоимости", "По себестоимости");
    МенюВыбора.ДобавитьЗначение("", "Очистить");
КонецПроцедуры

Процедура ВыборЗначенияСтроки()
    Перем ВыбЗнач, Поз;
    ВыбЗнач = "";
    Поз = 0;
    
    // Режим "2" открывает компактное всплывающее меню
    Если МенюВыбора.ВыбратьЗначение(ВыбЗнач, "Выберите статус", Поз, , 2) = 1 Тогда
        Если Поз = 1 Тогда
            Примечание = МенюВыбора.ПолучитьЗначение(Поз);
        Иначе
            Примечание = "";
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

В свойствах колонки табличной части в поле «Формула» прописываем вызов ВыборЗначенияСтроки(). При нажатии клавиши Enter или двойном клике по ячейке будет открываться меню выбора, а при обычном щелчке мыши пользователь сможет ввести произвольный текст с клавиатуры.

Позиционирование курсора в списке выбора

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


Процедура ВыбратьСрок()
    Перем ВыбЗнач, НомПозиции;
    
    НомПозиции = 0;
    Если ПустоеЗначение(СрокГарантии) = 0 Тогда
        НомПозиции = СписокСроков.НайтиЗначение(Строка(СрокГарантии));
    КонецЕсли;
    
    // Эмулируем нажатие стрелки вниз для позиционирования
    Если НомПозиции > 1 Тогда
        глСервис.ЭмулироватьКлавиатуру("{DOWN " + (НомПозиции - 1) + "}");
    КонецЕсли;
    
    ВыбЗнач = 0;
    Если СписокСроков.ВыбратьЗначение(ВыбЗнач, "Срок гарантии", НомПозиции, "60", 1) = 1 Тогда
        СрокГарантии = СписокСроков.ПолучитьЗначение(НомПозиции);
    КонецЕсли;
КонецПроцедуры

Альтернативные подходы к организации интерфейса

Проанализируем другие способы решения задачи отображения признаков в строках табличной части:

  1. Колонка с пиктограммами в таблице: Вместо выноса отдельного флажка за пределы таблицы создается числовой реквизит строки (0 или 1). В свойствах колонки подключается файл с пиктограммами галочки. При клике на колонку в формуле выполняется инверсия значения (Флаг = 1 - Флаг). Это избавляет от необходимости синхронизировать реквизиты диалога с активной строкой.
  2. Использование внешних компонент: Применение библиотек расширения интерфейса (таких как FormEx или 1C++) предоставляет нативные события ПриСменеСтрокиТП или полноценный элемент управления «Табличное поле», где поддерживаются стандартные колонки-флажки и прямое событие ПриАктивизацииСтроки.
← На главную