Задача:
Есть датает который возращает ID задач (ds_TaskToClose), в которых необходимо поменять Статус = Закрыто, Результат задачи = Выполнено. При этом есть механизмы, которые должны сработать после записи в Dataset Задач. Еще одна мотивация менять поля через Датасет - то что задачи созданы по БП.

//-----------------------------------------------------------------------------
// scr_CloseTask
//-----------------------------------------------------------------------------
function Main()
{

var TaskToClose = Services.GetNewItemByUSI('ds_TaskToClose');
var TaskDataset = Services.GetNewItemByUSI('ds_Task')

TaskToClose.Open();
        while (!TaskToClose.IsEOF) {
                ApplyDatasetFilter(TaskDataset,'ID',TaskToClose('ID'),true);
                TaskDataset.Open();
                TaskDataset.Edit();
                TaskDataset('StatusID') = '{F598ECDB-4EEF-4FA8-9E69-A36B053501E5}' // Closed
                TaskDataset('ResultID') = '{FC3E0665-C980-4E6E-8941-FAF4294C653F}' // Perfomed
                TaskDataset.Post();
                TaskDataset.Close();
                TaskToClose.GotoNext();
        }
TaskToClose.Close();   
}

Мой код привел к следующему
Если Заглавие задачи (Tilte) обязательное поле для заполнения в сервисе таблицы получаем ошибку, того что пишем Null в поле Tilte на строке TaskDataset.Post();, если сделать поле Title не обязательным для заполнения в сервисе таблицы, и запустить скрипт получим пустые задачи, так как во все поля кроме StatusID,ResultID, и ID, запишется NULL.

Просьба помочь решить задачу.

Нравится

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

Из Администратора по F9 лучше не вызывать скрипты, обновляющие данные.
Посмотрите тут (обсуждалось подобное)
http://www.community.terrasoft.ua/forum/topic/2893

Валерий, спасибо огромное, это оно!

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

Здравствуйте!
Задача : Использовать бинарные файлы 3.4.0 на конфигурации 3.3.1

О том как использовать бинарные файлы 3.4.0 на конфигурации 3.3.2 описано Сашей Кравчуком в блоге http://www.community.terrasoft.ru/blogs/6982

В случае 3.3.1 необходимо сделать некоторые дополнительные действия:

  1. В Terrasoft Administrator, загрузить сервис с вложения tbl_DatabaseInfo, на вопрос о сохранении структуры в БД
    1
    необходимо ответить "Да"
    Данное действие необходимо выполнить, так как в 3.3.1 в таблице tbl_DatabaseInfo нет такой колонки как DatabaseBuildVersion
  2. Далее необходимо на уровне базы данных выполнить запрос
    UPDATE [tbl_DatabaseInfo] SET
          [DatabaseMajorVersion] = 3,
          [DatabaseMinorVersion] = 4,
          [DatabaseReleaseVersion] = 0,
          [DatabaseBuildVersion] = 115

    Значение для DatabaseBuildVersion выберете с учетом актуальных бинарных файлов которые Вы планируете использовать
    На данном этапе, если Вы попытаетесь зайти в менеджер лицензий бинарными файлами 3.4.0, получите следующую ошибку
    2
    Данная ошибка связана с тем что в хранимой процедуре tsp_GetLoginInfo конфигурации 3.3.1 отсутствует переменная @DatabaseBuildVersion
  3. Обновляем хранимую процедуру tsp_GetLoginInfo (скрипт Alter_tsp_GetLoginInfo.sql)
  4. Регистрируем бинарные файлы 3.4.0 (перед этим необходимо выйти с Outlook, Excel, Word)
  5. Добавляем конфигурацию 3.3.1
  6. Заказываем лицензии, для этого необходимо запустить TSClient.exe с ключом /wnd=wnd_LicenseManager
    TSClient.exe /wnd=wnd_LicenseManager

    Пример пути
    C:\Program Files\Terrasoft\Bin\TSClient.exe /wnd=wnd_LicenseManager

    В менеджере лицензий необходимо добавить продукты Dictionary и JobManager
    3
    При этом лицензии 3.4.0 должны быть оплачены.
    При заказе лицензий нужно учитывать факт, что некоторые разделы в 3.4.0 были вынесены в другие продукты.
    Примером такого раздела является Склад (OfferingMovement), который в 3.4.0 вынесен в XRM Distribution.
    В конкретном случае можно данный раздел удалить с менеджера лицензий как продукт и отослать запрос на лицензии на support@tscrm.com
    Если использование разделов, которых нет в продуктах 3.4.0 принципиально, данный вопрос Вы можете обсудить с Вашим менеджером
  7. После того как Вы загрузили лицензии, если вы запустите TSClient Вы увидите что рабочая область не инициализировалась
    3
    Для исправления необходимо в scr_Main изменить функцию amiAccountsOnExecute
    Добавить
            var CurrentWorkspaceWindow = wndWorkspace.Window;
                    if (CurrentWorkspaceWindow) {
                    StopOrRefreshWebDetail(CurrentWorkspaceWindow, false);
                    }

    вместо
                var CurrentWorkspaceWindow = wndWorkspace.Window;
                if (!CurrentWorkspaceWindow) {
                    return;            
                }
                StopOrRefreshWebDetail(CurrentWorkspaceWindow, false);

    В результате Вы получите
    function amiAccountsOnExecute(ActionMenuItem) {    
            var WorkspaceUSI = ActionMenuItem.Tag;
        var DoRefreshWorkspace = (Main.WorkspaceUSI == WorkspaceUSI);
        if (!DoRefreshWorkspace) {
    //          var CurrentWorkspaceWindow = wndWorkspace.Window;
    //          if (!CurrentWorkspaceWindow) {
    //              return;            
    //          }
                    var CurrentWorkspaceWindow = wndWorkspace.Window;
                    if (CurrentWorkspaceWindow) {
                    StopOrRefreshWebDetail(CurrentWorkspaceWindow, false);
                    }

                //StopOrRefreshWebDetail(CurrentWorkspaceWindow, false);
        }
        ShowWorkspace(WorkspaceUSI);
    ....

Английский вариант обсуждения такого перехода смотрите тут

Нравится

Поделиться

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

Алексей, спасибо, очень ценный материал

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

Речь пойдет о разных, новых механизмах ядра 3.4

1. Производительный BeginUpdate/EndUpdate

В разработке UI (User Interface) многое зависит от того, какое расположение элементов управления, цвета, подсветки и т.д. Но, также много зависит от того, что видит пользователь при динамическом изменении карточки, конролов, окна при определенных действиях. Поэтому, всегда нужно уделять внимание тому, что пользователь визуально видеть не должен. Существуют механизмы скрытия рисования при динамическом изменении содержимого. Итак, постараюсь описать существующий механизм BeginUpdate/EndUpdate в Terrasoft 3.4.x.

В Terrasoft 3.4.x+ реализовано 2 возможности запретить окну обновлять содержимое:

  • «Глобальный» Lock (далее GlobalLock). Данный метод запретит Вам обновлять все окно (используется в Terrasoft 3.3.x)
  • «Индивидуальный» Lock (далее ControlLock). Этот метод запретит обновлять только тот контрол (и все его содержимое), которому был установлен Lock

В чем же разница и как понять, какой метод использовать? Для начала немного теории. GlobalLock – это функция, написанная Microsoft на все случаи жизни еще в Windows 2000. Она, конечно же, имеет право на жизнь, но с одним НО – только одно окно в системе может быть заблокировано в одну единицу времени. Блокировка любого другого окна (даже не вашего) - приведет к автоматической разблокировке вашего окна. Что же делает ControlLock? Этот метод блокирует обновление окна до того момента, пока вы лично не скажете ему, что оно может обновляться. В каждом из этих методов есть свои плюсы и минусы. В Terrasoft 3.4.x GlobalLock используется только для окон (Window), а для всего остального используется ControlLock. Для того чтобы понять разницу какой метод и когда запускается, рассмотрим пример:

/*Припустим, что у нас имеется FrameGroup’а, в которую динамически добавляются контролы.
Поэтому, на время добавления Нам нужно запретить окну обновляться*/

function wnd_WindowOnPrepare(Window) {
        Window.BeginUpdate(); /*Будет использован GlobalLock, так как это Window*/
        CreateControls();
        Window.EndUpdate();
}
function wnd_WindowOnPrepare(Window) {
        Self.BeginUpdate(); /*Будет использован GlobalLock, так как Self всегда является окном*/
        CreateControls();
        Self.EndUpdate();
}
function wnd_WindowOnPrepare(Window) {
        FrameGroup.BeginUpdate(); /*Будет использован ControlLock*/
        CreateControls();
        FrameGroup.EndUpdate();
}

Разница заключается в том, что в первом случае обновится все окно, а во втором – только FrameGroup’а. Отсюда следует, что использовать ControlLock производительнее, нежели GlobalLock. Но, использование GlobalLock также нужно, оно используется для окон, размеры которых вы хотите изменить, или же изменить содержимое самого окна. При этом комбинированное использование разрешено. Эти методы не конфликтуют друг с другом. Рассмотрим пример:
Пример
function Lock() {
        Window.BeginUpdate();
        FrameSet.BeginUpdate(); /*FrameSet заблокирован*/
        Frame.BeginUpdate(); /*заблокировали Frame*/
        Window.EndUpdate(); /*на этом этапе окно обновит элементы управления, кроме Framе’a, FrameSet’а и их содержимого*/
        FrameSet.EndUpdate(); /*Обновится FrameSet, но Frame по прежнему заблокирован, а значит и его содержимое также не обновится*/
        Frame.EndUpdate(); /*Теперь Frame обновится*/
}

Также, в связи со спецификой GlobalLock – ведется счетчик блоков. Т.е. сколько раз был вызван BeginUpdate(), то столько же нужно вызвать и EndUpdate(). А вот при ControlLock такой счетчик отсутствут, достаточно один раз вызвать EndUpdate().
Итого:
  • GlobalLock. Используйте для окна, размеры которого меняются или меняется непосредственно его содержимое
  • ControlLock. Используйте для конкретного Frame’а/FrameGroup’ы и т.д. внутри которого будут происходить изменения

2. Button + Image
Button – один из самых используемых элементов управления. Без него практически не существует ни одного окна. Поэтому этот элемент управления просто обязан иметь какие-то дополнительные возможности для дизайна.
В Terrasoft 3.4.x добавлена возможность установить Image для Button’а. Причем, чтобы добавить изображение нужно только указать ImageList и указать имена для изображения (Normal, Hot, Pressed и Disabled). Также, изображение можно позиционировать с разных сторон от текста. Индивидуально хочется еще добавить, что, в отличие от Terrasoft 3.3.x, Button может быть любого размера (с выключенным AutoSize). Также, размеры можно ограничить минимальными значениями. Форматы изображения: *.ico, *.bmp, *.jpg, *.png (в принципе все, которые можно добавить в ImageList)
Button

3. Label. Выравнивание текста
При дизайне карточки или окна, иногда нужно сделать некий косметический момент с помощью Label. Но в то же время при его использовании испытывались некоторые трудности: как выровнять текст внутри Label’а? Эта проблема была решена в версии 3.4.1.14+. К свойствам Label была добавлена возможность позиционирования текста
Label

4. Настройка шрифтов
Наверное, каждый разработчик сталкивается с задачей настройки шрифтов: сделать Label большим шрифтом, изменить цвет фона контрола и т.д. До этого момента изменить шрифт и цвет можно было только во время выполнения (например, на OnPrepare). Для решения этого вопроса, начиная с версии Terrasoft 3.4.1.14+, были добавлены свойства, позволяющие в TSAdmin настроить шрифты и цвета. Что же можем делать?:

  1. Можем изменять шрифт и цвет Caption’а:
  2. CaptionFont

  3. Можем изменить шрифт и цвет текста
  4. TextFont

  5. Можем изменять цвет фона
  6. backgroundColor

Но, кроме элементов управления есть контролы, которые используются для группировки (FrameSet, Frame и FrameGroup). Для них также есть возможность настройки шрифтов
LayoutFont

Вот, собственно, часть того, что нового для разработки UI в Terrasoft 3.4.x я хотел рассказать.
Приятной разработки!

P.S. Напомню, что и в каких версия появилось (появится):

  • механизм BeginUpdate/EndUpdate работает во всех версиях 3.4.х;
  • возможность добавления изображения к Button – 3.4.0.x;
  • возможность позиционирования текста в Label – 3.4.1.14+;
  • возможность настройки шрифтов – 3.4.1.14+

Нравится

Поделиться

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

Спасибо, полезная информация.

А если в сервисах использовать позиционирование и шрифты и запустить на бинарниках 3.4.0 - будет валиться или просто игнорировать?

Если запустить на бинарниках 3.4.0, то будет просто игнорироваться

Показать все комментарии
Публикация

Хочу рассказать об использовании BeginUpdate/EndUpdate в версии 3.4.0. В предыдущих версиях Terrasoft 3.x использовался Lock для окна, который Microsoft реализовал так, что в один и тот же момент в системе может быть «залочено» только одно окно. Это, иногда, приводило к неприятным вещям. Начиная с версии 3.4.0 использование функций BeginUpdate/EndUpdate было разделено:
1. Окна (Window) используют стандартную логику Windows для глобального Lock’а окна
2. Frame, FrameSet, FrameGroup и остальные объекты, которые имеют функции BeginUpdate/EndUpdate, используют собственную функцию Lock’а, которая превосходит по производительности глобальный Lock
Таким образом, если у Вас что-либо меняется во Frame’е или FrameGroup’е, то достаточно «залочить» только их.

В чем же производительность? Как минимум в том, что глобальный Lock при UnLock’е обновляет все окно, независимо от того что в нем поменялось, а Lock для конкретного объекта будет обновлять только его содержимое. Плюс ко всему, если у Вас «залочено» окно с помощью глобального Lock’a, то при каком-либо другом Lock’е в системе, оно будет автоматически «разлочено», чего не произойдет, если «лочить» только нужные объекты

Нравится

Поделиться

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

Прикольно. Артем, а ведется ли счетчик этих локов? Просто помню в 3.3.2 было такое, что если ты делаешь несколько BeginUpdate() подряд, то столько же должен сделать и EndUpdate(), чтобы окно разлочить.

Счетчик не ведется, достаточно сделать один раз EndUpdate() и объект разлочится, но все же в скриптах должен быть порядок: BeginUpdate == EndUpdate :smile:

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

Добрый день! У меня следующая проблема. Мне нужно скриптом обновить поля "Вид деятельности" и "Отрасль" контрагента. Делаю Следуюшим образом:

function UpdateAccount(AccountID, ActivityName, FieldName) {
        var AccountDS = Services.GetNewItemByUSI('ds_Account');// или
               //GetSingleItemByCode('ds_Account', 'ContactIntegration');
        ApplyDatasetIDFilter(AccountDS, AccountID, true);
        AccountDS.Open();
        var NewActivityID = GetAccountActivityID(ActivityName);
        var NewFieldID = GetAccountFieldID(FieldName);
        AccountDS.Edit();
        if (AccountDS('ActivityID') != NewActivityID) {
                var Message = FormatStr(ConfirmActivityChangeMessage, AccountDS.ValAsStr('ActivityName'), ActivityName, AccountDS('Name'));
                if (ShowConfirmationDialog(Message) == wmrYes) {
                        AccountDS('ActivityID') = NewActivityID;
                }
        }
        if (AccountDS('FieldID') != NewFieldID) {
                var Message = FormatStr(ConfirmFieldChangeMessage, AccountDS.ValAsStr('FieldName'), FieldName, AccountDS('Name'));
                if (ShowConfirmationDialog(Message) == wmrYes) {
                        AccountDS('FieldID') = NewFieldID;
                }
        }
        AccountDS.Post();
        AccountDS.Close();
}

На строке  AccountDS.Post() У меня следующая ошибка:
Ошибка сохранения записи. Оригинальное сообщение об ошибке: The statement has been terminated.
Cannot insert the value NULL into column 'Name', table 'CRM.dbo.tbl_Account'; column does not allow nulls. UPDATE fails.

Посмотрел в профайлере, и, действительно, на сервер посылается запрос на обновление почему то всех полей таблици tbl_Account, а параметры заданы только двух полей, это FieldID и ActivityID.

В чем может быть проблема?

Нравится

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

Михаил, у Вас переменная AccountID содержит значение? После открытия датасет AccountDS содержит записи, или он пустой? Хорошо бы эти вещи проверять перед выполнением. Можете выложить тексты функций GetAccountActivityID и GetAccountFieldID?

Если AccountID пуст, то эта функция даже не выполняется (стоит проверка IsEmptyGUID(AccountID)). Датасет содержит одну запись, как и должно быть (проверял).
Вот тексты функций:

function GetAccountActivityID(ActivityName) {
	if (IsEmptyValue(ActivityName)) {
		return null;
	}
	var ActivityID = GetDatasetIDByFieldValue('ds_Activity', 'Name', ActivityName);
	if (IsEmptyGUID(ActivityID)) {
		var ActivityDS = GetSingleItemByCode('ds_Activity', 'ContactIntegration');
		ActivityDS.Append();
		ActivityID = Connector.GenGUID();
		ActivityDS('ID') = ActivityID;
		ActivityDS('Name') = ActivityName;
		ActivityDS.Post();
	}
	return ActivityID;
}
function GetAccountFieldID(FieldName) {
	if (IsEmptyValue(FieldName)) {
		return null;
	}
	var FieldID = GetDatasetIDByFieldValue('ds_Field', 'Name', FieldName);
	if (IsEmptyGUID(FieldID)) {
		var FieldDS = GetSingleItemByCode('ds_Field', 'ContactIntegration');
		FieldDS.Append();
		FieldID = Connector.GenGUID();
		FieldDS('ID') = FieldID;
		FieldDS('Name') = FieldName;
		FieldDS.Post();
	}
	return ActivityID;
}

Они выполняются нормально и возвращают значения.

Уточните, пожалуйста, версию конфигурации (с точностью до сборки).

P.S. Я так понимаю, в последней функции должно быть return FieldID?

Да, FieldID:smile:. Версия 3.3.0.72.

Михаил, протестировал на Вашей версии. Видимо, Вы вызываете данную функцию в Terrasoft Administrator. Попробуйте выполнять её по какому-то действию из клиентского приложения, должно работать корректно. Данная проблема связана с тем, что во время сохранения сервис датасета находится в режиме редактирования, и в этом состоянии ведёт себя не так, как в рабочем режиме.

Если Вам необходимо обновлять записи именно через Terrasoft Administrator, используйте сервис UpdateQuery.

Да, именно так, я тестирую в Terrasoft Administrator. Спасибо за помощь. Сейчас попробую.

Из клиента все работает. Еще раз спасибо за помощ.

Вот такие неудобные вещи порой приводят в ступор. :confused: И думаешь, ты ли дурак или программа.
Бились два дня пока не нашли этот пост. :smile:

Спасибо участникам в этом посте. :wink:

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

В данном блоге приведу список часто возникающих проблем и способов их решения.

1. Версия приложения и базы данных несовместимы.
---------------------------
Error
---------------------------
Невозможно установить соединение с конфигурацией 'NameDB'.
Версия приложения и базы данных несовместимы
---------------------------
OK
---------------------------

Данное сообщение Вы можете увидеть как при запуске Администратора Террасофт, так и при попытке применения пакета разницы.
Для решения этой проблемы необходимо убедиться, что используемые бинарные файлы соответствуют конфигурации Террасофт.
Для этого необходимо:

1. Найти запускаемый файл TSAdmin.exe, правой кнопкой мышки вызвать контекстное меню и выбрать «Свойства», перейти на закладку «Версия» и посмотреть на данные в строке «Версия о файле».

2. Запустить утилиту управления БД (Enterprise Manager, SQL Server Management Studio) выбрать ту конфигурацию Террасофт, на которую выполняется обновление и выполнить следующий запрос:

SELECT DatabaseMajorVersion, DatabaseMinorVersion, DatabaseReleaseVersion FROM tbl_databaseinfo

Результатом этого запроса будет номер версии продукта, релиза и конфигурации.
И уже в зависимости от результата необходимо использовать другие бинарные файлы или настроить соединение на другую конфигурацию.

Если сообщение возникло при попытке применения пакета разницы, тогда необходимо выполнить описанный выше пункт 2 для конфигурации, которая обновляется.

Случались прецеденты, когда пакет разницы применялся для конфигурации на которую выполняется обновление, а не на конфигурации, которая должна быть обновлена.

Например:
Вы выполняете обновление с версии 3.1.1.56 на версию 3.2.0.55.
В данном случае конфигурация, которая обновляется — 3.1.1.56, а конфигурации на которую выполняется обновление — 3.2.0.55.

Нравится

Поделиться

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

2. При применения пакета разницы возникает лог:
[color=red]Лицензия для модуля 'Custom' не найдена,
Лицензия для модуля 'Common' не найдена.
... ... ...[/color]

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

В полях [Пользователь] и [Пароль] (окна применения пакета) необходимо ввести sa (или имя пользователя являющимся стандартным системным администратором под Вашу СУБД) и его пароль.

Лицензию на этого пользователя заказывать не нужно.
После выполнение обновления Вы сможете подключиться к конфигурации под пользователем sa.

P.S. Проблема наблюдается при обновления конфигурации, начиная с версии 3.1.1. на MS SQL Server 2005 Express.

3. Если при пересохранении таблиц возникают следующие ошибки:

[color=red](E) Invalid object name 'dbo.tbl_TableName'. «Call Stack»
(E) Could not create constraint. See previous errors. Foreign key 'ForeignKeyName' references invalid table 'dbo.tbl_TableName'. «Call Stack»[/color]

[color=red](E) Error to save service: tbl_TableName'
Original message: При сохранении объекта 'Solutions\Details\Groups\tbl_TableName' в базу данных, возникла ошибка: Invalid object name 'dbo.tbl_TableName'[/color]

1. Удалить все внешние ключи;
Для этого в конфигурации необходимо создать следующий скрипт (и подключить scr_db):

// scr_DeleteAllForeignKeys
 
function Main() {
	Log.Write(1, 'Start.');
	var Service;
	var SelectQuery = Services.GetNewItemByUSI('sq_Service');
	ApplySelectQueryFilter(SelectQuery, 'ServiceTypeCode', 'Table', true);
	var Dataset = SelectQuery.Open();
	var i = 0;
	var Code;
	Dataset.GotoFirst();
	while (!Dataset.IsEOF) { 
		Code = Dataset.ValAsStr('Code'); 
		i++;               		
		try {
			Service = Services.GetSingleItemByUSI(Code);
			Service.Relations.Clear();
			Services.SaveItem(Service, 1);
			Log.Write(1, i + '. Service ' + Code + ' saved.');
		} catch(e) {
			Log.Write(2, i + '. Error to save service: ' + Code +
				' Original message: ' + e.message);
		} 
		System.ProcessMessages();
		Dataset.GotoNext();
	}
	Dataset.Close();
	Log.Write(1, 'Finish.');
}

2. Пересохранить таблицы;
3. Загрузить сервисы таблиц из коробочной конфигурации;
4. Пересохранить таблицы.

Таблицы не сохранившиеся автоматически необходимо сохранять вручную.

4. [color=red]The statement has been terminated. Cannot insert duplicate key row in object 'dbo.tbl_Service' with unique index 'UIServiceCode'[/color]
[color=red]Выполнение данной инструкции было прервано. Невозможно вставить повторяющуюся ключевую строку в объект "dbo.tbl_Service" с уникальным индексом "UIServiceCode"[/color]

Данная проблема может появиться при выполнении обновления с 3.3.0 на 3.3.1.

Дело в том, что при применении пакета разницы проверяется на уникальность как ID сервиса, так и его code.

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

Для решения этой проблемы необходимо выполнить скрипт "Generation.5.Repair IDs.sql" (во вложении прилагаю архив с этим скриптом).

В скрипте «Generation.5.Repair IDs.sql» необходимо внести следующие изменения:
-- [_33140_SD_Rus] заменить на название коробочной (пустой) БД версии 3.3.1.
-- [_33024_SD_Rus] заменить на название Вашей БД версии 3.3.0.

Результатом выполнения скрипта будет блок sql, который необходимо заменить в основном sql-файле (файл называется MSSQL.sql и находится в папке SQL).

Необходимо открыть его на изменение и в блоке: "UpdateServiceID" заменить имеющийся блок на сформированный.

Дополнительно хочу заметить, что если после выполнения «применителя» не будут открываться и изменяться сервисы: sq_* или wnd_*, то их необходимо заменить на сервисы из коробочной версии.

5. После выполнения обновления в некоторых разделах не отображаются статические и динамические группы.

Изначально рекомендуется убедиться, что группы перенеслись.
Для этого необходимо выбрать корневую группу и вызвав контекстное меню нажать на пункт "Отобразить группы всех пользователей".

Если группы присутствуют, тогда рекомендуется загрузить сервис "scr_Groups" из коробочной версии.

Если же групп нет, тогда необходимо тщательно анализировать лог-файл сформировавшийся в процессе выполнения обновления.

'The statement has been terminated. Cannot insert duplicate key row in object 'dbo.tbl_Service' with unique index 'UIServiceCode'

"Присяжнюк Владимир" написал:Generation.5.Repair IDs.sql

Если у пользователя на сервере стоит другая кодировка, отличная от кодировки баз Terrasoft
то скрипт будет терпеть неудачу, правильнее прописать в скрипте явно указав кодировку сравнения при создании временной таблицы а именно заменив строки:

create table #tmpCodes (
        Code nvarchar(250))
 
на
 
create table #tmpCodes (
        Code nvarchar(250) collate Cyrillic_General_CI_AS)

где Cyrillic_General_CI_AS - кодировка используемая в базе продуктов Terrasoft
так как временная таблица иначе создастся в кодировке сравнения по умолчанию заданной
на сервере.

Большое спасибо за решение третьей ошибки! Помогло!
Только сам по себе скрипт не отработал, добавила одну строчку:

Service.Relations.Clear();

в существующий скрипт пересохранения таблиц - scr_ResaveTables.
Таким образом пользовалась данным скриптом в двух вариантах:
- удаление всех внешних ключей;
- пересохранение таблиц.

По поводу ошибки №3:

т.е. решение в том, что нужно удалить Relations у всех таблиц? Так если они там заведены значит они там нужны, не так ли? Да и зачем трогать ВСЕ таблицы, когда нужно исправить только одну?

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

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

О нумерации версий и условиях обновления программного продукта Terrasoft.
Формат номера версии Terrasoft представлен в виде:

Например, в версии 3.2.0.14: номер продукта – 3, релиз – 2, конфигурация – 0, сборка – 14.

Бесплатное обновление Terrasoft возможно только в пределах сборки и/или конфигурации. То есть, если Вы используете версию 3.3.0.61 то обновление до 3.3.1.57 для Вас будет бесплатным, если же Вы используете версию 3.2.1.33, то обновление до 3.3.0.61 должно происходить в рамках Вашего пакета поддержки и быть оплачено / согласовано с Вашим менеджером.

Для выполнения обновления конфигурации необходимы:

Базовые навыки по работе с СУБД:
Понимание архитектуры системы управления базами данных, умение создать резервную копию, восстановить её, создание и выполнение простых запросов и выражений и т.д.
Большим плюсом будет опыт работы с выбранной Вами СУБД.

Уверенные навыки по работе с Террасофт:
Понимание архитектуры Террасофт, уверенная работа с Террасофт Администратор, хорошие навыки работы с сервисами системы, умение "читать" код JavaScipt и т.д.
Большим плюсом будет опыт программирование на языке JavaScipt.

Данные навыки можно приобрести, посетив курс наш трехдневный курс: «Создание конфигурации Terrasoft CRM».
Или же путем опытной эксплуатацией нашего продукта.

Для понимания общей схемы выполнения обновления рекомендуется изучить Руководство по выполнению обновления.
На данный момент это руководство можно загрузить, перейдя по ссылке:
http://www.terrasoft.com.ua/downloads/Update/TSCRM_UpG.rar
Пароль на архив: T$CrM_Up!G.

Что же до инструментария:
При выполнении обновления используются утилиты применения пакетов разницы (о них подробно описано в руководстве), а так же утилиты для выгрузки\загрузки сервисов: Extract Services, Merge Services. Этот инструментарий мы предоставляем и поддерживаем!
Так же мы используем утилиту Araxis Merge, навыки и понимание работы этой утилиты значительно облегчает выполнение обновления, но не являются обязательными.

Например:
Если изменялись отчеты, карточки, представления и т.д. такие изменения необходимо переносить вручную.

Соответственно, после внесения большого количества изменений обновление проще выполнять самостоятельно (имея вышеописанные навыки и инструментарий) или с помощью отдела разработки бизнес-решений.

В любом случае специалисты службы технической поддержки предоставляют качественные консультации по вопросу обновления конфигурации. А так же ведут базу знаний, в которой описаны основные проблемы и способы их решения.
Решения с этой базы знаний предоставляются клиенту максимально оперативно.

Нравится

Поделиться

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

Обновление приемлемо к базовой конфигурации, что (к большому сожалению) очень редко встречается. Всегда хотят что-то изменить, где-то в админке поковыряться... :biggrin:

А в общем: Спасибо!

--
www.it-sfera.com.ua

"Виталий Ковалишин aka samael" написал:Спасибо!

Спасибо, за спасибо! :wink:
На самом деле я не ожидал, что кто-то так оперативно ответит.
Записка то еще не закончена, случайно "Сохранить" нажал.

Народ не дремлет! :wink:
Поосторожней с кнопкой "Сохранить"!

--
www.it-sfera.com.ua

Еще при написании конфигурации желательно учитывать возможность обновления. Стараться делать как можно меньше изменений. Например лучше добавить поле, чем переименовывать существующее. В идеале изменения в сервисах должны где-то отмечаться. Новые функции в скриптах как-то отделять. Изменения в скриптах комментировать.

"Underscore a.k.a. _" написал:Еще при написании конфигурации желательно учитывать возможность обновления. Стараться делать как можно меньше изменений. Например лучше добавить поле, чем переименовывать существующее. В идеале изменения в сервисах должны где-то отмечаться. Новые функции в скриптах как-то отделять. Изменения в скриптах комментировать.

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

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