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

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
Оставьте свое сообщение

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