Имя: Пароль:
1C
 
При программном изменении реквизита не срабатывают обработчики ПриИзменении
0 ShadowWeaver
 
24.11.25
10:13
Всем доброго дня. Может кто подскажет. В расширении для документа "Заказ покупателя" добавляю реквизит "Псевдоним". При его изменении программно подставляется контрагент:
Объект.Контрагент = НайтиЮрЛицоПоУмолчанию(Объект.Псевдоним);
Проблема: при таком программном изменении контрагента НЕ срабатывают обработчики ПриИзменении, хотя при ручном изменении через форму всё работает.
Как заставить 1С "увидеть" изменение контрагента при программной установке и вызвать всю бизнес-логику как при ручном изменении?
1 Волшебник
 
24.11.25
10:14
вызвать обработчик
2 ShadowWeaver
 
24.11.25
10:18
Я уже пробовал вызывать ВСЕ обработчики, и они вызываются (видно по отладке), но бизнес-логика не выполняется. В чем может быть причина, что обработчики вызываются, но не выполняют свою логику при программном изменении контрагента?
3 Волшебник
 
24.11.25
10:20
(2) Не рассказывайте сказки
4 Fish
 
гуру
24.11.25
10:23
(2) Что-то не сходится.
В (0) написано "НЕ срабатывают обработчики ПриИзменении"
в (2) "пробовал вызывать ВСЕ обработчики, и они вызываются (видно по отладке)"

Определитесь уже, вызываются нужные обработчики, или нет.
5 ShadowWeaver
 
24.11.25
10:26
&НаКлиенте
Процедура ПЗТПЗТПсевдонимПриИзмененииПеред(Элемент)
    
    Если г_ФлагИзменения Тогда
        Возврат;
    КонецЕсли;
    
    г_ФлагИзменения = Истина;

    Если Объект.ПЗТПсевдоним = Неопределено Тогда
        Объект.Контрагент = Неопределено;
    Иначе
        Попытка
            Контрагент = НайтиЮрЛицоПоУмолчанию(Объект.ПЗТПсевдоним);
            Объект.Контрагент = Контрагент;
        Исключение
            Сообщить("Ошибка при определении юрлица по псевдониму: " + ОписаниеОшибки());
            Объект.Контрагент = Неопределено;
        КонецПопытки;
    КонецЕсли;
    
    Если ПЗТПереключательЗонаКМ = "1" Тогда
        Если ЗначениеЗаполнено(Объект.Контрагент) Тогда
            ОбновитьЗаголовокПоЗоне();
        Иначе
            Объект.ПЗТЗонаДоставки = Неопределено;
            Элементы.ПЗТЗонаДоставки.Заголовок = "";
        КонецЕсли;
    КонецЕсли;
    

    Если Не ЗначениеЗаполнено(Объект.Грузоотправитель) И ЗначениеЗаполнено(Объект.Контрагент) Тогда
        Объект.Грузоотправитель = Объект.Контрагент;
    КонецЕсли;
    
    г_ФлагИзменения = Ложь;
    
КонецПроцедуры


Вот так я подбираю и подставляю контрагента в реквизит, и обработчик при изминении контрагента - не срабатывает...
6 p-soft
 
24.11.25
10:26
(0) он вызывается только из формы. при программном изменении реквизита обработчики надо тоже вызывать программно.
чаще читайте код стандартных конфиг
7 maxab72
 
24.11.25
10:26
(4) а может они вызываются как у Гоголя "А подать сюда Ляпкина-Тяпкина!". Но после вызова ничего не следует. Обычно в этих интерактивных пишут:
Процедура БольшаяКнопкаУправленияМиромПриИзменении(какойтоконстекст)
ОбработкаНажатияБольшойКнопкойУпарвленияМиром();
КонецПроцедуры

и при программном изменении вызывают ОбработкаНажатияБольшойКнопкойУпарвленияМиром()
8 ShadowWeaver
 
24.11.25
10:29
пробовал вызвать обработчик после подстановки контрагента, и не работает..
&НаКлиенте
Процедура ПЗТПЗТПсевдонимПриИзмененииПеред(Элемент)
    
    Если г_ФлагИзменения Тогда
        Возврат;
    КонецЕсли;
    
    г_ФлагИзменения = Истина;

    Если Объект.ПЗТПсевдоним = Неопределено Тогда
        Объект.Контрагент = Неопределено;
    Иначе
        Попытка
            Контрагент = НайтиЮрЛицоПоУмолчанию(Объект.ПЗТПсевдоним);
            Объект.Контрагент = Контрагент;
        Исключение
            Сообщить("Ошибка при определении юрлица по псевдониму: " + ОписаниеОшибки());
            Объект.Контрагент = Неопределено;
        КонецПопытки;
    КонецЕсли;
    
    // Пробовал вызывать так - не работает:
    КонтрагентПриИзменении(Элементы.Контрагент);
    
    
    Если ПЗТПереключательЗонаКМ = "1" Тогда
        Если ЗначениеЗаполнено(Объект.Контрагент) Тогда
            ОбновитьЗаголовокПоЗоне();
        Иначе
            Объект.ПЗТЗонаДоставки = Неопределено;
            Элементы.ПЗТЗонаДоставки.Заголовок = "";
        КонецЕсли;
    КонецЕсли;
    

    Если Не ЗначениеЗаполнено(Объект.Грузоотправитель) И ЗначениеЗаполнено(Объект.Контрагент) Тогда
        Объект.Грузоотправитель = Объект.Контрагент;
    КонецЕсли;
    
    г_ФлагИзменения = Ложь;
    
КонецПроцедуры
9 lEvGl
 
гуру
24.11.25
10:29
ПЗТПЗТП
ии генерил похоже
10 Волшебник
 
24.11.25
10:30
(9) да и автор бот походу, нулевое логическое мышление, полное отсутствие здравого смысла
11 ShadowWeaver
 
24.11.25
10:35
Я самый настоящий человек, который просит помощи...

Правильно ли я понял, что после программной установки контрагента нужно вызывать не обработчик ПриИзменении, а процедуру ОбработатьИзменениеКонтрагента()?
12 Fish
 
гуру
24.11.25
10:36
(8) "// Пробовал вызывать так - не работает:
    КонтрагентПриИзменении(Элементы.Контрагент);" - Что значит "Не работает"?
Не заходит отладчиком в процедуру?
13 ShadowWeaver
 
24.11.25
10:39
(12) Отладчиком смотрел, КонтрагентПриИзменении вызывается, но в документе не подставляется договор, задолженность контрагента и тд.
14 Fish
 
гуру
24.11.25
10:41
(13) Ну так и иди отладчиком по процедуре КонтрагентПриИзменении. Тогда и увидишь, почему не заполняется.
Мы же не знаем, что у тебя в этой процедуре написано.
15 ShadowWeaver
 
24.11.25
10:43
После выбора Псевдонима и подстановки контрагента, руками выбираешь этого же контрагента - не работает бизнес логика. Если выбрать руками другого контрагента - все работает.
16 Fish
 
гуру
24.11.25
10:44
(15) Ну так отладчик тебе в помощь. Смотри, что происходит в твоей процедуре "ПриИзменении" и в чём отличие.
17 ShadowWeaver
 
24.11.25
10:45
Понял, пройду отладчиком по всей цепочке. Спасибо.
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс