Вопрос

SmartTag в контактах

Здравствуйте! Версия террасофт 3.4.0.

Подскажите пожалуйста как можно решить проблему.



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

Дело вот в чем (последовательность сложная но именно она (либо похожая) приводит к ошибке, ситуация нередкая):

1) Открываем контрагента с заполненными двумя контактными данными (н-р телефон и email). У них соответственно напротив каждого отображается значок телефона и конвертик. 

Если провести курсором или нажать например на конверт, потом закрыть карточку

2) и открыть ту, в которой есть только телефон (или ничего) - значков на пустых контактах нет и все ОК. Закрываем ее.

3) следом открыть снова карточку с двумя контактами тел и мейл, значки есть. Закрываем.

4) потом снова открываем карточку с одним телефоном. На карточке мейла нет, но конверт так и показывается, хотя не должен.

 

Изображение удалено.



Ошибка возникает при открытии следующей карточки без мейла. 



 

Изображение удалено.





После нажатия ОК:

Изображение удалено.







в контрагентах на prepare карточки вызывается InitializeCommunicationActionSmartTags(); 



function InitializeCommunicationActionSmartTags() {

    for (var i = 1; i < 6; i++) {

        RefreshCommunicationActionSmartTag(

            Self.ComponentsByName('edtCommunication' + i + 'Type'),

            Self.ComponentsByName('edtCommunication' + i));

    }

}



Она и назначает /удаляет картинки на пустых контактах. 

На первый раз удаление проходит нормально, а на второй уже нет ((

Если отслеживать месседжами, в удаление заходит, команду выполняет, но значок не удаляется и вызывает ошибки. Пробовала вешать отдельно удаление на закрытие карточки, ситуация не изменилась.







Скрипты функций: // scr_CommunicationActionSmartTag

function RefreshCommunicationActionSmartTag(CommTypeDataControl, CommDataControl, ForceRefresh) {

    var CommField = CommDataControl.DataField;

    var CommTypeField = CommTypeDataControl.DataField;

    

    if ((IsEmptyValue(CommTypeField.Value)) ||

        (IsEmptyValue(CommField.Value))) {

        ClearCommunicationActionSmartTag(CommDataControl);

        return;

    }

    var CommTypeDataset = GetCommunicationTypeDataset();

    if (!CommTypeDataset.Locate('ID', CommTypeField.Value)) {

        ClearCommunicationActionSmartTag(CommDataControl);

        return;

    }

    ShellCommand = CommTypeDataset('ShellCommand');

    ShellCommand = (ShellCommand != null ? ShellCommand : '');

    if ((CommField.Tag == ShellCommand) && (!ForceRefresh)) {

        return;

    }

    if ((CommField.Tag) && (!ShellCommand)) {

        ClearCommunicationActionSmartTag(CommDataControl);

        return;

    }

    CommField.Tag = ShellCommand;

    var ControlName = CommDataControl.Name;

    var ActionMenuName = ControlName + CommunicationActionSmartActionMenuName;

    var Window = CommDataControl.ParentWindow;

    if (CommDataControl.Buttons) {

        var ActionMenu = CommDataControl.Buttons;

    } else {

        var ActionMenu = Window.CreateComponent('ActionMenu', ActionMenuName);

        Window.NonVisualComponents.Add(ActionMenu);

    }

    var ActionMenuButton;

    var ButtonName = ControlName + CommunicationActionButtonNameTemplate;

    for (var i = 0; ((i < ActionMenu.Count) && (!ActionMenuButton)); i++) {

        var Item = ActionMenu.Items(i);

        if (Item.Name == ButtonName) {

            ActionMenuButton = Item;

        }

    }

    if (!ActionMenuButton) {

        ActionMenuButton = Window.CreateComponent('ActionMenuItem', ButtonName);

        ActionMenu.AddItem(ActionMenuButton);

    }

    var ImageList = Services.GetSingleItemByUSI(SmartTagImageListName);

    ActionMenuButton.ImageList = ImageList;

    ActionMenuButton.ImageName = CommTypeDataset.ValAsStr('ID').substr(1, 8);

    ActionMenuButton.PressedImageName = SmartTagPressedImageName;

    ActionMenuButton.Tag = ControlName;

    CommDataControl.Buttons = ActionMenu;

    SetObjectEventDispatcher(ActionMenu.ParentWindow, ActionMenuButton,

        ActionMenuButton.Name, 'OnExecute',

        CommunicationActionButtonOnExecuteMethodName);

}

function ClearCommunicationActionSmartTag(CommDataControl) {

    var ControlName = CommDataControl.Name;

    var ActionMenuName = ControlName + CommunicationActionSmartActionMenuName;

    var ButtonName = ControlName + CommunicationActionButtonNameTemplate;

    CommDataControl.DataField.Tag = '';

    var Window = CommDataControl.ParentWindow;

    if (Window.ComponentsByName(ButtonName)) {

//Заходит и выполняется, но без результата

        Window.RemoveComponent(Window.ComponentsByName(ButtonName));

    }

    if (Window.ComponentsByName(ActionMenuName)) {

//Заходит и выполняется, но без результата

        Window.RemoveComponent(Window.ComponentsByName(ActionMenuName));

    }

}

Нравится

1 комментарий

Ответил тут.

Показать все комментарии