При разработке интерфейсов в 1С часто возникает задача изменить значение поля ввода — прибавить к нему число или вычесть определенную сумму. Сложности обычно возникают на двух этапах: когда поле ввода содержит строковый тип данных вместо числового либо когда вычисление происходит во второй (вспомогательной) форме, а результат требуется отобразить в первой (основной).
Разберем по шагам, как правильно выполнять арифметические операции со значениями реквизитов и как организовать корректную передачу данных между формами.
Проанализируем базовую операцию сложения. Если реквизит формы, связанный с полем ввода, изначально имеет числовой тип (например, Число с заданной точностью), то операция выполняется стандартным оператором сложения:
РеквизитСумма = РеквизитСумма + ПрибавляемоеЧисло;
Если же поле ввода связано с реквизитом строкового типа (Строка), прямое сложение приведет к строковой конкатенации (например, к строке «200» прибавится «100» и получится «200100»). Чтобы выполнить математическое сложение, выполним явное преобразование строки в число с помощью функции Число(), а затем вернем результат обратно в строку через Строка():
ПолеВвода = Строка(Число(ПолеВвода) + 100);
Рассмотрим распространенную ошибку, когда разработчик пытается передать вычисленное значение из подчиненной формы в основную следующим кодом:
Форма = ПолучитьФорму("Форма1");
Форма.ПолеВвода1 = ПолеВвода1 + 100;
Выясним причину, почему такой подход не работает:
ПолучитьФорму() без передачи уникального ключа создает в памяти платформы совершенно новый экземпляр формы. Изменение реквизитов в этом новом объекте никак не отражается на той форме, которая уже открыта на экране у пользователя.Посмотрим на классический и наиболее надежный способ передачи данных из подчиненной формы в основную. При открытии второй формы в качестве владельца указывается первая форма.
В коде вызывающей формы (Форма1) открываем вторую форму:
Форма2 = ПолучитьФорму("Обработка.МояОбработка.Форма.Форма2", , ЭтаФорма);
Форма2.Открыть();
Во второй форме (Форма2) по нажатию кнопки вызываем метод ОповеститьОВыборе() и передаем вычисленное число:
Процедура Кнопка1Нажатие(Элемент)
ОповеститьОВыборе(100);
КонецПроцедуры
В первой форме (Форма1) создаем стандартный обработчик события ОбработкаВыбора, где перехватываем значение и выполняем сложение:
Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)
Если ТипЗнч(ВыбранноеЗначение) = Тип("Число") Тогда
РеквизитСумма = РеквизитСумма + ВыбранноеЗначение;
КонецЕсли;
КонецПроцедуры
Рассмотрим вариант, когда формы не связаны явной иерархией «владелец — подчиненная форма». В этом случае удобно использовать глобальный механизм оповещений.
В Форме2 по нажатию кнопки отправляем оповещение с нужным именем события и числовым параметром:
Процедура Кнопка1Нажатие(Элемент)
Оповестить("ПересчитатьСумму", 100);
КонецПроцедуры
В Форме1 объявляем процедуру-обработчик события формы ОбработкаОповещения:
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
Если ИмяСобытия = "ПересчитатьСумму" Тогда
РеквизитСумма = РеквизитСумма + Параметр;
КонецЕсли;
КонецПроцедуры
Если разработка ведется в режиме обычного приложения (толстый клиент), можно напрямую обратиться к реквизиту формы-владельца через свойство ВладелецФормы:
Процедура Кнопка1Нажатие(Элемент)
Если ВладелецФормы <> Неопределено Тогда
ВладелецФормы.РеквизитСумма = ВладелецФормы.РеквизитСумма + 100;
КонецЕсли;
КонецПроцедуры
Важно: При использовании этого метода убедитесь, что в подчиненную форму при ее открытии был корректно передан контекст родительской формы в качестве параметра Владелец.