Как вывести результат работы функции в поле ввода по нажатию кнопки в 1С 8.3?

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

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

Анализ синтаксических ошибок в исходном коде

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


&Наклиенте 
Функция Ход Экспорт 
    UID=Новый УникальныйИдентификатор; 
    UID = СтрЗаменить(UID,"-",""); 
    Значение = ""; 
    Для Н=1 По СтрДлина(UID) Цикл 
        Симв = Сред(UID,Н,1); 
        Значение = Значение+Прав(КодСимвола(Симв),1); 
    КонецЦикла; 
    Возврат Число("0."+Значение); 
КонецФункции 

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

  1. Опечатка в директиве компиляции: Инструкция &Наклиенте написана слитно. Правильное написание в 1С строго регистрозависимо и разделяется пробелами: &НаКлиенте.
  2. Отсутствие круглых скобок при объявлении функции: Объявление Функция Ход Экспорт ошибочно. В языке 1С даже функции без параметров должны объявляться со скобками: Функция Ход() Экспорт.
  3. Попытка использовать функцию как переменную при вызове: В коде обработчика автор пишет Результат = Ход;. Без круглых скобок платформа пытается найти переменную или реквизит с именем «Ход», а не запустить выполнение функции. Чтобы вызвать функцию и получить результат, необходимо написать: Результат = Ход();.
  4. Избыточность ключевого слова Экспорт: Ключевое слово Экспорт необходимо только тогда, когда метод вызывается из других модулей. Если функция используется локально в пределах одного модуля формы, объявлять её экспортируемой не нужно.

Разница между событиями поля ввода и командами кнопок

Основное недопонимание автора темы крылось в логике работы интерактивных элементов. Попытка привязать генерацию числа к событию ПриИзменении поля ввода ВамПредлагаетКомпьютер в корне неверна:


&НаКлиенте
Процедура ВамПредлогаетКомпьютерПриИзменении(Элемент)
    Результат = Ход; // Ошибка вызова
КонецПроцедуры

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

Для реализации логики «нажали кнопку — значение записалось в поле» в управляемых формах используется механизм Команд. Разберем этот процесс по шагам:

  1. В редакторе управляемой формы перейдите на вкладку Команды.
  2. Добавьте новую команду (например, назовите её СгенерироватьХод).
  3. В свойствах команды в строке Действие нажмите на лупу и создайте клиентский обработчик на форме: &НаКлиенте Процедура СгенерироватьХод(Команда).
  4. Перетащите созданную команду мышкой в левую часть редактора — в дерево элементов формы. Платформа сама создаст визуальный элемент управления Кнопка и свяжет его с вашей командой.

Правильное обращение к реквизитам в обработчике команды

В зависимости от того, где именно объявлен ваш реквизит ВамПредлагаетКомпьютер, обращение к нему в коде процедуры кнопки будет отличаться.

Вариант А: Если это реквизит формы. Вы создали его непосредственно на вкладке «Реквизиты» в правой части редактора формы. В этом случае к нему можно обращаться напрямую по имени:


&НаКлиенте
Процедура СгенерироватьХод(Команда)
    ВамПредлагаетКомпьютер = Ход();
КонецПроцедуры

Вариант Б: Если это реквизит объекта. Реквизит принадлежит документу, справочнику или обработке, для которой создана эта форма. Доступ к нему осуществляется через стандартный реквизит формы Объект:


&НаКлиенте
Процедура СгенерироватьХод(Команда)
    Объект.ВамПредлагаетКомпьютер = Ход();
КонецПроцедуры

Оптимизация алгоритма генерации чисел

Алгоритм генерации случайного числа через получение УникальныйИдентификатор, удаление дефисов и посимвольный перебор строк является устаревшим «костылем». Он медленный и неоправданно сложный.

В современных версиях платформы «1С:Предприятие 8.3» для этих целей предусмотрен встроенный объект ГенераторСлучайныхЧисел. Он работает на уровне платформы, не нагружает систему строковыми операциями и возвращает результат мгновенно. Перепишем функцию генерации случайного дробного числа от 0 до 1 в современном стиле:


&НаКлиенте
Функция ПолучитьСлучайноеЧисло()
    ГСЧ = Новый ГенераторСлучайныхЧисел();
    // Генерируем целое число от 0 до 1000 и делим на 1000 для получения дроби
    Возврат ГСЧ.СлучайноеЧисло(0, 1000) / 1000;
КонецФункции

Готовое решение: эталонный код для модуля формы

Объединим все наши исправления и оптимизации в единый рабочий пример. Создайте команду формы ВыполнитьХод, выведите её на форму в виде кнопки и вставьте в модуль формы следующий код:


&НаКлиенте
Функция ПолучитьСлучайныйХод()
    ГСЧ = Новый ГенераторСлучайныхЧисел();
    Возврат ГСЧ.СлучайноеЧисло(0, 1000) / 1000;
КонецФункции

&НаКлиенте
Процедура ВыполнитьХод(Команда)
    
    // Сценарий 1: Если реквизит "ВамПредлагаетКомпьютер" создан на форме напрямую
    ВамПредлагаетКомпьютер = ПолучитьСлучайныйХод();
    
    // Сценарий 2: Если реквизит принадлежит объекту конфигурации (документу, справочнику)
    // Объект.ВамПредлагаетКомпьютер = ПолучитьСлучайныйХод();
    
КонецПроцедуры

Использование связки из Команды формы и встроенного объекта ГенераторСлучайныхЧисел гарантирует правильное поведение интерфейса управляемого приложения, избавляет от неочевидных багов и обеспечивает высокую скорость выполнения операций.

← На главную