Сразу оговоримся, что этот пример не совсем хорош. Мы будем использовать сообщения пользователю, но не по назначению.
Сообщения пользователю предназначены для того, чтобы прервать действие и указать на элемент формы, содержащий неправильные данные.
Мы же будем использовать их для того, чтобы «подсказывать» пользователю, в какой элемент формы необходимо ввести данные. Полезное свойство сообщений заключается в том, что если сообщение выводится с привязкой к элементу формы, то этот элемент сразу же переходит в режим редактирования. Таким образом, пользователю остается всего лишь ввести в него правильные данные.
Сценарий, который мы будем реализовывать, имеет под собой вполне реальную основу. Зачастую оператору, вводящему накладную, удобно вводить ее не по строкам, а по столбцам.
Сначала вводится вся номенклатура – первая колонка. Затем вводится все количество – вторая колонка. После этого вводится вся цена – третья колонка. В конце контролируется итоговая сумма, и если есть расхождения, то они исправляются путем построчной проверки сумм.
Такой сценарий удобен тем, что на каждом этапе выполняются однотипные действия, которые легко сверять с бумажным документом. Сначала – подбор номенклатуры. Затем – ввод чисел.
Примечание
Пример можно посмотреть в демонстрационной базе «Таблица в форме», форма документа Накладная, обработчик ТоварыКоличествоПриИзменении() реквизита ТоварыКоличество таблицы.
Для того чтобы реализовать этот сценарий, напишем обработчик события При изменении для того реквизита таблицы, который предполагается заполнять по колонке.
В нашем случае таким реквизитом будет ТоварыКоличество (рис. 3.138).

Рис. 3.138. Реквизит «ТоварыКоличество»
Обработчик будет выглядеть следующим образом (листинг 3.114).
Листинг 3.114. Обработчик события «При изменении»
СтрокаКоллекции = Объект.Товары.НайтиПоИдентификатору(Элементы.Товары.ТекущаяСтрока);
ИндексСтрокиКоллекции = Объект.Товары.Индекс(СтрокаКоллекции);
Если Объект.Товары.Количество() > ИндексСтрокиКоллекции + 1 Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.КлючДанных = Объект.Ссылка;
Сообщение.ПутьКДанным = "Объект";
Сообщение.Поле = "Товары[" + Строка(ИндексСтрокиКоллекции + 1) + "].Количество";
Сообщение.Текст = "Введите количество товара";
Сообщение.Сообщить();
КонецЕсли;
Сначала мы находим строку коллекции, которая соответствует текущей строке таблицы (листинг 3.115).
Листинг 3.115. Получение строки коллекции
СтрокаКоллекции = Объект.Товары.НайтиПоИдентификатору(Элементы.Товары.ТекущаяСтрока);
Затем получаем индекс этой строки в коллекции, т. к. нам нужно будет привязать сообщение к следующей строке таблицы. Следующая строка будет иметь индекс на единицу больше, чем текущая (листинг 3.116).
Листинг 3.116. Получение индекса строки коллекции
ИндексСтрокиКоллекции = Объект.Товары.Индекс(СтрокаКоллекции);
После этого мы формируем сообщение пользователю и привязываем его к полю Количество, находящемуся в следующей строке таблицы (листинг 3.117).
Листинг 3.117. Привязка сообщения к полю «Количество»
Сообщение.Поле = "Товары[" + Строка(ИндексСтрокиКоллекции + 1) + "].Количество";
Условие Если… нужно для того, чтобы не формировать сообщение в том случае, когда редактируется последняя строка таблицы (листинг 3.118).
Листинг 3.118. Контроль окончания редактируемой таблицы
Если Объект.Товары.Количество() > ИндексСтрокиКоллекции + 1 Тогда
В результате, если запустить систему в режиме 1С:Предприятие и заполнить номенклатуру в документе Накладная, мы сможем затем последовательно ввести количество номенклатуры, просто набирая его на клавиатуре и нажимая клавишу Ввод. Позиционирование на нужном элементе управления и вход в режим редактирования будут выполняться автоматически. Кроме этого, сообщение в форме всегда будет подсказывать текущую позицию ввода, что удобно для сверки с документом (рис. 3.139).

Рис. 3.139. Позиционирование на следующем поле и подсказка