Запись значения в поле ввода/формы со срабатыванием события ПриИзменении

06.04.19

Разработка - Универсальные функции

Иногда возникает необходимость после записи значения в какое либо поле ввода/формы вызвать для него обработчик события ПриИзменении, а о вызове самого события приходится только мечтать. В этой статье приводится программный способ вызова этого события.

Для максимальной универсальности нужно создать пустую форму, разумнее всего общую. Назовем ее "Пустышка".

Вот 2 метода с поддержкой обычных и управляемых форм, решающие задачу.

// Интерактивно записывает значение в элемент управления. Интерактивность заключается в срабатывании
// события ПриИзменении у элемента управления.
//
// Параметры:
//  ЭлементУправления – ЭлементУправления – которому присваиваем значение;
//  Значение     – Произвольный – присваиваемое значение;
//  *ФормаИнициатор - Форма, УправляемаяФорма, *Неопределено - которая будет использована в качестве инициатора события;
//               если не указана, то будет создана временная форма-пустышка.
//
Функция ИнтерактивноЗаписатьВЭлементУправленияЛкс(ЭлементУправления, Знач Значение, Знач ФормаИнициатор = Неопределено) Экспорт
	
	Если ФормаИнициатор = Неопределено Тогда
		ФормаИнициатор = ПолучитьОбщуюФорму("Пустышка", ЭлементУправления);
	Иначе
		СтарыйВладелец = ФормаИнициатор.ВладелецФормы;
		СтарыйЗакрыватьПриВыборе = ФормаИнициатор.ЗакрыватьПриВыборе;
		ФормаИнициатор.ВладелецФормы = ЭлементУправления;
		ФормаИнициатор.ЗакрыватьПриВыборе = Ложь;
	КонецЕсли;
	НовоеЗначение = ЭлементУправления.ОграничениеТипа.ПривестиЗначение(Значение);
	Если НовоеЗначение <> Значение Или ЭлементУправления.ТолькоПросмотр Тогда
		Возврат Ложь;
	КонецЕсли; 
	ФормаИнициатор.ОповеститьОВыборе(Значение); 
	Если СтарыйЗакрыватьПриВыборе <> Неопределено Тогда
		ФормаИнициатор.ВладелецФормы = СтарыйВладелец;
		ФормаИнициатор.ЗакрыватьПриВыборе = СтарыйЗакрыватьПриВыборе;
	КонецЕсли;
	
КонецФункции // ИнтерактивноЗаписатьВЭлементУправленияЛкс()

// Интерактивно записывает значение в элемент управления (только поле ввода/формы) колонки табличного поля или таблицы формы.
// Интерактивность заключается в срабатывании события ПриИзменении у элемента управления.
// Строка табличного поля или таблицы формы должна находиться в режиме редактирования,
// иначе никаких изменений данных не произойдет.
//
// Параметры:
//  ТабличноеПоле - ТабличноеПоле, ТаблицаФормы - внутри него строка редактируется;
//  Колонка      – КолонкаТабличногоПоля, ПолеФормы – в ее ячейку будем помещать значение;
//  Значение     – Произвольный – присваиваемое значение;
//  *ФормаИнициатор - Форма, УправляемаяФормы, *Неопределено - которая будет использована в качестве инициатора события;
//               если не указана, то будет создана временная форма-пустышка;
//  *ВосстанавитьТекущуюКолонку – Булево, *Истина;
//  *ВключитьРежимРедактирования – Булево, *Истина.
//
Процедура ИнтерактивноЗаписатьВКолонкуТабличногоПоляЛкс(ТабличноеПоле, Знач Колонка, Знач Значение, Знач ФормаИнициатор = Неопределено,
	Знач ВосстанавитьТекущуюКолонку = Истина, Знач ВключитьРежимРедактирования = Истина) Экспорт
	
	Если ТипЗнч(Колонка) = Тип("КолонкаТабличногоПоля") Тогда
		ЭлементУправления = Колонка.ЭлементУправления;
		Если ТипЗнч(ЭлементУправления) <> Тип("ПолеВвода") Тогда
			ЭлементУправления = Неопределено;
		КонецЕсли;
	Иначе
		ЭлементУправления = Колонка;
		Если ТипЗнч(ЭлементУправления) <> Тип("ПолеФормы") Тогда
			ЭлементУправления = Неопределено;
		КонецЕсли;
	КонецЕсли; 
	Если ЭлементУправления <> Неопределено Тогда
		Если ВосстанавитьТекущуюКолонку Тогда
			Если ТипЗнч(ТабличноеПоле) = Тип("ТабличноеПоле") Тогда
				СтараяТекущаяКолонка = ТабличноеПоле.ТекущаяКолонка;
			Иначе
				СтараяТекущаяКолонка = ТабличноеПоле.ТекущийЭлемент;
			КонецЕсли; 
		КонецЕсли;
		Если ТипЗнч(ТабличноеПоле) = Тип("ТабличноеПоле") Тогда
			ТабличноеПоле.ТекущаяКолонка = Колонка;
		Иначе
                        ТабличноеПоле.ТекущийЭлемент = Колонка;
		КонецЕсли; 
		Если ВключитьРежимРедактирования Тогда
			ТабличноеПоле.ИзменитьСтроку();
		КонецЕсли;
		ИнтерактивноЗаписатьВЭлементУправленияЛкс(ЭлементУправления, Значение, ФормаИнициатор);
		Если ВосстанавитьТекущуюКолонку Тогда
			Если ТипЗнч(ТабличноеПоле) = Тип("ТабличноеПоле") Тогда
				ТабличноеПоле.ТекущаяКолонка = СтараяТекущаяКолонка;
			Иначе
                                ТабличноеПоле.ТекущийЭлемент = СтараяТекущаяКолонка;
			КонецЕсли; 
		КонецЕсли;
	КонецЕсли; 

КонецПроцедуры // ИнтерактивноЗаписатьВКолонкуТабличногоПоляЛкс()

Если в контексте доступна какая то форма, то лучше ее передать в качестве параметра ФормаИнициатор, т.к. это будет быстрее, чем создавать каждый раз форму-пустышку.

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

Хочу заметить, что подобная техника не зря большей частью "закрыта" от разработчика. Ведь программное оперирование с интерактивными событиями требует хорошей обработки всех возможных ситуаций внутри обработчиков. Например, вы можете вызвать рекурсивный цикл интерактивных событий или просто исключительную ситуацию уровня приложения. Поэтому как можно тщательнее имитируйте действия пользователя с проверкой всех возможных ситуаций. И не прибегайте к таким приемам без необходимости.

ПриИзменении полеВвода полеФормы

См. также

Вставляем картинку из буфера обмена (платформа 1С 8.3.24)

Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    2652    0    John_d    8    

53

GUID в 1С 8.3 - как с ними быть

Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    4587    atdonya    22    

44

Переоткрытие внешних обработок

Универсальные функции Платформа 1С v8.3 Бесплатно (free)

На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.

30.11.2023    3950    ke.92@mail.ru    16    

61

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    8795    YA_418728146    6    

141

Печать непроведенных документов для УТ, КА, ERP. Настройка печати по пользователям, документам и печатным формам

Пакетная печать Печатные формы Адаптация типовых решений Универсальные функции Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Абонемент ($m)

Расширение для программ 1С:Управление торговлей, 1С:Комплексная автоматизация, 1С:ERP, которое позволяет распечатывать печатные формы для непроведенных документов. Можно настроить, каким пользователям, какие конкретные формы документов разрешено печатать без проведения документа.

2 стартмани

22.08.2023    2069    21    progmaster    7    

3

Расширение: Быстрые отборы через буфер [Alt+C] Копировать список, [Alt+V] Вставить список, [Ctrl+C] Копировать из файлов

Инструментарий разработчика Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 1С:Розница 2 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Абонемент ($m)

Копирует в буфер значения из списков, из ячеек отчетов, таблиц, настроек списков, других отборов и вставляет в выбранную настройку отбора. Работает с Объект не найден. Работает как в одной так и между разными базами 1С. Использует комбинации [Alt+C] Копировать список, [Alt+V] Вставить список. Также для копирования данных используется стандартная [Ctrl+C] (например из открытого xls, mxl, doc и т.п. файла скопировать список наименований)

1 стартмани

13.10.2022    16138    133    sapervodichka    112    

129

Система контроля ведения учета [БСП]

Универсальные функции Механизмы типовых конфигураций БСП (Библиотека стандартных подсистем) Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

В данном материале рассмотрим типовой алгоритм подсистемы контроля учета БСП в конфигурациях на примерах.

18.07.2022    7241    quazare    8    

109
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. hopter 36 12.07.07 02:59 Сейчас в теме
Отличная штука. Сильно помогает при программном создании документов, когда надо заполнить кучу зависимых реквизитов, а прописывать каждый руками утомительно.
2. PowerBoy 3350 30.08.07 12:50 Сейчас в теме
Классно. Обязательно использую. Спасибо за подробный пример.
3. karat60 01.10.07 12:39 Сейчас в теме
4. fez 46 16.02.10 11:35 Сейчас в теме
Супернужная возможность для автоматического тестирования. Спасибо.
5. BlackLeon 3 05.08.11 12:33 Сейчас в теме
а что подразумевается под режимом редактирования строки?
установить текущую строку и текущую колонку и выполнить ИзменитьСтроку()?

извените. просто не смог запустить:) проблема оказалась в том что форма должна быть открыта:(
6. Girl_Tat 2 15.02.12 10:46 Сейчас в теме
Большое спасибо за процедуры!!!!! Очень помогли!!!
7. Жолтокнижниг 258 29.03.12 12:56 Сейчас в теме
Огромный жирный плюс, а нет предложений как програмно нажимать кн. "Ок"
у меня только одна идея эмуляция ctrl+enter, но чтот не гут так извращаться
8. agressor 123 21.12.12 11:39 Сейчас в теме
9. rar_xxx 23 29.12.12 13:47 Сейчас в теме
Жирный плюс !!! Можешь помочь с обработкой таблицы управляемой формы ?

Делаю так:
ФормаДок.Элементы.Товары.ТекущаяСтрока = 0;
Получилось в качестве колонки пока только это скормить: ФормаДок.Товары.ПодчиненныеЭлементы.ТоварыЦенаСоСкидкой Но значение на форме не появилось
10. denny_dv 5 15.04.13 23:31 Сейчас в теме
Супер крутая процедурка!!! Добавил в копилку! Префикс оставлю чтобы помнить. +
11. mcarrowd 13.04.15 13:57 Сейчас в теме
В 8.3 вторая процедура не работает - надо вызывать ТаблицаФормы.ИзменитьСтроку() в процедуре или где-то ранее по коду

Процедура ЛксИнтерактивноЗаписатьВКолонкуТабличногоПоля(ТабличноеПоле, Колонка, Значение, ФормаИнициатор = Неопределено) Экспорт
	
	ТабличноеПоле.ТекущаяКолонка = Колонка;
	ТабличноеПоле.ИзменитьСтроку();
	ЛксИнтерактивноЗаписатьВЭлементУправления(Колонка.ЭлементУправления, Значение, ФормаИнициатор);

КонецПроцедуры
Показать
12. tormozit 7136 13.04.15 14:12 Сейчас в теме
(11) Видимо не читал описание метода?
13. mcarrowd 14.04.15 00:48 Сейчас в теме
(12) видимо только первую строку.
14. ardn 622 22.09.15 17:38 Сейчас в теме
Спасибо,
Внес этот трюк в модуль тестирования обычных форм
15. hopter 36 29.04.16 02:38 Сейчас в теме
а на управляемых формах возможно нечто подобное соорудить?
16. ardn 622 29.04.16 08:03 Сейчас в теме
(15) hopter,
На управляемых формах логичнее использовать автоматизированное тестирование
17. tormozit 7136 29.04.16 08:20 Сейчас в теме
На управляемых формах это тоже работает.
Кстати про тестирование форм (обычных и управляемых) рекомендую посмотреть инструмент "Тестирование метаданных" из подсистемы Инструменты разработчика, где этот прием используется.
18. hopter 36 02.05.16 06:45 Сейчас в теме
ясно, посмотрю про тестирование
19. uri1709 01.08.16 11:55 Сейчас в теме
Все таки не ясно, как должна выглядеть процедура 2 для УФ, там используется вместо ТабличногоПоля, ТаблицаФормы. Методы конечно похожие, но что-то до конца не получилось у меня разобраться. Проверял на УТ 11.2. Вторую процедуру сделал так:

&НаКлиенте
Процедура ЛксИнтерактивноЗаписатьВКолонкуТабличногоПоля(ТабличноеПоле, Колонка, Значение, ФормаИнициатор = Неопределено) Экспорт
	
	ТабличноеПоле.ТекущийЭлемент = Колонка;
	ЛксИнтерактивноЗаписатьВЭлементУправления(ТабличноеПоле.ТекущийЭлемент, Значение, ФормаИнициатор);

КонецПроцедуры // ЛксИнтерактивноЗаписатьВКолонкуТабличногоПоля()

Сделал обработку с полями Партнер, Номенклатура и командой выполнить:

&НаКлиенте
Процедура Заполнить(Команда)
    Форма = ОткрытьФорму("Документ.РеализацияТоваровУслуг.ФормаОбъекта");

	Форма.ЛксИнтерактивноЗаписатьВЭлементУправления(Форма.Элементы.Партнер, Партнер, ЭтаФорма);
	                
	                 
	Форма.Элементы.Товары.ДобавитьСтроку();                   

	Форма.ЛксИнтерактивноЗаписатьВКолонкуТабличногоПоля(Форма.Элементы.Товары, Форма.Элементы.Товары.ПодчиненныеЭлементы.ТоварыНоменклатура, Номенклатура, ЭтаФорма); //Форма.Элементы.ТоварыНоменклатура
	Форма.ЛксИнтерактивноЗаписатьВКолонкуТабличногоПоля(Форма.Элементы.Товары, Форма.Элементы.Товары.ПодчиненныеЭлементы.ТоварыЦена, 100, ЭтаФорма); //Форма.Элементы.ТоварыЦена
	Форма.ЛксИнтерактивноЗаписатьВКолонкуТабличногоПоля(Форма.Элементы.Товары, Форма.Элементы.Товары.ПодчиненныеЭлементы.ТоварыКоличествоУпаковок, 100, ЭтаФорма); 
	
КонецПроцедуры
 
Показать


В результате на форме заполнилось: Партнер,Контрагент
Номенклатура - пустое поле, Цена=100,Количество=100,Сумма=10 000.

Мне не понятен момент почему не заполнилась Номенклатура и не сработало событие "ПриИзменении", ведь для "Цены" и "Количества" это событие сработало.

Хотя воспроизвел, в чистой базе создал документ "РеализациятоваровУслуг" с Партнером и табличной частью Номенклатура,НоменклатураНаименование-строка, Цена, Количество, Сумма
сделал обработчики событий для Номенклатуры при изменении заполняется поле НоменклатураНаименование, для Цены и Количества обработчики при изменении расчета Суммы.

Запустил эту обработку НоменклатураНаименование заполнилось и сумма рассчиталась. Все обработчики событий сработали.
Странно, почему в УТ 11.2 не отработало
user1951539; +1 Ответить
20. hopter 36 10.08.16 01:37 Сейчас в теме
(19) uri1709, аналогичная проблема
В ЗУП 3 при заполнении дополнительного отпуска в табличной части вид не проставляется, а даты нормально
пока не разобрался
21. hopter 36 10.08.16 03:54 Сейчас в теме
еще не могу понять можно ли так флажок установить
22. hopter 36 10.08.16 04:19 Сейчас в теме
флажок похоже нельзя, т.к. это не поле ввода
23. tormozit 7136 08.09.16 10:29 Сейчас в теме
(22) Да, нельзя. В теме же написано четко "Поле ввода"
25. SlavaKron 19.09.18 09:17 Сейчас в теме
(22) В УФ можно менять вид поля формы на клиенте. "Поле флажка" можно поменять на "Поле ввода".
24. Toolfan 21.10.16 22:52 Сейчас в теме
По поводу отработки обработчика у Номенклатуры, та же самая проблема, решить не удается
Так и не у кого не получилось решить?
26. tormozit 7136 06.04.19 09:26 Сейчас в теме
Обновил код. Теперь там есть поддержка обычных и управляемых форм (табличных полей и таблиц формы).
27. mszsuz 322 07.04.19 01:42 Сейчас в теме
Если бы такое оформление условий использовалось в типовых, можно было получить вывих мозга
28. tormozit 7136 07.04.19 10:15 Сейчас в теме
29. acsent 1199 08.04.19 11:52 Сейчас в теме
А не проще ли сделать расширение, где будет
Процедура расш_ПриИзменении() экспорт
    ПриИзменении()
КонецПроцедуры
30. tormozit 7136 08.04.19 12:55 Сейчас в теме
(29) Так обработчика может не быть. К тому же есть внутренние обработчики платформы при изменении значения в поле ввода. Они не вызываются при вызове прикладного обработчика.
31. acsent 1199 08.04.19 17:29 Сейчас в теме
(30) А какой тогда пересчет нужно вызвать, если обработчика то и нет?
32. tormozit 7136 08.04.19 17:59 Сейчас в теме
(31) Например очистка связанных полей ввода.
33. lev6975 17.10.19 21:57 Сейчас в теме
Неработает... вышибает 1С с дампом памяти
Можно подробнее описать что такое "Табличное поле" здесь конкретно и "Колонка"?
Для подстановок в процедуры
34. tormozit 7136 17.10.19 22:06 Сейчас в теме
(33) Если приложение аварийно завершается, то надо сделать пример для воспроизведения проблемы. Тогда возможно я чем то помогу. Но такую проблему читаю впервые. А по поводу табличного поля и колонки все описано в комментариях перед методом.
35. lev6975 17.10.19 22:44 Сейчас в теме
И вообще, тут, по - моему, опечатка - в функции идут 4 параметра - табличноеполе, колонка, значение, инициатор и два левых булёвых
А во внутренней функции их уже три... может из за этого - все сдвигается и поэтому глючит
36. ZanderZ 18.10.19 08:39 Сейчас в теме
(33)
Так же вылетает с дампом...на строке ТабличноеПоле.ИзменитьСтроку();
37. tormozit 7136 18.10.19 09:08 Сейчас в теме
(36) Часто в таких ситуациях причиной является бесконечная рекурсия.
38. ZanderZ 18.10.19 09:21 Сейчас в теме
(37) я пытаюсь из заполнения объекта вызвать не в цикле
ИнтерактивноЗаписатьВКолонкуТабличногоПоляЛкс(ВладелецФормы.Элементы.Сотрудники,ВладелецФормы.Элементы.Сотрудники.ПодчиненныеЭлементы.СотрудникиКоличествоДней,10,,Ложь);



и вылетает с дампом...
39. karpal 215 23.07.20 13:25 Сейчас в теме
Похоже, прикрыли лазейку...
На 8.3.16.1502 уже не работает такой подход
40. tormozit 7136 23.07.20 14:12 Сейчас в теме
(39) Работает во всех существующих версиях до 8.3.18 включительно.
41. karpal 215 17.09.20 09:45 Сейчас в теме
(40) разобрался в чем проблема. Если целевая форма не открыта, то теперь обработчик не вызывается. Ранее форму можно было не открывать. Поведение изменилось где-то между 8.3.12 и 8.3.16
SlavaKron; +1 Ответить
44. vsesam80 01.12.20 19:23 Сейчас в теме
(41)То есть если просто получить форму не открывая это не сработает? ну печалька...
45. tormozit 7136 01.12.20 22:04 Сейчас в теме
(44) Думаю он имел ввиду именно это. Я сам не проверял для управляемой формы. Но по крайней мере до 8.3.18 включительно, если использовать обычную не открытую форму в качестве отправителя, то работает для доставки и в обычные и в управляемые формы.
46. vsesam80 02.12.20 04:32 Сейчас в теме
(45)Сейчас потестил. если форма целевого документа, где изменяем реквизит открыта - то все ок. У меня у контрагента заполняется договор. А если не открывать то ничего не происходит. А хотелось бы не открывать и использовать эту вещь для заполнения всяких там счетов и пр. в ТЧ документа
47. tormozit 7136 02.12.20 07:09 Сейчас в теме
(46) Теперь ясно, что ты имел ввиду под "целевая форма". Ты так назвал форму, получающую оповещение об изменении реквизита. С не открытой формой-получателем оповещения я вообще не проверял. Кстати в подобных случаях принято указывать версию платформы.
48. vsesam80 02.12.20 12:29 Сейчас в теме
49. vsesam80 02.12.20 19:54 Сейчас в теме
(47)Ваш код замечателен, я даже нашел ему применение. Спасибо. Жаль всё таки нельзя получить управляшку и там инициировать вызов "ПриИзменении" с вашим кодом. Эх...столько бы времени мы все сэкономили)))
42. VladimirB 16 12.11.20 14:27 Сейчас в теме
Для клюшек тоже сделал похожее. Но, правда, с применением 1С++ и formex.
50. rule_2 47 20.04.21 06:31 Сейчас в теме
Долго не мог понять, почему код то работает, то нет. В общем, если на управляемой форме есть несколько страниц, то текущей страницей для группы должна быть та, в ТЧ которой изменяются значения.

Поясню: есть у меня в УТ 11.4 документ Заявка на возврат товаров от клиента. Я добавил кнопку, по нажатию которой в ТЧ Возвращаемые товары и в ТЧ Заменяющие товары должны упасть одни и те же товары. А выполнить обработчик ПриИзменении мне нужно для колонки Номенклатура, причем для каждой ТЧ этой свой обработчик. Взял код отсюда, а он то работает, то нет. Поэтому пришлось программно менять текущую страницу, чтобы обработчики срабатывали.

Так что если у вас есть такие же проблемы, стоит уточнить этот момент.

P.S. ТаблицаФормы.ИзменитьСтроку() сработает только в том случае, если ТаблицаФормы.ТекущаяСтрока <> Неопределено. Если планируется добавлять строку в объект программно, нужно сперва эту строку установить, например:
Строка = Форма.Объект[ИмяТаблицы].Добавить();
ТаблицаФормы.ТекущаяСтрока = Строка.ПолучитьИдентификатор();
51. akkorn 07.06.21 18:13 Сейчас в теме
Уважаемые форумчане. Помогите с этим запуском процедуры "При изменении"
Эксперементирую в Управлении торговлей 11.4, УФ

Суть. Заранее имя формы не известно, но известно что она открыта у пользователя. Тип документа тоже не известен.
В качестве примера примем его как форму документа "Приобретение товаров и услуг"

Я пишу такую процедуру (см.ниже) во внешней обработке. Это простейший пример, все переменные заданы напрямую.
Она сканирует открытые окна, и если находит наш пример, работает с ним.

Задача. Получить значение в столбце "Сумма" - в обработке мы указываем цену и количество.

Ну вот не выходит аленькай цветок. ЧЯДНТ? Спс!!

&НаКлиенте
Процедура ТестИнфостарт()
	ОкнаПриложения = ПолучитьОкна();
	Форма = Неопределено;
	Для Каждого Строка Из ОкнаПриложения Цикл
		Если Лев(Строка.Заголовок, 29) = "Приобретение товаров и услуг " Тогда
			Для Каждого Строка2 Из Строка.Содержимое Цикл
				Если ТипЗнч(Строка2) = Тип("ФормаКлиентскогоПриложения") Тогда
					Форма = Строка2;
					Прервать;
				КонецЕсли;
			КонецЦикла;
			Прервать;
		КонецЕсли;
	КонецЦикла;
	Если Форма = Неопределено Тогда
		Возврат;
	КонецЕсли;
	нСтр = Форма.Объект.Товары.Добавить();
	Форма.Элементы.Товары.ТекущаяСтрока = нСтр.ПолучитьИдентификатор();
	Форма.Элементы.Товары.ТекущийЭлемент = Форма.Элементы.Товары.ПодчиненныеЭлементы.Найти("ТоварыКоличествоУпаковок");
	Форма.Элементы.Товары.ИзменитьСтроку();
	нСтр.КоличествоУпаковок = 14.123;
	Форма.Элементы.Товары.ТекущийЭлемент = Форма.Элементы.Товары.ПодчиненныеЭлементы.Найти("ТоварыЦенаЗаказа");
	Форма.Элементы.Товары.ИзменитьСтроку();
	нСтр.Цена = 154.321;
	Форма.ТекущийЭлемент = Форма.Элементы.Товары;
	Форма.Активизировать();
	//пробовал, ессно, и из приведенных в шапке процедур, но тут вообще я запутался чаго куда передавать..
	ИнтерактивноЗаписатьВКолонкуТабличногоПоляЛкс(Форма.Объект.Товары, Форма.Элементы.Товары.ПодчиненныеЭлементы.ТоварыКоличествоУпаковок, 24.123, ЭтаФорма,,Истина);
	ИнтерактивноЗаписатьВКолонкуТабличногоПоляЛкс(Форма.Объект.Товары, Форма.Элементы.Товары.ПодчиненныеЭлементы.ТоварыЦенаЗаказа, 254.321, ЭтаФорма,,Истина);
КонецПроцедуры
Показать
52. akkorn 08.06.21 15:37 Сейчас в теме
(20) Отвечу сам себе же, - может кому понадобится. Короче, сперва активизируем форму, затем таб.часть. Потом уже меняем там значения. Моя ошибка была в том, что команда Форма.Активизировать(); стояла в конце. Как только передвинул ее в начало изменения, все сходу зафурыкало. Имейте ввиду.

т.е. в моем случае перед добавлением строки должны стоять строки:

    Форма.Активизировать();
    Форма.ТекущийЭлемент = Форма.Элементы.Товары;
    нСтр = Форма.Объект.Товары.Добавить();
    .....


Выше давали информацию, что надо активизировать вкладку. Это пробовал. Но не допер до активизации формы в самом начале.. - в большинстве случаев это своя же форма, потому в глаза не бросается. А вот когда берешь другую не активную.. ..

И еще. Не забываем завершать редактирование строки, а то так и остаемся в последнем поле без выхода из него:
    Форма.Элементы.Товары.ЗакончитьРедактированиеСтроки(Ложь);
53. nickstrelets 23.02.22 05:44 Сейчас в теме
Для изменения поля табличной части документа из внешней обработки получился следующий работающий код. Выполняется &НаКлиенте.
Форма = ОткрытьФорму("Документ.ОказаниеУслуг.ФормаОбъекта", Новый Структура("Ключ", СсылкаНаДокумент));
Форма.Активизировать();
Форма.ТекущийЭлемент = Форма.Элементы.Работы;
Для Каждого СтрокаТЗ Из Форма.Объект.Работы Цикл
	ИдентификаторСтроки = СтрокаТЗ.ПолучитьИдентификатор();
	Форма.Элементы.Работы.ТекущаяСтрока = ИдентификаторСтроки;
	Форма.Элементы.Работы.ТекущийЭлемент = 
		Форма.Элементы.Работы.ПодчиненныеЭлементы.Цена;
	Форма.Элементы.Работы.ИзменитьСтроку();
	// следующую процедуру взял 1в1 из сообщения автора, только закомментил строку ...ПолучитьОбщуюФорму("Пустышка"...
	// 1000 - устанавливаемая цена
	ИнтерактивноЗаписатьВЭлементУправленияЛкс(Форма.Элементы.Работы.ТекущийЭлемент, 1000, ЭтаФорма)
	Форма.Элементы.Работы.ЗакончитьРедактированиеСтроки(Ложь);
	Форма.Записать(Новый Структура("РежимЗаписи", РежимЗаписиДокумента.Проведение));
	Форма.Закрыть();
КонецЦикла;
Показать
arshanskiyav; +1 Ответить
54. Cthulhu 1 27.01.23 12:30 Сейчас в теме
в ИнтерактивноЗаписатьВКолонкуТабличногоПоляЛкс в самое начало добавил код:

	// Если тек.строка не установлена - значение все равно не установится (и вылетит по ошибке на "ТабличноеПоле.ИзменитьСтроку()")!..
	Если ТабличноеПоле.ТекущаяСтрока = Неопределено Тогда Возврат КонецЕсли;
55. lev6975 27.07.23 11:01 Сейчас в теме
Необходимость возникает постоянно!
Любят 1С - ники делать расчеты в форме а не в объекте ц..ко!! Причем и на клиенте и на сервере
Взять хотя бы документ "Отпуск" из ЗУП 3.1 Это ЖЕСТЬ!!!!
Мало того что в форме сотни функций и несколько тысяч строк кода который весь выполняется, так еще форма эта гуляет по столькой же куче общих модулей, и там тоже чего - то рассчитывается. Причем не всегда можно сымитировать форму (я создал структуру "Форма" с идентичными реквизитами и таблицами значений), так там нужен именно тип "Форма клиентского приложения". Короче пришлось дергать процедуры из общего модуля в расширение... получилось больше 10 тыщ строк кода. И первое же обновление релиза разрушило все мои труды)))))))
Поэтому именно дергать событие и никак иначе
Иначе каждый релиз новый будешь дрчиться с изменениями в своем расширении)))))
lopatinmix; +1 Ответить
Оставьте свое сообщение