При переходе на управляемый интерфейс платформы «1С:Предприятие 8.3» начинающие разработчики часто сталкиваются с трудностями при связывании элементов управления на форме с программным кодом. Типичный пример — необходимость сгенерировать значение по нажатию кнопки и сразу же отобразить его в определенном поле ввода. В этой статье мы подробно разберем, почему возникают такие сложности, проанализируем синтаксические ошибки и покажем правильный, современный способ реализации этой задачи.
Рассмотрим код, который изначально пытался использовать автор темы, и выясним причины, по которым он не мог взлететь:
&Наклиенте
Функция Ход Экспорт
UID=Новый УникальныйИдентификатор;
UID = СтрЗаменить(UID,"-","");
Значение = "";
Для Н=1 По СтрДлина(UID) Цикл
Симв = Сред(UID,Н,1);
Значение = Значение+Прав(КодСимвола(Симв),1);
КонецЦикла;
Возврат Число("0."+Значение);
КонецФункции
Даже если бы мы правильно привязали кнопку, этот фрагмент вызвал бы ошибки компиляции по следующим причинам:
&Наклиенте написана слитно. Правильное написание в 1С строго регистрозависимо и разделяется пробелами: &НаКлиенте.Функция Ход Экспорт ошибочно. В языке 1С даже функции без параметров должны объявляться со скобками: Функция Ход() Экспорт.Результат = Ход;. Без круглых скобок платформа пытается найти переменную или реквизит с именем «Ход», а не запустить выполнение функции. Чтобы вызвать функцию и получить результат, необходимо написать: Результат = Ход();.Экспорт необходимо только тогда, когда метод вызывается из других модулей. Если функция используется локально в пределах одного модуля формы, объявлять её экспортируемой не нужно.Основное недопонимание автора темы крылось в логике работы интерактивных элементов. Попытка привязать генерацию числа к событию ПриИзменении поля ввода ВамПредлагаетКомпьютер в корне неверна:
&НаКлиенте
Процедура ВамПредлогаетКомпьютерПриИзменении(Элемент)
Результат = Ход; // Ошибка вызова
КонецПроцедуры
Событие ПриИзменении у поля ввода генерируется платформой только тогда, когда сам пользователь руками ввел туда данные, нажал Enter или переключил фокус на другой элемент формы. Нажатие на кнопку никак не связано с этим событием.
Для реализации логики «нажали кнопку — значение записалось в поле» в управляемых формах используется механизм Команд. Разберем этот процесс по шагам:
СгенерироватьХод).&НаКлиенте Процедура СгенерироватьХод(Команда).В зависимости от того, где именно объявлен ваш реквизит ВамПредлагаетКомпьютер, обращение к нему в коде процедуры кнопки будет отличаться.
Вариант А: Если это реквизит формы. Вы создали его непосредственно на вкладке «Реквизиты» в правой части редактора формы. В этом случае к нему можно обращаться напрямую по имени:
&НаКлиенте
Процедура СгенерироватьХод(Команда)
ВамПредлагаетКомпьютер = Ход();
КонецПроцедуры
Вариант Б: Если это реквизит объекта. Реквизит принадлежит документу, справочнику или обработке, для которой создана эта форма. Доступ к нему осуществляется через стандартный реквизит формы Объект:
&НаКлиенте
Процедура СгенерироватьХод(Команда)
Объект.ВамПредлагаетКомпьютер = Ход();
КонецПроцедуры
Алгоритм генерации случайного числа через получение УникальныйИдентификатор, удаление дефисов и посимвольный перебор строк является устаревшим «костылем». Он медленный и неоправданно сложный.
В современных версиях платформы «1С:Предприятие 8.3» для этих целей предусмотрен встроенный объект ГенераторСлучайныхЧисел. Он работает на уровне платформы, не нагружает систему строковыми операциями и возвращает результат мгновенно. Перепишем функцию генерации случайного дробного числа от 0 до 1 в современном стиле:
&НаКлиенте
Функция ПолучитьСлучайноеЧисло()
ГСЧ = Новый ГенераторСлучайныхЧисел();
// Генерируем целое число от 0 до 1000 и делим на 1000 для получения дроби
Возврат ГСЧ.СлучайноеЧисло(0, 1000) / 1000;
КонецФункции
Объединим все наши исправления и оптимизации в единый рабочий пример. Создайте команду формы ВыполнитьХод, выведите её на форму в виде кнопки и вставьте в модуль формы следующий код:
&НаКлиенте
Функция ПолучитьСлучайныйХод()
ГСЧ = Новый ГенераторСлучайныхЧисел();
Возврат ГСЧ.СлучайноеЧисло(0, 1000) / 1000;
КонецФункции
&НаКлиенте
Процедура ВыполнитьХод(Команда)
// Сценарий 1: Если реквизит "ВамПредлагаетКомпьютер" создан на форме напрямую
ВамПредлагаетКомпьютер = ПолучитьСлучайныйХод();
// Сценарий 2: Если реквизит принадлежит объекту конфигурации (документу, справочнику)
// Объект.ВамПредлагаетКомпьютер = ПолучитьСлучайныйХод();
КонецПроцедуры
Использование связки из Команды формы и встроенного объекта ГенераторСлучайныхЧисел гарантирует правильное поведение интерфейса управляемого приложения, избавляет от неочевидных багов и обеспечивает высокую скорость выполнения операций.