Добрый день. Подскажите пожалуйста, настроены в панели "задачи", и там формируется список который мне нужен для экспорта в эксель и отправки на почту. В ручную делать могу, а вот можно автоматизировать этот процесс? Дабы в указанное время автоматически отсылался такого вида отчет на заданную почту? Хочется автоматизировать процесс

Нравится

1 комментарий
Вопрос

Здравствуйте! Иногда при печати отчета выскакивает ошибка "Printer selected is not valid"

Нравится

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

Добрый день. Пытаемся записать BLOB при помощи ADO dataset на другой сервер, но выдаётся ошибка: 

0x8000ffff - TSObjectLibrary.ADODataset: Ошибка сохранения записи. Оригинальное сообщение об ошибке: Could not convert variant of type (Array Byte) into type (Integer)

Притом, происходит это именно при попытке записи BLOB'a, с записью других типов данных проблем нет.

Код:

var FileName = System.CreateObject('TSObjectLibrary.Value');
if (System.PromptForFileName(FileName, '*.*', '', "Выберите файл", '', false)) {
   var NameValues = FileName; 
}   
var Stream = new ActiveXObject('ADODB.Stream');
Stream.Type = 1;
Stream.Mode = 3;    //чтение+запись
Stream.Open(); 
Stream.Flush();
Stream.LoadFromFile(NameValues.Value); 
TestGUID = Connector.GenGUID();
var ds = Services.GetNewItemByUSI('adods_SupervisorChatFiles');
ds.Open();
ds.Append();
ds.DataFields('ID').Value = TestGUID;
Stream.Position  = 0;
ds.DataFields('FileData').LoadFromFile(NameValues.Value);
Stream.Close();
ds.Post();

 

Нравится

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

Для BLOB-ов реализация в ADO отличается от других типов. Не уверен, что в классе ADODataset это реализовано. Как альтернативный вариант, можно попробовать грузить в обычный датасет, связанный с таблицей в базе, а затем на уровне сервера заливать по ADO на другой.

Также с другим сервером можно работать без ADODataset, а просто связать его как Linked Server. Создать в базе Terrasoft соответствующую view с триггерами на вставку-изменение-удаление, а к ней привязать сервис tbl в конфигурации. И далее работать как с обычной таблицей.

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

Доброго времени суток, коллеги.

Система - TerrasoftCRM 3.3.2.245.

Имеется таблица со следующей структурой:

+------------+---------------+-------------+-------------+-------------+-------------+
| Контрагент | Ответственный | Показатель1 | Показатель2 | Показатель3 | Показатель4 |
+------------+---------------+-------------+-------------+-------------+-------------+

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

Вопрос такой: возможно ли использовать один компонент FilterBuilder для установки фильтров на два датасета сразу? 

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

Нравится

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

У FiltersBuilderControl есть свойство Mode с двумя возможными значениями. Может, то, что Вы хотите, можно получить, выставив fbmMultiDataset. Но как именно реализовать всю логику, нужно искать похожие примеры или экспериментировать. В стандартной конфигурации свойство Mode нигде не меняли, так что гарантии, что свойство сделано именно для этого, нет.

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

Здравствуйте.

Можно ли с помощью ADOCommand получить output параметры sql процедуры? Если можно, то как ?

Нравится

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

Марина, см. обсуждения тут и тут.

Здравствуйте Александр.

Я читала эти статьи. К сожалению, они мне не помогли. Видимо в версии 3.2.0.90 что-то не работает. 

Тем не менее, я решила проблему с помощью temporary table.

Еще раз спасибо за помощь!

Возможно, там ещё не всё было реализовано. Версия 3.2.0 очень старая.

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

Добрый день!

У нас версия Terrasoft CRM 3.4.0.87 куплены были 20 лицензий

Сегодня выскочила ошибка "error opening configuration. license for module "" not found"

Это только когда юзер запускает программу 

Когда заходишь через SYSDBA то все в порядке программа запускается.

Что это может быть?

Нравится

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

Вероятно, дело в правах  и пользователь не видит своего контакта или контрагента. Если у него лицензия конкурентная, то нужно видеть не только своего, но и всех остальных, у кого тоже конкурентные лицензии. Админ видит всё и поэтому у него всё в порядке.

Добрый вечер! Не у нас только именные лицензии! И кстати там в кавычках все время разные слова при каждом запуске!

А в террасофте вообще отсутствует техподдержка  или помощь в технических вопросах? Типа купили - спасибо! А дальше делайте что хотите! Просто замечательно!

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

Информация о пакетах поддержки и их стоимости приведена на странице.

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

Здравствуйте.



В скрипте вызывается sql процедура и один из параметров:

    CreateSPParameter(Parameters, 'ErrorDescription', sdtString, null);

    Parameters.ItemsByName('ErrorDescription').ParamType = 1;  //output

В sql процедуре этот параметр имеет тип: @ErrorDescription as nvarchar(1000) output

При вызове из скрипта выводит такую ошибку: The incoming tabular data stream (TDS) remote procedure call (RPC) protocol stream is incorrect. Parameter 11 (""): Data type 0xE7 has an invalid data length or metadata length

Как исправить эту ошибку ?

Нравится

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

См. обходные решения тут. Ещё попробуйте обновить Terrasoft до последней версии.

Создала ADOCommand с входящими и выходящими параметрами.

В Текст SQL написала exec dbo.pr_procName :param_1, :param_2, ... , :param_(n-1) output, :param_n output



В скрипте написала:

var ADOCommand = Services.GetNewItemByUSI('название ADOCommand');

ADOCommand.Parameters.ItemsByName('param_1').Value = значения_1;

ADOCommand.Parameters.ItemsByName('param_2').Value = значения_2;

...

ADOCommand.Parameters.ItemsByName('param_(n-1)').Value = 0; // default value

ADOCommand.Parameters.ItemsByName('param_n').Value = "";    // default value



ADOCommand.Execute();

После чего надо получить возвращаемое значение:

var Value1 = ADOCommand.Parameters.ItemsByName('param_(n-1)').Value;

var Value2 = ADOCommand.Parameters.ItemsByName('param_n').Value;

Значения не возвращаются, остаются значения по умолчанию.

Как сделать, чтобы получать значения процедуры ?

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

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

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

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

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

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

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

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

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

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

Подробности с картинками в исходном посте https://community.terrasoft.ru/node/25993

Заранее спасибо!

 

Нравится

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

Светлана, в первую очередь стоит попробовать обновить бинарные файлы программы до последней версии. Для 3.4.0 это 3.4.0.191. Возможно, там уже на уровне ядра поправили.

Если не поможет, лучше при помощи отладчика пошагово пройтись по этой функции InitializeCommunicationActionSmartTags и вызываемых из неё RefreshCommunicationActionSmartTag и ClearCommunicationActionSmartTag, после какой именно из строк возникает такое сообщение при открытии карточки. Сравнил с 3.4.1, разницы в исходниках функций нет.

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

 

 

 

Зверев Александр,

Спасибо за ответ! Чистка кэша помогает до след.раза, когда после открытия карточки с email не откроют карточку без него. Ошибка абсолютно у всех. Перекопала все связанные с этим функции, при открытии карточки должны очищаться предыдущие настройки отображения значков из кэша, но система почему то их не находит и поэтому не может очистить. Подскажите пожалуйста где взять бинарники? Полная версия у нас 3.4.0.38

Это довольно старяя сборка, лучше обновить.

Зверев Александр,

А где можно взять более новую сборку? И вообще есть ли возможность обновится до 3.4.1? В системе много чего было переделано.. 

 

Из Вашего сообщения выше "пошагово пройтись по этой функции InitializeCommunicationActionSmartTags и вызываемых из неё RefreshCommunicationActionSmartTag и ClearCommunicationActionSmartTag" - там все нормально проходит. Сама ошибка вылетает совсем в другом месте при работе с кэшем.. Долго искала проблемную функцию. Тесты подтвердили.

 

Светлана, ссылку на 3.4.0.191 выслал вчера в личку.

Для обновления на 3.4.1 нужно, как минимум, приобрести новые лицензии.

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

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

 

Зверев Александр,

Здравствуйте! Протестировала, все хорошо, спасибо! Пока без нареканий. Большим плюсом стало то, что в данной версии ТС не вылетает из-за ошибок по час.поясам (час.пояс уже существует...). На почту поддержки отправила запрос по поводу установочника данной версии

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

Здравствуйте! Версия террасофт 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 комментарий
Вопрос

Здравствуйте.

В деталях документа "Заявка на кредит физ лица" есть деталь "Описание". Там есть одно единственное поле типа: RichDataControl.

Каждый раз, при попытке писать в поле какой-то текст, выдается сообщение: Вы хотите добавить информацию ?

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

При нажатии “Yes”, пользователь пишет свой текст.

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

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

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

, ни с помощью клавиатурных кнопок "delete" или "Ctrl" + "X"(cut) ?

Спасибо.

Нравится

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

Сделать новую деталь, состоящую из многих записей с полями Описание.

Здравствуйте Владимир.

Если я Вас правильно поняла, то каждая запись в новой детали будет отдельное окно с полем Описание? Или деталь со многими описаниями?

 

Меня больше интересует, возможно ли реализовать в одном Описании ?

Сомнительно, что такое выборочное редактирование можно сделать без правки ядра. Можно попробовать либо отображать каждую запись отдельно, либо хранить историю всех версий, как в SVN.

Здравствуйте Александр. Спасибо.

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