Создание процедуры обработки события в модуле формы
Щелкните правой кнопкой мыши на поле ввода в колонке Количество и откройте для него палитру свойств (пункт контекстного меню Свойства). Прокрутите список до конца, и вы обнаружите перечень событий, которые могут быть связаны с этим полем ввода.
С большинством элементов управления связаны различные события, и именно с их помощью разработчик может влиять на ход работы программы.
Среди событий, связанных с полем ввода, найдите событие При изменении. Это событие возникает после изменения значения поля ввода.
Щелкните по кнопке с лупой в конце поля ввода, и система создаст заготовку процедуры обработчика этого события в модуле нашей формы (рис. 3.10).
Рис. 3.10. Выберем событие «При изменении», и система создаст заготовку процедуры в модуле формы…
Модуль – это «хранилище» для текста программы на встроенном языке. В конфигурации существует большое количество модулей, которые расположены в различных ее точках. Они могут принадлежать некоторым объектам конфигурации (например, формам), а могут существовать сами по себе (принадлежать всей конфигурации в целом). Текст программы, содержащийся в модулях, будет использоваться платформой в заранее известные моменты работы системы 1С:Предприятие.
В модуль формы, в процедуру МатериалыКоличествоПриИзменении() добавим следующий текст (листинг 3.1):
Листинг 3.1. Процедура МатериалыКоличествоПриИзменении()
СтрокаТабличнойЧасти = ЭлементыФормы.Материалы.ТекущиеДанные;
СтрокаТабличнойЧасти.Сумма = СтрокаТабличнойЧасти.Количество * СтрокаТабличнойЧасти.Цена;
Объясним назначение этих строк.
В первой строке мы обращаемся к программному объекту ЭлементыФормы. Этот объект является коллекцией значений, содержащей все элементы управления, расположенные на нашей форме. Каждый элемент управления формы можно получить, указав его имя в качестве свойства объекта ЭлементыФормы. В данном случае мы обращаемся к элементу управления с именем Материалы (ЭлементыФормы.Материалы).
Этот элемент управления отображает строки табличной части нашего документа. Получить ту строку, в которой в настоящее время осуществляется редактирование, можно при помощи свойства программного объекта ТабличноеПоле – ТекущиеДанные. Таким образом, в результате выполнения первой строки переменная СтрокаТабличнойЧасти будет содержать объект ДокументТабличнаяЧастьСтрока.ПриходнаяНакладная.Материалы, в котором находятся редактируемые данные.
Во второй строке вычисляется сумма как произведение количества и цены. Объект ДокументТабличнаяЧастьСтрока.<имя> позволяет обратиться к данным конкретной колонки, указав имя колонки в качестве свойства объекта (например, СтрокаТабличнойЧасти.Количество).
Теперь посмотрим, как это работает. В окне программы откроем список документов ПриходнаяНакладная и откроем любой из двух созданных нами документов. Если теперь вы поменяете количество в любой строке документа, то сумма в строке будет пересчитана автоматически.
Замечательно. Но теперь хотелось бы и для поля Цена сделать то же самое. А если заглянуть вперед, то мы увидим, что подобное автоматическое заполнение поля Сумма может нам понадобиться и в других документах. Поэтому лучше будет поместить расчет суммы в некотором «общедоступном» месте, чтобы разные документы, имеющие аналогичные реквизиты табличной части, могли использовать этот алгоритм.
Для описания таких «общедоступных» мест служат объекты конфигурации Общий модуль, расположенные в ветке Общиеà Общие модули. Процедуры и функции, содержащиеся в этих модулях, могут быть доступны для любых объектов конфигурации.
Создание процедуры обработки события в общем модуле
Для того чтобы алгоритм, выполняемый при обработке события, был доступен для разных документов, мы создадим общий модуль и перенесем в него нашу процедуру расчета суммы. А в документе просто оставим вызовы этой процедуры из общего модуля.
Создадим объект конфигурации Общий модуль в ветке Общие à Общие модули и назовем его РаботаСДокументами. Он будет содержать следующий текст (листинг 3.2):
Листинг 3.2. Процедура РассчитатьСумму()
Процедура РассчитатьСумму(СтрокаТабличнойЧасти) Экспорт
СтрокаТабличнойЧасти.Сумма = СтрокаТабличнойЧасти.Количество * СтрокаТабличнойЧасти.Цена;
КонецПроцедуры
Ключевое слово Экспорт в конце оператора Процедура как раз указывает на то, что эта процедура может быть доступна из других программных модулей.
Затем в модуле нашей формы изменим текст нашего обработчика (листинг 3.3):
Листинг 3.3. Процедура МатериалыКоличествоПриИзменении()
Процедура МатериалыКоличествоПриИзменении(Элемент)
СтрокаТабличнойЧасти = ЭлементыФормы.Материалы.ТекущиеДанные;
//
РаботаСДокументами.РассчитатьСумму(СтрокаТабличнойЧасти);
КонецПроцедуры
Таким образом, теперь вместо непосредственного расчета суммы мы будем вызывать процедуру из общего модуля и передавать ей в качестве параметра нужную нам строку табличной части.
Проверим, как это работает, и убедимся, что ничего не изменилось.
Теперь осталось и для поля Цена установить такой же обработчик.
Создайте обработчик события При изменении для поля ввода, которое расположено в колонке Цена, и повторим в нем вызов процедуры РассчитатьСумму из общего модуля (листинг 3.4):
Листинг 3.4. Процедура МатериалыЦенаПриИзменении()
Процедура МатериалыЦенаПриИзменении(Элемент)
СтрокаТабличнойЧасти = ЭлементыФормы.Материалы.ТекущиеДанные;
//
РаботаСДокументами.РассчитатьСумму(СтрокаТабличнойЧасти);
КонецПроцедуры
Запустим 1С:Предприятие в режиме отладки и убедимся, что теперь сумма в строках табличной части документов Приходная накладная пересчитывается как при изменении количества, так и при изменении цены.