В разработке на платформе 1С:Предприятие 8.3 часто возникает задача: программно добавить новую строку в табличную часть и сразу же перевести ее в режим редактирования, чтобы пользователю не приходилось лишний раз кликать мышкой или нажимать клавишу Enter. Казалось бы, метод ИзменитьСтроку() создан именно для этого, но на практике программисты часто сталкиваются с ситуацией, когда строка добавляется, ячейка выделяется, а курсор для ввода текста так и не появляется. Разберем подробно, почему так происходит и какие способы решения существуют.
Первое, что нам необходимо понять — это разделение данных и их визуального представления в управляемом приложении. Когда мы пишем Объект.ИмяТаблицы.Добавить(), мы работаем с данными (прикладным объектом). Форма «узнает» об изменениях в данных, но ее элементы интерфейса могут не успеть синхронизироваться мгновенно для выполнения интерактивных команд, таких как вход в режим редактирования.
Рассмотрим стандартный код, который часто не дает ожидаемого результата:
НоваяСтрока = Объект.СтрокиРасходнойНакладной.Добавить();
Элементы.СтрокиРасходнойНакладной.ТекущаяСтрока = НоваяСтрока.ПолучитьИдентификатор();
Элементы.СтрокиРасходнойНакладной.ТекущийЭлемент = Элементы.СтрокиРасходнойНакладнойНоменклатура;
Элементы.СтрокиРасходнойНакладной.ИзменитьСтроку();
Проанализируем ситуацию: в данном примере мы сначала модифицируем данные, затем пытаемся позиционировать элемент формы на новой строке по ее идентификатору и вызываем метод редактирования. Основная причина неудачи здесь часто кроется в том, что фокус еще не «устоялся» на таблице, или платформа блокирует программный вызов команды редактирования из-за настроек интерфейса.
Вместо того чтобы добавлять строку непосредственно в объект данных, правильнее использовать методы самого элемента формы (таблицы). Метод ДобавитьСтроку() у элемента таблицы формы делает сразу несколько вещей: добавляет строку в связанные данные, делает ее текущей и подготавливает интерфейс к работе с ней.
Рассмотрим правильную последовательность действий:
// Сначала убедимся, что сама таблица является текущим элементом формы
ЭтаФорма.ТекущийЭлемент = Элементы.СтрокиРасходнойНакладной;
// Используем метод элемента формы для добавления
Элементы.СтрокиРасходнойНакладной.ДобавитьСтроку();
// Теперь вызываем метод перехода к редактированию
Элементы.СтрокиРасходнойНакладной.ИзменитьСтроку();
Важный нюанс: при таком подходе система сама понимает, какую строку нужно редактировать, так как метод ДобавитьСтроку() автоматически делает новую строку текущей.
Выясним еще одну интересную особенность платформы. Метод ИзменитьСтроку() программно эмулирует нажатие кнопки «Изменить» (или клавиши F2). Если в свойствах таблицы на форме отключена возможность изменения (снята галочка «Изменять состав строк») или если команда «Изменить» удалена из командной панели и контекстного меню, метод может игнорироваться.
Проверьте следующие настройки в конфигураторе:
ТолькоПросмотр установлено в значение Ложь.Иногда визуально кажется, что режим редактирования не включился, хотя метод отработал. Это связано со свойством колонки РежимРедактирования. Посмотрим на наиболее эффективную настройку для нашей задачи:
У колонки (например, Номенклатура) в палитре свойств найдите параметр «Вход при вводе». Если установить его в значение Да, то при активации ячейки (в том числе программной) платформа будет сразу открывать редактор или выпадающий список. Также полезно проверить свойство РежимРедактирования у самой таблицы — оно должно быть установлено в В списке или В списке и диалоге.
Если стандартные методы не помогают (например, из-за специфической логики в событии ПриАктивизацииСтроки), можно прибегнуть к проверенному методу с небольшой задержкой. Это позволит форме завершить все внутренние процессы отрисовки перед тем, как мы скомандуем ей войти в режим редактирования.
Разберем, как это реализовать:
&НаКлиенте
Процедура ДобавитьИРедактировать(Команда)
НоваяСтрока = Объект.СтрокиРасходнойНакладной.Добавить();
Элементы.СтрокиРасходнойНакладной.ТекущаяСтрока = НоваяСтрока.ПолучитьИдентификатор();
// Передаем фокус на колонку
Элементы.СтрокиРасходнойНакладной.ТекущийЭлемент = Элементы.СтрокиРасходнойНакладнойНоменклатура;
// Вызываем активацию через короткую паузу (0.1 сек)
ПодключитьОбработчикОжидания("АктивизироватьРедактированиеСтроки", 0.1, Истина);
КонецПроцедуры
&НаКлиенте
Процедура АктивизироватьРедактированиеСтроки()
Элементы.СтрокиРасходнойНакладной.ИзменитьСтроку();
КонецПроцедуры
Этот метод гарантирует, что к моменту вызова ИзменитьСтроку() фокус формы уже окончательно закрепился на нужной ячейке новой строки.
Для стабильной работы программного редактирования в 1С 8.3 (Управляемые формы) рекомендуется придерживаться следующего алгоритма:
Элементы.Таблица..., а не через Объект.Таблица..., если важна немедленная реакция интерфейса.ЭтаФорма.ТекущийЭлемент.Соблюдение этих правил позволит сделать интерфейс вашей обработки или документа максимально отзывчивым и удобным для конечного пользователя.