ВызовПриИзмененииЭлементаФормы из обработки

1. Ujine1313 10 20.01.24 15:17 Сейчас в теме
Всем привет. Теоретический вопрос.
На форме в шапке если менять какой то реквизит то меняются зависимые реквизиты в зависимости от выбранного реквизита. Данные перенесены в эти формы из другой 1С и форма не корректная - надо входить в каждый объект и там перевыбирать реквизит и сохранять форму.
Вопрос
1. Если мы получаем форму и присеваем реквизит самому себе это сработает?
ФормаКонтрагента.Объект.НашРеквизит =ФормаКонтрагента.Объект.НашРеквизит;
2. После присвоения некого Нашего реквизита в ФормаКонтрагента.Объект.НашРеквизит должно сработать событие при изменении или его надо вызывать руками после присвоения?
Найденные решения
26. Ujine1313 10 22.01.24 17:57 Сейчас в теме
Вопрос решен, рабочая обработка изменения полей таблицы формы с вызовом ПриИзменении.
Ошибка была в том, что надо было активизировать страницу "Товаров" (Страница товары 2-я на форме и поэтому не менялась первая позиция в таблице т.к. когда пыталась активизироваться первая строка с таблице Товаров формы она не активизировалась, а активизировалась страница и поэтому строка не попадала для изменения, начиная со следующего получения позиции строки таблицы формы страница уже активизируется и строки в ней меняются по заданному алгоритму. (это мое предположение почему не срабатывало на первой строке)
Работает на УТ 11, Изменяет в документах (Первый документ) Реализация Товаров работ и услуг Ставку НДС на НулевуюНДС.
Прикрепленные файлы:
ИзменениеЭлементаФормыПрограмсно.epf
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. user1880116 20.01.24 15:56 Сейчас в теме
(1) Здарова! Подпишусь под вопросом, мне самому очень лень пробовать!
4. user2033930 20.01.24 16:37 Сейчас в теме
(2) Обрубил последнюю надежду человеку! А он так на тебя надеялся...
5. Ujine1313 10 20.01.24 17:36 Сейчас в теме
(3)Не может быть все так сложно. В статье и коментах говориться, что надо форму открыть и потом вызвать
<Форма где меняем значение>.ОповеститьОВыборе(Значение)
ОповеститьОВыборе это метод формы который-посылает оповещение владельцу формы о выполнении выбора или подбора, передает ему выбранное значение.
Не проще добавить в расширение функцию ПриИзменение Экспорт, вызвать ее из обработки и потом в след за ней форма подтянет все требуемы действия. Но есть одно огромное НО - когда попадем в процедуры формы то они обращаються к текущей строке (если изменяем табличное поле) а текущей строки то нет - форма получена но не открыта.
6. user1880116 20.01.24 17:45 Сейчас в теме
(5)
Не может быть все так сложно
Ты совершенно прав. Если записывать данные в объекты информационной базы, а не в формы, всё значительно упрощается.
7. Ujine1313 10 20.01.24 17:48 Сейчас в теме
(6)Так если записывать его через объект, то все процедуры и функции надо адаптировать из модуля формы к модулю объекта. К примеру надо групповое изменение НДС в позиции таблицы товаров. Там по событию изменения НДС друг за другом вызывается много процедур и функций - и все тащить и адаптировать для объекта это мазахизм.
8. independ 1556 20.01.24 19:04 Сейчас в теме
Когда то нужно было в БП3 в документе ПоступлениеНаРасчетныйСчет изменить реквизитов ВидОперации,Контрагент с отработкой события ПриИзменении. Через расширение добавил в модуль формы элемента этого документа экспортную процедуру
&НаКлиенте
Процедура ВыполнитьДействия(ИмяДействия) ЭКСПОРТ
	Выполнить(ИмяДействия);
КонецПроцедуры	

и далее ее вызвал из внешней обработки
&НаКлиенте
Процедура ПроверитьВидОперации(ДокументСсылка)
	Если ВидОперации=ПолучитьЗначениеРеквизита(ДокументСсылка,"ВидОперации") Тогда
		Возврат;
	КонецЕсли;
	ПараметрыФормы=Новый Структура("Ключ",ДокументСсылка);
	Форма=ОткрытьФорму("Документ.ПоступлениеНаРасчетныйСчет.Форма.ФормаДокумента",ПараметрыФормы,ЭтаФорма);
	Форма.Объект.ВидОперации=ВидОперации;
	Форма.ВыполнитьДействия("ВидОперацииПриИзменении("""")");
	Форма.Объект.Контрагент=Контрагент;
	Форма.ВыполнитьДействия("КонтрагентПриИзменении("""")");
	ПараметрыЗаписи = Новый Структура;
	ПараметрыЗаписи.Вставить("РежимЗаписи", РежимЗаписиДокумента.Проведение);
	Форма.Записать(ПараметрыЗаписи);
	Форма.Закрыть()
КонецПроцедуры
Показать
9. Ujine1313 10 20.01.24 20:08 Сейчас в теме
(8)Я так же делаю, но научный интерес заключается в том что бы изменить табличную часть. Основная проблема в том что бы обращаться к строкам таблицы формы и по каждой вызывать событие при изменении.
Сейчас напили такой код исходя из топика что тут мелькал выше. Получилось такое: но есть нюанс - код меняет все строки в документе кроме первого - хотя идентификатор строки стоит самой первой 0 и почему срабатывает только с 1 не ясно.

&НаКлиенте
Процедура ПерезаписатьКА(Команда)
	СписокСсылокКонтрагента = 	ПерезаписатьКАНаСервере();
	Для Каждого ТекКонтрагент из СписокСсылокКонтрагента Цикл  
		КлючьФОрмы= новый Структура;
		КлючьФОрмы.Вставить("Ключ",ТекКонтрагент.Значение);
		ФормаКонтрагента = ОткрытьФорму("Документ.РеализацияТоваровУслуг.Форма.ФормаДокумента",КлючьФОрмы);	
		ФормаКонтрагента.Активизировать();
		ПолучитьСтавкуНДС1 =  ПолучитьСтавкуНДС();
		
		Для Каждого ТекСтрокаТовры из ФормаКонтрагента.ЭтотОбъект.Объект.Товары цикл
			ИдентификаторСтроки  =ТекСтрокаТовры.ПолучитьИдентификатор();
			ФормаКонтрагента.Элементы.Товары.ТекущаяСтрока = ИдентификаторСтроки;
			ФормаКонтрагента.Элементы.Товары.ТекущийЭлемент =ФормаКонтрагента.Элементы.Товары.ПодчиненныеЭлементы.ТоварыСтавкаНДС;
			ФормаКонтрагента.Элементы.Товары.ИзменитьСтроку();
			ИнтерактивноЗаписатьВЭлементУправленияЛкс(ФормаКонтрагента.Элементы.Товары.ТекущийЭлемент, ПолучитьСтавкуНДС1, ЭтаФорма);	
			ФормаКонтрагента.Элементы.Товары.ЗакончитьРедактированиеСтроки(Ложь);   
			//ЭтаФорма.ВладелецФормы =ФормаКонтрагента.Элементы.Товары.ТекущийЭлемент ;
			//ЭтаФорма.ВладелецФормы =ФормаКонтрагента.Элементы.ТоварыСтавкаНДС;
			//ФормаКонтрагента.Элементы.Товары.ПодчиненныеЭлементы.ТоварыСтавкаНДС		
			////ЭтаФорма.ОповеститьОВыборе(ПолучитьСтавкуНДС1);
			//ЭтаФорма.ОповеститьОВыборе(12345);
			// ЭтаФорма.ЗакрыватьПриВыборе = Истина;
			//ФормаКонтрагента.Расш1_ТоварыСтавкаНДСПриИзмененииПеред(ТекСтрокаТовры.СтавкаНДС);	
		КонецЦикла;
		
		ПараметрыЗаписи = Новый Структура;
		ПараметрыЗаписи.Вставить("РежимЗаписи", РежимЗаписиДокумента.Запись);
		
		ФормаКонтрагента.Записать(ПараметрыЗаписи);
		Сообщить(ТекКонтрагент);
	КонецЦикла;
КонецПроцедуры
&НаКлиенте
Функция ИнтерактивноЗаписатьВЭлементУправленияЛкс(ЭлементУправления, Знач Значение, Знач ФормаИнициатор = Неопределено) Экспорт
	СтарыйВладелец = ФормаИнициатор.ВладелецФормы;
	СтарыйЗакрыватьПриВыборе = ФормаИнициатор.ЗакрыватьПриВыборе;
	ФормаИнициатор.ВладелецФормы = ЭлементУправления;
	ФормаИнициатор.ЗакрыватьПриВыборе = Ложь;
	НовоеЗначение = ЭлементУправления.ОграничениеТипа.ПривестиЗначение(Значение);
	Если НовоеЗначение <> Значение Или ЭлементУправления.ТолькоПросмотр Тогда
		Возврат Ложь;
	КонецЕсли; 
	ФормаИнициатор.ОповеститьОВыборе(Значение); 
	Если СтарыйЗакрыватьПриВыборе <> Неопределено Тогда
		ФормаИнициатор.ВладелецФормы = СтарыйВладелец;
		ФормаИнициатор.ЗакрыватьПриВыборе = СтарыйЗакрыватьПриВыборе;
	КонецЕсли;
	
КонецФункции 


&НаСервереБезКонтекста
Функция  ПерезаписатьКАНаСервере()
	Выборка = Справочники.Контрагенты.Выбрать();
	
	//{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
	// Данный фрагмент построен конструктором.
	// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
	
	Запрос = Новый Запрос;
	Запрос.Текст = 
	"ВЫБРАТЬ ПЕРВЫЕ 1
	|	РеализацияТоваровУслуг.Ссылка КАК Ссылка
	|ИЗ
	|	Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг"
	;
	РезультатЗапроса = Запрос.Выполнить().Выгрузить();
	СписокЗначейКонтрагентов = новый СписокЗначений;
	СписокЗначейКонтрагентов.ЗагрузитьЗначения(РезультатЗапроса.ВыгрузитьКолонку("Ссылка")); 
	//ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
	//
	//Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
	//	// Вставить обработку выборки ВыборкаДетальныеЗаписи
	//КонецЦикла;
	//
	////}}КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
	
	Возврат СписокЗначейКонтрагентов
	
КонецФункции
Показать
10. user2033930 20.01.24 21:22 Сейчас в теме
(9) Строки таблицы формы никакого прямого отношения к табличной части объекта не имеют. Это просто платформенная прокладка для удобства клиент-серверного взаимодействия, не более.
11. Ujine1313 10 20.01.24 22:07 Сейчас в теме
(10)Я получаю позицию строк из табличной части формы- они начинаются с 0. Потом фокусируясь на поле табличной части и элементе который хочу изменить. Т.е если три строки в табличной части то будет 0.1.2. Сфокусированный элемент устанавливается как владелец формы и вызывается метод (якобы этот элемент открыли руками и изменили элемент) тем самым вызывается вся цепочка процедур при изменении. Вопрос почему не срабатывает на элементе 0 и работает нам 1.2 элементе.
12. Ujine1313 10 21.01.24 17:55 Сейчас в теме
Реально нет ни у кого мыслей почему так криво работает на нулевой строке а все остальные отрабатывает?
Начал думать что это из за того что фора не успела открыть - поставил что бы сначала изменился склад а потом уже таблица товаров, но это не помогло.
Выкладываю обработку для Управление торговлей, редакция 11 (11.4.13.227) под 1С:Предприятие 8.3 (8.3.22.2411)
Прикрепленные файлы:
ИзменениеЭлементаФормыПрограмсно.epf
13. user2033930 21.01.24 18:41 Сейчас в теме
(12) Ты работаешь с идентификаторами строки, а не с их позициями. А это очень большая разница.
16. Ujine1313 10 21.01.24 20:12 Сейчас в теме
(13)в чем скрытый смысл если позиция в таблице на форме должна совпадать с идентификатором. Да же предположим что они не совпадают по порядку - их количество не должно различаться и если принудительно да же их задать все равно не меняется нулевая строка.
17. user1880116 21.01.24 20:34 Сейчас в теме
(16)
позиция в таблице на форме должна совпадать с идентификатором
А ты подвигай-ка строчки туда-сюда. Очисти, заполни заново, добавь, удали... Потом посмотри на идентификаторы и только после этого говори, что позиция кому-то что-то "должна".
18. user2033930 21.01.24 22:09 Сейчас в теме
14. user1880116 21.01.24 18:44 Сейчас в теме
(12)
Реально

Господа! Я оперирую гланды через анальный сфинктер стоя в гамаке в ластах. Ни у кого мыслей почему так криво?
15. user2033930 21.01.24 19:12 Сейчас в теме
(14) Моя ж ты радость... Может скальпель не тот? Попробуй ланцет!
19. Ujine1313 10 21.01.24 23:16 Сейчас в теме
Коллеги, то ли я не так понимаю то ли вы меня путаете. Но у нас есть ТаблицаФормы (Таблица что видит пользователь на форме в документе )и есть ДанныеФормыКоллекция (это данные что у нас в объекте записаны в базе), эти две "структуры" могут не соответствовать в разрезе порядка следования и поэтому мы получаем идентификатор из ДанныеФормыКоллекция перебирая все данные коллекции - что гарантирует что все данные ТаблицаФормы мы то же переберем (Если в ДанныеФормыКоллекция 4 строки и мы их перебрали то значит не важно в какой последовательности у нас идут значения в Таблице формы они все то же будут перебраны) поэтому получаем Номер строки из ДанныеФормыКоллекция и подставляем его в текущую строку ТаблицаФаормы. см скрин ниже с ИТС
PS - нам надо установить курсор на строчку таблицы на форме это делается так: <ТаблицаФормы>.ТекущаяСтрока ,но устанавливается он на все строчки кроме самой первой (нулевой на форме), Как перебрать строки на ТаблицеФормы я так и не нашел без перебора связанной с ней КоллекцииДанных в объекте.
Прикрепленные файлы:
20. user1880116 22.01.24 08:12 Сейчас в теме
(19)
получаем Номер строки
Вот с этого момента можешь свои рассуждения заканчивать. Найди, хотя бы, термин "номер строки" на той картинке с ИТС, которую ты приводишь.
21. Ujine1313 10 22.01.24 09:14 Сейчас в теме
(20)В общем помощи можно не ждать, можно только сделать - человек написал - ему ответили "дурак" и пошли дальше.

Оптимально было бы открыть обработку и поправить там где явная ошибка.
22. user1880116 22.01.24 09:23 Сейчас в теме
(21)
Оптимально было бы открыть обработку и поправить
Прикрепленные файлы:
23. Ujine1313 10 22.01.24 09:34 Сейчас в теме
(22) В тексте на ИТС ничего не сказано про "номер строки", как его получить?
24. Ujine1313 10 22.01.24 15:45 Сейчас в теме
Поговорили и пропали) - через много лет народ придет с той же проблемой, - прочитает столько текста, а ответа так и нет. Печально.
25. user1880116 22.01.24 17:41 Сейчас в теме
(24)
народ придет с той же проблемой
Ай, ты не бойся.

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

Даже есть очень хочется.
27. Ujine1313 10 22.01.24 20:35 Сейчас в теме
(25)а по вашему надо все весь код события тянуть к себе и все его переходы? Не это ли извращение так награмождать все.
28. user1880116 23.01.24 07:57 Сейчас в теме
(27)
извращение

- Иванов! Почему у нас обмен данным не работает?
- Да там, Петр Сергеевич, 1Сники форму поменяли, теперь при раскраске ячейки в синий цвет на третьей закладке каждая нечетная строка не показывается.
26. Ujine1313 10 22.01.24 17:57 Сейчас в теме
Вопрос решен, рабочая обработка изменения полей таблицы формы с вызовом ПриИзменении.
Ошибка была в том, что надо было активизировать страницу "Товаров" (Страница товары 2-я на форме и поэтому не менялась первая позиция в таблице т.к. когда пыталась активизироваться первая строка с таблице Товаров формы она не активизировалась, а активизировалась страница и поэтому строка не попадала для изменения, начиная со следующего получения позиции строки таблицы формы страница уже активизируется и строки в ней меняются по заданному алгоритму. (это мое предположение почему не срабатывало на первой строке)
Работает на УТ 11, Изменяет в документах (Первый документ) Реализация Товаров работ и услуг Ставку НДС на НулевуюНДС.
Прикрепленные файлы:
ИзменениеЭлементаФормыПрограмсно.epf
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот