Обновление поля карточки контрагента после открытия справочника и изменения соответствующего значения в нем
Здравствуйте!
Возникла следующая ситуация. В карточке контрагента есть два поля Контакт (LookupDataControl) и Телефон контакта (TextDataControl). При выборе контакта поле Телефон контакта автоматически заполняется значением поля Средство связи 1 Контакта. Происходит это на событии dlDataOnDataSetDataChange.
Но поле Телефон контакта обновляется, только если выбирать нового контакта в открывшемся окне справочника. А если у ранее выбранного контакта просто изменить номер телефона (нажав кнопку Изменить в окне Выбор контакта и изменив значение поля Средство связи 1), то есть не выбирать новый контакт, а как бы изменить и выбрать прежний, то поле Телефон контакта карточки контрагента не обновится. И телефон останется прежним.
Подскажите, пожалуйста, как сделать так, чтобы значение поля Телефон контакта обновлялось сразу после закрытия окна справочника Контактов?
Нравится
Поле "телефон контакта" -- это Доп. поле? Т.е. Оно хранится в бд?
Можно сделать проще -- колонкой в запросе "вытягивать" телефон.
В самом запросе Контрагента у Вас уже есть приджойненая таблица контакта (из нее вытягивается имя контакта для отображения)--добавьте еще одну колонку и выберите его телефон. Потом поле добавьте в датасет и в карточку.
Тогда не будет проблем с тем, что когда поменялся телефон в контакте -- в контрагенте не поменялся.
Единственный момент -- когда вы только добавите контакт -- то телефон сразу не подтянется (будет при следующем открытии карточки)
Здравствуйте, Ольга!
Если я все правильно понимаю, у меня сейчас все так и есть.
В tbl_account есть только поле ContactID. В запросе sq_account есть колонка ContactPhone. Есть соответствующее поле в датасете и в карточке.
В том то и дело, что Поле Телефон в карточке контрагента обновляется только при следующем открытии карточки. А необходимо, чтобы это происходило сразу после выбора и закрытия справочника.
Поэтому на событие dlDataOnDataSetDataChange была описана функция обновляющая поле ContactPhone. Но, как я уже говорила выше, это событие не обрабатывается, если не был выбран новый контакт, а просто было обновлено поле телефон, у того контакта, который уже был выбран.
Была такая проблема, решал я ее таким примерно таким скриптом, который надо вешать на изменение нужного поля в карточке контакта:
[javascript]
//Try потому что при получении прародительского окна из Воркспейса контактов вылетает ошибка (прародительского окна нет)
try {
//Получаем прародительское окно (Допустим идем по такому пути Счет - выбираем Клиента (Окно выбора контрагента) - карточка контрагента - выбираем основной контакт(окно выбора контакта) - карточка контакта (текущее окно))
var ParentWindow = Self.Attributes('NotifyObject').Attributes('NotifyObject').ParentWindow;
//Убеждаемся что прародительское окно - это карточка контрагета (можно по USI брать)
if (ParentWindow.Caption == 'Контрагент') {
//Берем Dataset окна контрагента
var AccountDataset = ParentWindow.ComponentsByName('dlData').Dataset;
//Проверяем, что в текущей карточке тот контакт, который у нас в поле Основной контакт в контрагенте, а то и DataChange в контргаенте с этим справится
//Вдруг меняют телефон другого контакта (между делом)
if (AccountDataset('PrimaryContactID') == Dataset('ID')) {
//Запихиваем нужную информацию
AccountDataset('FieldX') = Dataset('Communication1');
}
}
} catch(e) {
}
[/javascript]
Надеюсь разберетесь
Здравствуйте, Александр Владимирович!
Спасибо Вам за совет!
Попробывала этот код привязать на событие dlDataOnDatasetDataChange (компонента dlData сервиса wnd_ContactEdit). Выглядит это следующим образом:
[javascript]
function dlDataOnDatasetDataChange(DataField) {
var Dataset = DataField.ParentDataFields.ParentDataset;
var Value = DataField.Value;
var Name = DataField.Name;
switch (Name) {
case ('Communication1'):
try {
var ParentWindow = Self.Attributes('NotifyObject').Attributes('NotifyObject').ParentWindow;
if (ParentWindow.Caption == 'Контрагент') {
var AccountDataset = ParentWindow.ComponentsByName('dlData').Dataset;
if (AccountDataset('ContactID') == Dataset('ID')) {
AccountDataset('ContactPhone') = Dataset('Communication1');
}
}
} catch(e) {
}
break;
[/javascript]
В этом случае, действительно, в момент правки поля Средство связи 1 в карточке контакта тоже самое происходит в поле Телефон контакта в карточке контрагента. Но это не совсем верно, потому что может так случится, что пользователь Начнет править телефон в карточке контакта (параллельно он исправиться и в карточке контрагента), а потом передумает и нажмет Отмена. В результате в карточке контакта телефон останется прежним. А в карточке контрагента будет записан тот, что пользователь пробовал ввести в карточке контакта перед тем как нажать отмену.
Еще попробывала привязать этот скрипт на событие OnDatasetDataChange у ds_Contact (function SelfOnDatasetDataChange(DataField) в скрипте scr_Contact)
[javascript]
if (DataField.Name == 'Communication1'){
try {
var ParentWindow = Self.Attributes('NotifyObject').Attributes('NotifyObject').ParentWindow;
if (ParentWindow.Caption == 'Контрагент') {
var AccountDataset = ParentWindow.ComponentsByName('dlData').Dataset;
if (AccountDataset('ContactID') == Dataset('ID')) {
AccountDataset('ContactPhone') = Dataset('Communication1');
}
}
} catch(e) {
}
return;
}
[/javascript]
Но это не помогло. В этом случае поле Телефон контакта в карточке Контакта вообще не обновляется.
Может быть я что-то неправильно делаю ? Или код нужно прописать на каком другом событии ? Подскажите, пожалуйста...
В скрипте датасета не надо прописывать. Из него вы не обратитесь к прародительскому окну, а так как там стоит try, то вы и ошибку не видите. (хотя может вру)
Думаю надо делать все в карточке контакта.
Чтобы избежать ситуации, которую вы описали, могу предложить создать глобальную переменную
[javascript]
var ContactPhone = null; //На OnPrepare лучше тоже прописать ContactPhone = null
[/javascript]
На изменение поля Communication1 записывать значение в эту переменную (без моего скрипта).
[javascript]
ContactPhone = Dataset('Communication1');
[/javascript]
А мой скрипт поместить на датасет в карточке на BeforePost, только вместо поля Dataset('Communication1') брать глобальную переменную, если она не null.
Если пользователь закроет карточку или отмену нажмет, то BeforePost не сработает, если ContactPhone == null, то телефон не менялся, не зачем его записывать в контрагента.
И только когда телефон поменяли и была нажата кнопка "ОК" произойдет то, что нужно.
Это мысли вслух (точнее в форум), не проверял, оставляю на вас, пропадет динамика (добавили 1 цифру в контакте, тут же добавилась цифра в контрагенте), но вроде бы она вам и не нужна.