8.х не могу прикрутить обработчик программно

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем gosn1ck, 23 авг 2010.

  1. TopicStarter Overlay
    gosn1ck
    Offline

    gosn1ck Опытный в 1С

    Регистрация:
    13 авг 2009
    Сообщения:
    1.329
    Симпатии:
    1
    Баллы:
    26
    суть такова Управление торговлей редакция 10.3 (10.3.8.9), задача простая - сделать так чтобы в документе УстановкаЦенНоменклатуры при изменении наценки расчетного типа цен изменялась цена и соответственно при изменении цены менялась наценка (наличие базового типа в этом документе обязательно).

    делаю так:

    в процедуры ПриОткрытии() и СписокТиповЦенНачалоВыбора() дабавляю вызов процедуры УстановитьОбработчикиПроцентаИЦены(); код представлен ниже

    Код:
    	
    
    
    Процедура УстановитьОбработчикиПроцентаИЦены()
    
    Для каждого КолонкаТЧ из ЭлементыФормы.ТаблицаЦен.Колонки Цикл
    Если Лев(КолонкаТЧ.Имя,7) = "процент" Тогда
    КолонкаТЧ.ЭлементУправления.УстановитьДействие("ПриИзменении", Новый Действие("ПриИзмененииПроцента_пм"));
    ИначеЕсли Лев(КолонкаТЧ.Имя,4) = "цена" Тогда
    КолонкаТЧ.ЭлементУправления.УстановитьДействие("ПриИзменении", Новый Действие("ПриИзмененииЦены_пм"));
    КонецЕсли;
    КонецЦикла;
    
    
    КонецПроцедуры
    
    Процедура ПриИзмененииЦены_пм(Элемент)
    
    ТекущаяСтрока = ЭлементыФормы.ТаблицаЦен.ТекущиеДанные;
    
    Для Каждого СтрокаСоответствияТипов Из мСоответствиеТиповЦен Цикл
    
    Если ТекущаяСтрока["цена"+СтрокаСоответствияТипов.Значение] = Элемент.Значение Тогда
    
    НомерСоответствияТекущейКолонкиБазовый = мСоответствиеТиповЦен[СтрокаСоответствияТипов.Ключ.БазовыйТипЦен];
    НомерСоответствияТекущейКолонки		   = мСоответствиеТиповЦен[СтрокаСоответствияТипов.Ключ];
    
    Если НомерСоответствияТекущейКолонкиБазовый <> Неопределено И НомерСоответствияТекущейКолонки <> Неопределено Тогда
    
    БазоваяЦена 	= ТекущаяСтрока["цена"+НомерСоответствияТекущейКолонкиБазовый];
    ТекущаяЦена		= ТекущаяСтрока["цена"+НомерСоответствияТекущейКолонки];
    ПолученныйПроцент = (ТекущаяЦена / БазоваяЦена - 1) * 100;
    ТекущаяСтрока["процент"+НомерСоответствияТекущейКолонки] = ПолученныйПроцент;
    
    КонецЕсли;
    КонецЕсли;	
    КонецЦикла;
    
    КонецПроцедуры
    
    
    Процедура ПриИзмененииПроцента_пм(Элемент)
    
    ТекущаяСтрока = ЭлементыФормы.ТаблицаЦен.ТекущиеДанные;
    
    Для Каждого СтрокаСоответствияТипов Из мСоответствиеТиповЦен Цикл
    
    Если ТекущаяСтрока["процент"+СтрокаСоответствияТипов.Значение] = Элемент.Значение Тогда
    
    НомерСоответствияТекущейКолонкиБазовый = мСоответствиеТиповЦен[СтрокаСоответствияТипов.Ключ.БазовыйТипЦен];
    НомерСоответствияТекущейКолонки		   = мСоответствиеТиповЦен[СтрокаСоответствияТипов.Ключ];
    
    Если НомерСоответствияТекущейКолонкиБазовый <> Неопределено И НомерСоответствияТекущейКолонки <> Неопределено Тогда
    
    БазоваяЦена 	= ТекущаяСтрока["цена"+НомерСоответствияТекущейКолонкиБазовый];
    ПолученнаяЦена  = БазоваяЦена * (1 + Элемент.Значение / 100);
    ТекущаяСтрока["цена"+НомерСоответствияТекущейКолонки] = ПолученнаяЦена;
    
    КонецЕсли;
    КонецЕсли;	
    КонецЦикла;
    
    КонецПроцедуры
    
    проблема в том что код не работает, если открыть новый документ УЦН, если документ записать и открыть всё прекрасно работает. в чем может быть причина?
  2. alexburn
    Offline

    alexburn Модераторы Команда форума Модератор

    Регистрация:
    5 янв 2009
    Сообщения:
    14.782
    Симпатии:
    509
    Баллы:
    204
    При открытии проверяйте ЭтоНовый
  3. TopicStarter Overlay
    gosn1ck
    Offline

    gosn1ck Опытный в 1С

    Регистрация:
    13 авг 2009
    Сообщения:
    1.329
    Симпатии:
    1
    Баллы:
    26
    а при чем тут новый или нет? мне надо для всех
  4. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.410
    Симпатии:
    316
    Баллы:
    104
    УТ под рукой нет, так что если что пардон. Предположение следующее: вы говорите что устанавливаете обработчик в событии "СписокТиповЦенНачалоВыбора()", но ведь на момент возникновения этого события - колонок то на форме не существует, они появляются позже, только после закрытия модального окна выбора цен (а ваша процедура то уже отработала, и ничего из нужных колонок не нашла, поскольку их еще нет) (смотрите обработчик "ОбработкаВыбора()" формы).
  5. TopicStarter Overlay
    gosn1ck
    Offline

    gosn1ck Опытный в 1С

    Регистрация:
    13 авг 2009
    Сообщения:
    1.329
    Симпатии:
    1
    Баллы:
    26
    добавил вызов своей процедуры туда помогло, был убежден что в СписокТиповЦенНачалоВыбора колонки существуют... хотя может быть еще не существуют поля ввода для них... один момент что вызов происходит для каждый раз при вызове например подбора, ну да ладно
    а когда собственно вызывается обработчик ОбработкаВыбора ? а то из названия не очень понятно
  6. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.410
    Симпатии:
    316
    Баллы:
    104
    Когда модальная форма закрывается в ней вызывается функция "ОповеститьОВыборе", и форма документа получив это сообщение, вызывает обработчик этого события ("ОбработкаВыбора" в нашем случае).
    В процедуре "ОбработкаВыбора" добавлении ваших обработчиков я думаю можно попробовать поместить после блока:
    Код:
    		Если ТипЗнч(ЗначениеВыбора) = Тип("Структура") Тогда
    Если ЗначениеВыбора.Команда = "ИзменениеТиповЦенСкидок" Тогда
    
    
    ,
    (если таким образом получится),
    если не получится то в самом конце процедуры "ОбработкаВыбора" снова добавить вышеуказанный блок.
    Т.е. будет что-то вроде:
    Код:
    ...
    // Обновим состав колонок.
    ОбновитьСоставКолонок();
    ПолучитьСтруктуруПоложенийКолонок();
    ВидимостьКолонок();
    ДоступностьКолонок();
    
    // Если надо, заполним строки по новым типам цен.
    ЗаполнитьПоНовымТипамЦен(СписокДобавленныхТиповЦен);
    
    
    //И здесь добавляем
    Если ТипЗнч(ЗначениеВыбора) = Тип("Структура") Тогда
    Если ЗначениеВыбора.Команда = "ИзменениеТиповЦенСкидок" Тогда
    УстановитьОбработчикиПроцентаИЦены();
    КонецЕсли;
    КонецЕсли;
    
    КонецПроцедуры // ОбработкаВыбора()
    
    

Поделиться этой страницей