Здравствуйте! Версия террасофт 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));
}
}