Как сложить или вычесть числовое значение в поле ввода и передать результат между формами в 1С

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

При разработке интерфейсов в 1С часто возникает задача изменить значение поля ввода — прибавить к нему число или вычесть определенную сумму. Сложности обычно возникают на двух этапах: когда поле ввода содержит строковый тип данных вместо числового либо когда вычисление происходит во второй (вспомогательной) форме, а результат требуется отобразить в первой (основной).

Разберем по шагам, как правильно выполнять арифметические операции со значениями реквизитов и как организовать корректную передачу данных между формами.

Операции с числами и приведение типов данных

Проанализируем базовую операцию сложения. Если реквизит формы, связанный с полем ввода, изначально имеет числовой тип (например, Число с заданной точностью), то операция выполняется стандартным оператором сложения:

РеквизитСумма = РеквизитСумма + ПрибавляемоеЧисло;

Если же поле ввода связано с реквизитом строкового типа (Строка), прямое сложение приведет к строковой конкатенации (например, к строке «200» прибавится «100» и получится «200100»). Чтобы выполнить математическое сложение, выполним явное преобразование строки в число с помощью функции Число(), а затем вернем результат обратно в строку через Строка():

ПолеВвода = Строка(Число(ПолеВвода) + 100);

Почему не работает прямое изменение через ПолучитьФорму

Рассмотрим распространенную ошибку, когда разработчик пытается передать вычисленное значение из подчиненной формы в основную следующим кодом:


Форма = ПолучитьФорму("Форма1");
Форма.ПолеВвода1 = ПолеВвода1 + 100;

Выясним причину, почему такой подход не работает:

  1. Создание нового экземпляра: Метод ПолучитьФорму() без передачи уникального ключа создает в памяти платформы совершенно новый экземпляр формы. Изменение реквизитов в этом новом объекте никак не отражается на той форме, которая уже открыта на экране у пользователя.
  2. Разделение данных и элементов интерфейса: Поле ввода — это визуальный элемент управления. Значение хранится в реквизите объекта или реквизите формы, к которому привязан элемент.

Способ 1. Использование механизма выбора (через владельца формы)

Посмотрим на классический и наиболее надежный способ передачи данных из подчиненной формы в основную. При открытии второй формы в качестве владельца указывается первая форма.

В коде вызывающей формы (Форма1) открываем вторую форму:


Форма2 = ПолучитьФорму("Обработка.МояОбработка.Форма.Форма2", , ЭтаФорма);
Форма2.Открыть();

Во второй форме (Форма2) по нажатию кнопки вызываем метод ОповеститьОВыборе() и передаем вычисленное число:


Процедура Кнопка1Нажатие(Элемент)
    ОповеститьОВыборе(100);
КонецПроцедуры

В первой форме (Форма1) создаем стандартный обработчик события ОбработкаВыбора, где перехватываем значение и выполняем сложение:


Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)
    Если ТипЗнч(ВыбранноеЗначение) = Тип("Число") Тогда
        РеквизитСумма = РеквизитСумма + ВыбранноеЗначение;
    КонецЕсли;
КонецПроцедуры

Способ 2. Глобальное оповещение открытых форм

Рассмотрим вариант, когда формы не связаны явной иерархией «владелец — подчиненная форма». В этом случае удобно использовать глобальный механизм оповещений.

В Форме2 по нажатию кнопки отправляем оповещение с нужным именем события и числовым параметром:


Процедура Кнопка1Нажатие(Элемент)
    Оповестить("ПересчитатьСумму", 100);
КонецПроцедуры

В Форме1 объявляем процедуру-обработчик события формы ОбработкаОповещения:


Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
    Если ИмяСобытия = "ПересчитатьСумму" Тогда
        РеквизитСумма = РеквизитСумма + Параметр;
    КонецЕсли;
КонецПроцедуры

Способ 3. Прямое обращение через ВладелецФормы (в обычном приложении)

Если разработка ведется в режиме обычного приложения (толстый клиент), можно напрямую обратиться к реквизиту формы-владельца через свойство ВладелецФормы:


Процедура Кнопка1Нажатие(Элемент)
    Если ВладелецФормы <> Неопределено Тогда
        ВладелецФормы.РеквизитСумма = ВладелецФормы.РеквизитСумма + 100;
    КонецЕсли;
КонецПроцедуры

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

← На главную