Книга: Разработка интерфейса прикладных решений на платформе "1С:Предприятие 8"
Назад: Глава 3.17. Работа с таблицей в форме
Дальше: Сохранение текущей строки после загрузки данных

Ввод данных по колонкам

Сразу оговоримся, что этот пример не совсем хорош. Мы будем использовать сообщения пользователю, но не по назначению.

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

Мы же будем использовать их для того, чтобы «подсказывать» пользователю, в какой элемент формы необходимо ввести данные. Полезное свойство сообщений заключается в том, что если сообщение выводится с привязкой к элементу формы, то этот элемент сразу же переходит в режим редактирования. Таким образом, пользователю остается всего лишь ввести в него правильные данные.

Сценарий, который мы будем реализовывать, имеет под собой вполне реальную основу. Зачастую оператору, вводящему накладную, удобно вводить ее не по строкам, а по столбцам.

Сначала вводится вся номенклатура – первая колонка. Затем вводится все количество – вторая колонка. После этого вводится вся цена – третья колонка. В конце контролируется итоговая сумма, и если есть расхождения, то они исправляются путем построчной проверки сумм.

Такой сценарий удобен тем, что на каждом этапе выполняются однотипные действия, которые легко сверять с бумажным документом. Сначала – подбор номенклатуры. Затем – ввод чисел.

Примечание

Пример можно посмотреть в демонстрационной базе «Таблица в форме», форма документа Накладная, обработчик ТоварыКоличествоПриИзменении() реквизита ТоварыКоличество таблицы.

Для того чтобы реализовать этот сценарий, напишем обработчик события При изменении для того реквизита таблицы, который предполагается заполнять по колонке.

В нашем случае таким реквизитом будет ТоварыКоличество (рис. 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. Позиционирование на следующем поле и подсказка

Назад: Глава 3.17. Работа с таблицей в форме
Дальше: Сохранение текущей строки после загрузки данных