Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
08 окт 2022, 01:05

Изменение шага регулирования внешней функцией

Автор nordri, 17 фев 2022, 13:31

0 Пользователей и 1 гость просматривают эту тему.

nordri

Здравствуйте! Вопрос от новичка:

При Регулирование(Элемент, Направление, СтандартнаяОбработка) не могу изменить шаг Направление
2022-02-17 13-18-08 <a class=Конфигуратор (учебная версия) - Пустая.jpg" title="2022-02-17 13-18-08 Конфигуратор (учебная версия) - Пустая.jpg" class="bbc_img">

Основная моя проблема, полагаю, в понимании составного Типа данных:
Элементы[Элемент.Имя]Помогите пожалуйта, я только учусь.
&НаКлиенте
Перем МойЭл;
//Нужный реквизит (Формы?) ИЛИ (ЭлементаФормы???) ,
//Для использовнания между процедурами
&НаКлиенте
Процедура ПриОткрытии(Отказ)
Элементы.РеквизитРегулируемый.КнопкаРегулирования=Истина;
Элементы.ИтогНадпись.Вид=ВидПоляФормы.ПолеНадписи;
Реквизит=100; МойЭл=Элементы.Итог; МойЭл.Ширина =5 ;
КонецПроцедуры

&НаКлиенте
Процедура РеквизитРегулируемыйРегулирование(Элемент, Направление, СтандартнаяОбработка)
СтандартнаяОбработка=Ложь; Шаг=10;

//Работающий вариант, который не устраивает
//Реквизит=Число(Элемент.ВыделенныйТекст)+Направление*Число(Шаг) ;

//Так хотелось бы, но не работает
//Элементы[Элемент.Имя]=Число(Элемент.ВыделенныйТекст)+Направление*Число(Шаг) ;
#Область НеРаботает

//Элементы[Элемент.Имя]=Число(Элемент.ВыделенныйТекст)+Направление*Число(Шаг) ;

//Элемент=Число(Элемент)+Направление*Число(Шаг) ;
//Элемент.Значение=Число(Элемент.Значение)+Направление*Число(Шаг)

//Элемент.ВыделенныйТекст //В отладке это строка
//Элемент //В отладке поле формы
//При нажатии на кнопку регулирование результата нет

#КонецОбласти //НеРаботает
//А так нужно, но не выходит: обработка регулирования через Возврт функциии...
Элементы[Элемент.Имя]=ПриРегулировании(Элемент,Направление,);

//Реквизит=ПриРегулировании(Элемент,Направление,);  //Работает.

//В объявленный ранее реквизит формы, передать значение из другого реквизита
МойЭл=Реквизит;
КонецПроцедуры

&НаКлиенте
Функция ПриРегулировании(ЭлементПолученный,НаправлениеПолученный,ШагПолученный)
  //НеопределеннаяПеременная ШагПолученный;
Если Не ТипЗнч(ШагПолученный) <> Тип("Неопределено")  Тогда
ШагПоУмолчанию=10; Шаг=Число(ШагПоУмолчанию);
КонецЕсли;
ЗначРегулир=Число(ЭлементПолученный.ВыделенныйТекст)+
Число(НаправлениеПолученный)*Число(Шаг);
//Число(Число( ) ) = Не комильфо :,((
Возврат Число(ЗначРегулир);
КонецФункции  //ПриРегулировании

&НаКлиенте
Процедура РеквизитПриИзменении(Элемент)
Внешняя обработка,управляемые формы, 1С:Предприятие 8.3, учебная версия (8.3.19.1150)

nordri

Нашел еще ошибку у себя:
&НаКлиенте
Функция ПриРегулировании(ЭлементПолученный,НаправлениеПолученный,ШагПолученный)
  //НеопределеннаяПеременная ШагПолученный;
Если Не ТипЗнч(ШагПолученный) <> Тип("Неопределено")  Тогда
        ШагПоУмолчанию=10; Шаг=Число(ШагПоУмолчанию);   
    КонецЕсли;
    ЗначРегулир=Число(ЭлементПолученный.ВыделенныйТекст)+
    Число(НаправлениеПолученный)*Число(Шаг);
    //Число(Число( ) ) = Не комильфо :,((
    Возврат Число(ЗначРегулир);
КонецФункции  //ПриРегулировании

Верно:
&НаКлиенте
Функция ПриРегулировании(ЭлементПолученный,НаправлениеПолученный,ШагПолученный)
  //НеопределеннаяПеременная ШагПолученный;
Если Не ТипЗнч(ШагПолученный) <> Тип("Неопределено")  Тогда
ШагПоУмолчанию=10; Шаг=Число(ШагПоУмолчанию);
Иначе
Шаг=Число(ШагПолученный);
КонецЕсли;
ЗначРегулир=Число(ЭлементПолученный.ВыделенныйТекст)+
Число(НаправлениеПолученный)*Число(Шаг);
//Число(Число( ) ) = Не комильфо :,((
Возврат Число(ЗначРегулир);
КонецФункции  //ПриРегулировании

LexaK

nordri, что-то накрутили, ни чего не понятно,
вот одну строчку исправил, ошибки не стало, регулирование идет.
если помогло нажмите: Спасибо!

LexaK

nordri, вот еще вариант,
Шаг вынесен на форму, и его можно менять в процессе работы.
если помогло нажмите: Спасибо!

nordri

LexaK, Прошу простить, новичка за сумбур, и много букв в коде...
Да, ваш вариант, стандартный и понятный.
Реквизит = Реквизит + Направление * Шаг;И с шагом из реквизита формы тоже не подходит.
Мне необходимо получить "Реквизит" (ПолеФормы?) из Регулирование(Элемент, Направление, СтандартнаяОбработка) Да к тому же именно функцией...
Что то, похожее на это:
Элемент.Значение=ПриРегулировании(Элемент.Значение, Направление, ШагНов);Убрал не относящееся к моей проблеме:

&НаКлиенте
Процедура РеквизитРегулируемыйРегулирование(Элемент, Направление, СтандартнаяОбработка)
СтандартнаяОбработка=Ложь;
//Реквизит=ПриРегулировании(Элемент,Направление,ШагНов);  //Работает. но нужно иначе
//Элемент.СвязьПоТипу.ПутьКДанным=ПриРегулировании(Элемент,Направление,ШагНов);  //Не работает
//Элементы[Элемент.Имя]=ПриРегулировании(Элемент,Направление,ШагНов); //Не работает
Элемент.Значение=ПриРегулировании(Элемент.Значение, Направление, ШагНов); //Не работает
КонецПроцедуры

&НаКлиенте
Функция ПриРегулировании(ЭлементПолученный,НаправлениеПолученный,ШагПолученный)
ШагПоУмолчанию=100;
Если Не ТипЗнч(ШагПолученный) <> Тип("Неопределено")  Тогда
Шаг=Число(ШагПоУмолчанию);
Иначе
Шаг=Число(ШагПолученный);
КонецЕсли;
Регулирование=Число(ЭлементПолученный.ВыделенныйТекст)+
Число(НаправлениеПолученный)*Число(Шаг);
Возврат Число(Регулирование);
КонецФункции  //ПриРегулировании

&НаКлиенте
Процедура ПриОткрытии(Отказ)
Элементы.РеквизитРегулируемый.КнопкаРегулирования=Истина;
Элементы.Реквизит.Вид=ВидПоляФормы.ПолеНадписи;
Элементы.Реквизит.Ширина=5; Элементы.РеквизитРегулируемый.Ширина=6;
Элементы.ШагНов.Ширина=2;
Реквизит=100; ШагНов=1;
КонецПроцедуры

2022-02-17 15-40-01 Конфигуратор (учебная версия) - Пустая.jpg
К тому же тип реквизитов строка.
Мне это важно для понимания...

nordri

Почти решил свою проблему. Теперь осталось понять, как присвоить значение поля формы: РеквизитРегулируемый
[Строка(ЭлементПолученный.Имя)] В отладчике имеет значение "РеквизитРегулируемый".

А у меня на форме Один объект формы и... Два элемента формы,подчиненные этому объекту?
Вот это не могу понять...
2022-02-17 20-26-17 Конфигуратор (учебная версия) - Пустая.jpg
Я очень близок к пониманию...
&НаКлиенте
Процедура РеквизитРегулируемыйРегулирование(Элемент, Направление, СтандартнаяОбработка)
СтандартнаяОбработка=Ложь;
ПриРегулировании(Элемент, Направление, ШагНов);
КонецПроцедуры

&НаКлиенте
Процедура  ПриРегулировании(ЭлементПолученный,НаправлениеПолученный,ШагПолученный)
ШагПоУмолчанию=100;
Если Не ТипЗнч(ШагПолученный) <> Тип("Неопределено") 
Или Не ЗначениеЗаполнено(ШагПолученный)
Тогда
Шаг=Число(ШагПоУмолчанию);
Иначе
Шаг=Число(ШагПолученный);
КонецЕсли;
Регулирование=Число(ЭлементПолученный.ВыделенныйТекст)+
Число(НаправлениеПолученный)*Число(Шаг);
ЭтотОбъект[Строка(ЭлементПолученный.Имя)]  =Регулирование;
КонецПроцедуры  //ПриРегулировании

&НаКлиенте
Процедура ПриОткрытии(Отказ)
Элементы.РеквизитРегулируемый.КнопкаРегулирования=Истина;
Элементы.Реквизит.Вид=ВидПоляФормы.ПолеНадписи;
Элементы.Реквизит.Ширина=5; Элементы.РеквизитРегулируемый.Ширина=6;
Элементы.ШагНов.Ширина=2;
Реквизит=100; ШагНов=1;
КонецПроцедуры

Если бы не различие в именах Объекта формы и Элемента Формы,  то работает...

nordri

Все, готово, получилось.  :ooifh:
Но с одним условием: Имя Объекта Формы должно быть равно Имени Элемента Формы.

&НаКлиенте
Процедура РеквизитРегулируемыйРегулирование(Элемент, Направление, СтандартнаяОбработка)
СтандартнаяОбработка=Ложь;
ПриРегулировании(Элемент, Направление, );
КонецПроцедуры

&НаКлиенте
Процедура  ПриРегулировании(ЭлементПолученный,НаправлениеПолученный,ШагПолученный)
ШагПоУмолчанию=100;
Если ТипЗнч(ШагПолученный) <> Тип("Неопределено") 
И ЗначениеЗаполнено(ШагПолученный)
Тогда
Шаг=Число(ШагПолученный);
Иначе
Шаг=Число(ШагПоУмолчанию);
КонецЕсли;
Регулирование=Число(ЭлементПолученный.ВыделенныйТекст)+
Число(НаправлениеПолученный)*Число(Шаг);
ЭтотОбъект[Строка(ЭлементПолученный.Имя)]  = Регулирование;
КонецПроцедуры  //ПриРегулировании

&НаКлиенте
Процедура ПриОткрытии(Отказ)
Элементы.РеквизитРегулируемый.КнопкаРегулирования=Истина;
Элементы.РеквизитРегулируемый.Ширина=6;
Элементы.ШагНов.Ширина=2;
РеквизитРегулируемый=100;
КонецПроцедуры

nordri

На клиенте нельзя обратиться к реквизиту формы:
ЭтотОбъект[Строка(ЭлементПолученный.Имя)]это имя элемента на форме

И выход из этого: вызов процедуры на Сервере.
Что бы обратиться к реквизиту формы, получив ПутьКДанным уже в реквизит формы:
&НаСервере
//
//
ЭтотОбъект[Строка(ЭлементПолученный.ПутьКДанным)]
Но тут новая ошибка...
Отсутствует отображение для типа 'ПолеФормы'Здесь работает ЭлементыФормы.epf, но без передачи элементов? (не знаю пока,как сформулировать иначе...) между Клиентом и сервером:
Полагаю, что причина на клиенте: ПриРегулированииНаСервере(Элемент, Направление, ШагНов);&НаКлиенте
Процедура НайтиЭлемены(Команда)
ОчиститьСообщения();
НайтиЭлементыНаСервере();
КонецПроцедуры

&НаСервере
Процедура НайтиЭлементыНаСервере()

МассивЭелементовФормы = Новый Массив;
СтрокаНайденыхПолей="";
Для Каждого Рек из ЭтаФорма.Элементы Цикл
Если ТипЗнч(Рек) = Тип("ПолеФормы") Тогда
НайденыйЭлемент=Строка(рек)+" - "+рек.имя+", путь к данным = "+рек.ПутьКДанным;
Сообщить(НайденыйЭлемент);
МассивЭелементовФормы.Добавить(рек.имя);
СтрокаНайденыхПолей=СтрокаНайденыхПолей+ рек.имя+Символы.ПС;
КонецЕсли;
КонецЦикла; 
ПреремМассив=МассивЭелементовФормы; //Не используется, для других целей
РезультатПоискаПолей=СтрокаНайденыхПолей;
КонецПроцедуры  //НайтиЭлементыНаСервере

nordri

Цитата: nordri от 18 фев 2022, 12:45Полагаю, что причина на клиенте:
Код Выделить Развернуть
    ПриРегулированииНаСервере(Элемент, Направление, ШагНов);
&НаКлиенте
Процедура РеквизитРегулируемыйРегулирование(Элемент, Направление, СтандартнаяОбработка)
СтандартнаяОбработка=Ложь;

ПриРегулированииНаСервере(Элемент, Направление, ШагНов);
КонецПроцедуры

&НаСервере
Процедура  ПриРегулированииНаСервере(ЭлементПолученный,НаправлениеПолученный,ШагПолученный)
ШагПоУмолчанию=100;
Если Не ТипЗнч(ШагПолученный) <> Тип("Неопределено")  Тогда
Шаг=Число(ШагПоУмолчанию);
Иначе
Шаг=Число(ШагПолученный);
КонецЕсли;
Регулирование=Число(Объект[Строка(ЭлементПолученный.ПутьКДанным)] )+
Число(НаправлениеПолученный)*Число(Шаг);
Объект[Строка(ЭлементПолученный.ПутьКДанным)]  =Регулирование; ;
//
КонецПроцедуры  //ПриРегулировании

Теперь мой вопрос:
Как правильно передавать "Элемент" с клиента на сервер? :(
   &НаКлиенте
Процедура РеквизитРегулируемыйРегулирование(Элемент, Направление, СтандартнаяОбработка)
СтандартнаяОбработка=Ложь;
ПриРегулированииНаСервере(Элемент, Направление, );
КонецПроцедуры
&НаСервере
Процедура  ПриРегулированииНаСервере(ЭлементПолученный,НаправлениеПолученный,ШагПолученный)
//
//

Простите за такую простыню... :trhregerhg:

nordri

Цитата: nordri от 18 фев 2022, 13:22Теперь мой вопрос:
Как правильно передавать "Элемент" с клиента на сервер?

Разобрался!  :zebzdr:
&НаСервере
Функция  НайтиВозможныйРеквизитформыНаСервере(ИскомыйЭлементНаСервере)
Если Не ИскомыйЭлементНаСервере="" Тогда
Для Каждого Рек из ЭтаФорма.Элементы  Цикл
Если рек.Имя=ИскомыйЭлементНаСервере
Или Рек.Заголовок=ИскомыйЭлементНаСервере
Тогда
Возврат рек.ПутьКДанным;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Возврат Истина;
КонецФункции  //НайтиЭлементыНаСервере

&НаКлиенте
Процедура НайтиРеквизит(Команда)
ИмяОбъекта = НайтиВозможныйРеквизитформыНаСервере(ЭлементДляПоиска);
Если ИмяОбъекта=Истина Тогда
Предупреждение("Не найдено");
Иначе
ЭтотОбъект[ИмяОбъекта]=НовоеЗначение;
КонецЕсли;
КонецПроцедуры
Более подробно в Поиск реквизитов на форме по элементу формы

Похожие темы (5)

Рейтинг@Mail.ru Rambler's Top100

Поиск