Здравствуйте, уважаемые коллеги!

Заметил серьёзную ошибку в поведении датасета.

В 3.3.2.262 (независимо подтверждено в 240 и в 198) при изменении значения в ENUM-поле событие OnDatasetDataChange происходит два раза. При изменении полей других типов это событие происходит как следует, один раз.

Воспроизвести очень легко: поставить debugger на DataChange. Стоит в карточке поменять поле enum - войдёт в отладчик дважды.

При этом проверка DataField.Value == DataField.OldValue оба раза возвращает false, отличить реальный DataChange от повторного срабатывания по этому признаку нельзя, приходится запоминать прежнее значение в глобальном объекте скрипта, чтобы обойти ошибку.

Пока ошибка не исправлена, один из возможных вариантов универсальной заглушки выглядит так:

//ScriptObject - глобальный объект, объявлен в начале всего скрипта

function dlDataOnDatasetDataChange(DataField) {
        var DataFieldName = DataField.Name;
        var DataFieldValue = DataField.Value;
        if (DataField.FieldType == dftEnum){//Для полей типа ENUM
                if (ScriptObject[DataFieldName] == DataFieldValue){
                        return;//Если значение в действительности не менялось - выходим, это второй, ошибочный заход
                } else {
                        ScriptObject[DataFieldName] = DataFieldValue;
                }
        }
// дальше сама обработка...

Нравится

11 комментариев

Cпасибо, Анатолий! Действительно, и у меня такая проблему проявлялась (на версии 3.2.2.171). Долго искала, в чем загвоздка, пока не предположила, что это ошибка в ядре.

В пост призываются специалисты технической поддержки с номером инцидента и сроками разрешения:smile:

Любопытная деталь: с этой ошибкой сталкивались очень многие разработчики, и я сам видел её не раз. Но поступал по принципу "не верь глазам своим". Собственно, мне указал на неё новый сотрудник, и реакция у меня была "не может быть, это ты что-то напутал". Пришлось преодолеть определённый психологический барьер чтобы убедиться: да, такая ошибка реально существует.

Анатолий, данная проблема уже была отмечена сотрудником Terrasoft Константином Пихало и исправлена начиная с версии 3.4.1.28

На 3.4.0. и 3.3.2 пока не переносили данные изменения.

Здравствуйте, коллеги!
Обходное решение есть, проблема исправлена в версии 3.4.1. К сожалению, перенос исправления на 3.4.0, и на 3.3.2 не планируется.

А что там с переходом с 3.4 на 3.4.1? А то как то неприятно получается актуальная версия уже без планов на исправление багов

Перенос исправления пусть не планируется, а исправить ошибку надо!

Предполагаю что билд 3.3.2.262 поновее чем 3.4.1, тем более что на 3.4.1 проекты можно по пальцам пересчитать.

По данному вопросу создан запрос на изменение, Deadline по запросу на изменение: 06.04.2012

Здравствуйте, коллеги
Исправление войдет в сборки начиная с:

  • 3.3.2.266+
  • 3.4.0.118+
  • в 3.4.1 это исправление уже было.

Выслал Вам на почту ссылку на скачивание бинарных файлов 3.3.2.266

"Яворский Алексей" написал:

Спасибо за помощь и оперативность!

Спасибо, оперативно!

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

Здравствуйте, господа. Заимел проблему.
Задача: в карточке договора при изменении значения состояния (в комбобоксе) надо подставить в качестве даты завершения текущую дату. То есть выбираем в комбобоксе "Завершён" - дата меняется.
Проблема: скрипт работает, но не совсем корректно. Дата меняется не тогда, когда мы меняем какое-то состояние на состояние "Завершён", а уже тогда, когда мы пытаемся менять состояние "Завершён" на какое-то другое.

В function DataChange(DataField) добавил такой кусок кода:

case ('ContractStatusID'):
                        ContractScript.DisableDataChange = true;
                        try {
                                var StatusName = DataFields.ItemsByName('ContractStatusName').Value;
                                var Today = GetLocalDate();
                                var sEnd = 'Завершён';
                                if(StatusName == sEnd)
                                {
                                        DataFields.ItemsByName('DueDate').Value = Today;
                                        MessageBox('В качестве даты закрытия контракта установлена сегодняшняя дата!');
                                }
                        }                      
                        finally{
                                ContractScript.DisableDataChange = false;
                        }
                        break;

Видимо, получается, что я обращаюсь к старому экземпляру поля ContractStatusName. А надо к только что установленному.
Помогите, пожалуйста.

Нравится

2 комментария

Сергей, не пробовали сравнивать if(StatusName == sEnd) не по названию состояния, а по его ID? Возможно, поскольку обработка происходит в момент изменения StatusID, а не StatusName, последнее поле содержит старое значение.

Олег Лабьяк,
разработчик,
3-я линия Службы поддержки Terrasoft.

Олег,
пробовал, но только сейчас сообразил что ID для сравнения подставлял при этом без фигурных скобок.
Разобрался, спасибо;)

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