При разработке интерфейсов документов в платформе 1С:Предприятие 7.7 разработчики часто сталкиваются с задачей: на форме расположен элемент управления Флажок, состояние которого должно меняться в зависимости от данных в выбранной строке табличной части, а при клике на флажок должно меняться значение в текущей строке. В отличие от версии 8.х, где предусмотрено штатное событие ПриАктивизацииСтроки, в платформе 7.7 прямого события смены строки у штатной таблицы диалога нет. Разберем по шагам, как решить эту задачу стандартными средствами платформы, а также рассмотрим альтернативные способы быстрого ввода предопределенных значений.
Проанализируем классический прием платформы 1С 7.7: использование текстового поля на форме, в формуле которого прописан вызов пользовательской функции. Платформа пересчитывает формулы элементов типа Текст при любых событиях перерисовки окна диалога (включая перемещение по табличной части и смену активной строки).
Рассмотрим порядок реализации данного механизма:
ПриТексте() или ?(ПриТексте(), "", "").фл1) и назначим ему процедуру-обработчик клика фл1().
// Функция вызывается при перерисовке диалога и обновляет состояние флажка
Функция ПриТексте()
Если (НомерСтроки > 0) И (СокрЛП(Примечание) = "По себестоимости") Тогда
фл1 = 1;
Иначе
фл1 = 0;
КонецЕсли;
Возврат "";
КонецФункции
// Процедура вызывается при интерактивном нажатии на флажок пользователем
Процедура фл1()
Если НомерСтроки > 0 Тогда
Если фл1 = 1 Тогда
Примечание = "По себестоимости";
Иначе
Примечание = "";
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Разберем важные нюансы работы этого метода:
Ограничение на ресурсоемкие операции: Функция ПриТексте() вызывается платформой очень часто (при движении мыши, перерисовке окон, смене фокуса). Внутри нее категорически нельзя выполнять запросы, сложные циклы или вызывать метод Форма.Обновить(), иначе интерфейс начнет заметно зависать и мерцать. Внутри функции должны быть только легковесные проверки реквизитов текущей строки.
Если задача заключается в быстрой простановке определенного текста в колонку табличной части с возможностью ручного редактирования, удобным решением является вызов всплывающего контекстного меню на ячейке с помощью метода ВыбратьЗначение() объекта СписокЗначений.
Посмотрим на пример реализации выпадающего списка при нажатии на реквизит в строке:
Перем МенюВыбора;
Процедура ПриОткрытии()
МенюВыбора = СоздатьОбъект("СписокЗначений");
МенюВыбора.ДобавитьЗначение("По себестоимости", "По себестоимости");
МенюВыбора.ДобавитьЗначение("", "Очистить");
КонецПроцедуры
Процедура ВыборЗначенияСтроки()
Перем ВыбЗнач, Поз;
ВыбЗнач = "";
Поз = 0;
// Режим "2" открывает компактное всплывающее меню
Если МенюВыбора.ВыбратьЗначение(ВыбЗнач, "Выберите статус", Поз, , 2) = 1 Тогда
Если Поз = 1 Тогда
Примечание = МенюВыбора.ПолучитьЗначение(Поз);
Иначе
Примечание = "";
КонецЕсли;
КонецЕсли;
КонецПроцедуры
В свойствах колонки табличной части в поле «Формула» прописываем вызов ВыборЗначенияСтроки(). При нажатии клавиши Enter или двойном клике по ячейке будет открываться меню выбора, а при обычном щелчке мыши пользователь сможет ввести произвольный текст с клавиатуры.
Когда требуется открыть список значений так, чтобы курсор автоматически встал на ранее сохраненный элемент (а не на первую позицию списка), в платформе 1С 7.7 можно применить эмуляцию клавиатурных команд:
Процедура ВыбратьСрок()
Перем ВыбЗнач, НомПозиции;
НомПозиции = 0;
Если ПустоеЗначение(СрокГарантии) = 0 Тогда
НомПозиции = СписокСроков.НайтиЗначение(Строка(СрокГарантии));
КонецЕсли;
// Эмулируем нажатие стрелки вниз для позиционирования
Если НомПозиции > 1 Тогда
глСервис.ЭмулироватьКлавиатуру("{DOWN " + (НомПозиции - 1) + "}");
КонецЕсли;
ВыбЗнач = 0;
Если СписокСроков.ВыбратьЗначение(ВыбЗнач, "Срок гарантии", НомПозиции, "60", 1) = 1 Тогда
СрокГарантии = СписокСроков.ПолучитьЗначение(НомПозиции);
КонецЕсли;
КонецПроцедуры
Проанализируем другие способы решения задачи отображения признаков в строках табличной части:
0 или 1). В свойствах колонки подключается файл с пиктограммами галочки. При клике на колонку в формуле выполняется инверсия значения (Флаг = 1 - Флаг). Это избавляет от необходимости синхронизировать реквизиты диалога с активной строкой.ПриСменеСтрокиТП или полноценный элемент управления «Табличное поле», где поддерживаются стандартные колонки-флажки и прямое событие ПриАктивизацииСтроки.