Есть простая форма, на ней Datagrid. Datalink ссылается на MemoryDataset. При добавлении записи в MemoryDataset, в Datagrid добавляется запись, но не отображаются данные.

function ButtonOnClick(Control) {
        dsInvoice = Services.GetNewItemByUSI('ds_Invoice');
        ApplyDatasetFilter(dsInvoice, 'CustomerID', '{16409E87-FC22-464D-B73C-F765C206E70D}', true);
        var SelectDataWindow = Services.GetNewItemByUSI('wnd_SelectData');
        SetAttribute(SelectDataWindow, 'Dataset', dsInvoice);
        SetAttribute(SelectDataWindow, 'DisplayFieldNames', 'InvoiceNumber;InvoiceDate');
        SetAttribute(SelectDataWindow, 'SearchFieldNames', 'InvoiceNumber;InvoiceDate');
        SetAttribute(SelectDataWindow, 'KeyFieldName', 'ID');
        SetAttribute(SelectDataWindow, 'SearchFieldName', 'InvoiceNumber');
        SetAttribute(SelectDataWindow, 'NotifyObject', Self);
        SetAttribute(SelectDataWindow, 'IsReadOnly', true);
        SelectDataWindow.Tag = 'SelectedInvoice';
        SelectDataWindow.Prepare();
        SelectDataWindow.Show();
}

function wnd_WindowOnNotify(ScriptableService, Sender, Message, Data) {
        if (Sender.Tag == 'SelectedInvoice') {
                InvoiceID = Sender.GetSearchIDValue;
        //      DatasetLink.Dataset.DisableEvents();
                DatasetLink.Dataset.Edit(); // Если здесь Append, то добавляется две строки, но не видно данные.
                DatasetLink.Dataset('ID') = InvoiceID;
                DatasetLink.Dataset('Name') = GetDatasetFieldValueByID('ds_Invoice', InvoiceID, 'InvoiceNumber');
                DatasetLink.Dataset('Data') = GetDatasetFieldValueByID('ds_Invoice', InvoiceID, 'InvoiceDate');
                DatasetLink.Dataset.Post();
                //DatasetLink.Dataset.EnableEvents();
        }
}

function Main() {
        wnd = Services.GetNewItemByUSI('wnd_Window');
        wnd.Prepare();
        wnd.Show();
}

function wnd_WindowOnPrepare(Window) {
        DatasetLink.Dataset.Open();
}

Нравится

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

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

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

Добрый день!

Мы используем СРМ версии 3.3.1.163. Есть ли у нее возможность интеграции с 1С 8.3?

Спасибо!
Хайдар

Нравится

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

В Terrasoft 3.3.2 поддерживается максимальная версия 1С 8.2.
Базовая версия интеграции не поддерживает подключение с 1C 8.3. Если такая интеграция необходима клиенту, ее нужно создать вручную, написать всю логику работы в сервисах Terrasoft.

А версия 3.3.1 ещё старше. Соответственно, наличие поддержки 8.3 без доработок маловероятно.

Добрый день!

Я обновил до 3.3.4.313 с вашей помощью (спасибо большое)

Могли бы вы помочь нам написат образ интеграции с 1С 8.3 или дать инструкцию?

Хайдар, добрый день.
Версии Terrasoft 3.3.4 не существует. Бывает 3.3.2 и 3.4.0.
Готовой интеграции с 1С 8.3 также нет. Наверняка, в Terrasoft или у кого-то из их партнёров можно заказать её разработку.

Доброе утро, Александр

Прошу прощения за опечатку, у нас уже 3.3.2.313

Тем более, такой интеграции нет.

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

Добрый день.
При запуске клиента Terrasoft XRM 3.4.0.144 выдает ошибку:
Ошибка открытия конфигурации. 'Сообщение об ошибке: Разрешение отклонено'
USI скрипта: Common\Dictionaries\Calendars\Utils\scr_Calendar
Строка: 9
Колонка: 1

Номер: 70

Текст:
Источник: Ошибка выполнения Microsoft JScript'

На других машинах работает, везде администратор, один и тот же дистрибутив.

Нравится

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

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

Попробуйте очистить кеш, профиль, перерегистрировать библиотеки на этом ПК.

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

Если дело не в пользователе, то что-то не так с компьютером или Windows.

"Зверев Александр" написал:

Если дело не в пользователе, то что-то не так с компьютером или Windows.


Ну это понятно, пробовал переустанавливать java, но тоже ничего не поменялось. Может кто ещё что посоветует.

В scr_Calendar в указанном месте обращение к обёртке системной функции из Windows, возвращающей день недели.

	var FirstDayOfWeek = System.FirstDayOfWeek;

Видимо, на этом компьютере что-то не то с датами, календарями или их настройками.

"Зверев Александр" написал:

В scr_Calendar в указанном месте обращение к обёртке системной функции из Windows, возвращающей день недели.

        var FirstDayOfWeek = System.FirstDayOfWeek;Видимо, на этом компьютере что-то не то с датами, календарями или их настройками.


Сбросил календарь, даты, проверил все, часовые пояса, и языки. все норм. Проверил настройки календаря outlook, все норм.

То есть проблема была в региональных нстройках? Если снова возникнет на каком-то другом компьютере, то выставьте там такие же параметры, особенно значение iFirstDayOfWeek в реестре Windows (HKEY_CURRENT_USER\Control Panel\International).

"Зверев Александр" написал:

То есть проблема была в региональных нстройках? Если снова возникнет на каком-то другом компьютере, то выставьте там такие же параметры, особенно значение iFirstDayOfWeek в реестре Windows (HKEY_CURRENT_USER\Control Panel\International).


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

«Разрешение отклонено» — это ошибка в работе Windows Script Host, а не Terrasoft.
Не хватает прав доступа на какую-то папку или что-то в нём неверно настроено, или не та версия.

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

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

При открытии нового окна путем нажатия Add в гриде, некоторые поля открывшегося окна должны получить значения по умолчанию.

Где правильно это реализовать? В каком скрипте: окна, датасета или грида.

Спасибо.

Нравится

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

Реализовала в обработчике события OnDatasetAfterAppend (на рисунке pic1)

function dlDataOnDatasetAfterAppend(Dataset)
{
например:
Dataset.Values('CreatedByID') = Connector.CurrentUser.ContactID;

но это работает, если CreatedByID существует в Dataset, а если на окне есть поле из другого датасета?

как же ссылатся на это поле, чтобы дать значение ?

edtПоле.Value = значение
Microsoft JScript runtime error: Object doesn't support this property or method
Self.ComponentsByName('edtПоле').Value = значение
Microsoft JScript runtime error: Object doesn't support this property or method

Спасибо.

Не совсем понял.
Объясните подробнее, что именно у Вас в окне, какие поля и датасеты, что Вы хотите сделать.

Задача стоит такая:
Надо, чтобы при открытии окна, некоторые поля окна получили значения.

Данное окно состоит из 3-х датасетов: dltata(это основной датасет), dlDataContactCredit и dlContact.(pic2)
Поле CreatedByID-из датасета dltata(pic3), а поле ContactCreditNumber-из датасета dlDataContactCredit(pic4).

в событии function dlDataOnDatasetAfterAppend(Dataset) // Dataset = dltata (посмотрела по дебаггеру)

данное присвоение
Dataset.Values('CreatedByID') = Connector.CurrentUser.ContactID;
работает, но
Dataset.Values('ContactCreditNumber') = "123";
не работает, выдает ошибку 'DataField ContactCreditNumber' is not assigned, так как в dltata этого поля нет. Оно в dlDataContactCredit.

Как задать значение полю ContactCreditNumber ?

Спасибо.

Вы что-то очень странное делаете.
Основной датасет dlData — при нажатии «ОК» в соответствующей таблице в базе создаётся новая запись и в ней эти поля заполнены значениями по умолчанию, если пользователь на карточке вручную не изменил. А зачем другие датасеты? Там должна добавляться новая запись или просто будет выбираться значение из списка?

Может, прямо обращаться к полям dlDataContactCredit.Dataset?

Другие датасеты только для чтения.
Те поля, которые не из основного датасета(dlData) не будут менятся(они readOnly). И чтобы получить значения из других датасетов, я использовала

function RefreshDetailDataByParentID(ParentID, ChildDataset, ChildFilterName, DoNotDisableAllFilters) из scr_DB
Эта функция делает следующее:
ApplyDatasetFilter(ChildDataset, ChildFilterName, ParentID, true);
ChildDataset.Open(); здесь работает запрос, со всеми полями
которые есть в ChildDataset и поля на окне автомотически заполняются.

Для dlContact этот подход уместен, так как на окне есть много полей из этого датасета.

Но для dlDataContactCredit, на окне лишь одно поле из этого датасета, да и значение которое поле должно получить, в конкретной задаче известно, поэтому не имеет смысла запрашивать данные.

Поэтому я подумала, будет быстрее напрямую дать значение, но не получается.
var ContactCreditDataset = Self.ComponentsByName('dlDataContactCredit').Dataset;
ContactCreditDataset.Values('XXX') = Self.Attributes('NotifyObject').Attributes.Values('Attribute');

Ошибка выполнения метода 'dlDataOnDatasetAfterAppend'. Field 'XXX' not found.

Во всяком случае, с помощью RefreshDetailDataByParentID вопрос решается.

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

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

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

  1. 1. Создать свою функцию в скрипте окна редактирования (scr_AccountEdit):
    function SetDefValues() {
    	var IsAppendRec = (dlData.Dataset.State == dstInsert);
    	AccountEdit.IsAppendRec = IsAppendRec;
    	if (!IsAppendRec) {
    		return;
    	}
    	edtCode.DataField.Value = '456';
    } 

    После чего функцию SetDefValues вызвать вызвать из события окна wnd_AccountEditOnPrepare:

    function wnd_AccountEditOnPrepare(Window) {
    	Initialize();
       	wnd_BaseDBEditOnPrepare(Window);
     
    	SetDefValues();	
    }
  2. 2. Устанавливать значения по умолчанию для каждого источника данных (датасет) на событии OnDatasetAfterAppend:
    function dlDataOnDatasetAfterAppend(Dataset) {
    	Dataset('EmployeesNumber') = '987';
    	Dataset.DataFields('Name').Value = '654';
    	Dataset.DataFields('OfficialAccountName').ValAsStr = '321';
    	Dataset.ValAsStr('Address') = 'Address';
    }

    Данная реализация сработает только при добавлении новой записи при помощи окна редактирования.

  3. 3. Устанавливать значения по умолчанию для глобального (пример, ds_Account) источника данных (датасет) на событии OnDatasetAfterAppend:
    function SelfOnDatasetAfterAppend(Dataset) {
    	Dataset('EmployeesNumber') = '987';
    	Dataset.DataFields('Name').Value = '654';
    	Dataset.DataFields('OfficialAccountName').ValAsStr = '321';
    	Dataset.ValAsStr('Address') = 'Address';
    }

    Данный код будет всегда срабатывать, когда будет добавляться новая запись вне зависимости от метода добавления, будет ли это окно редактирования реестра или при помощи кода.

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

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

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

Есть окно WindowGrid(в деталях WorkSpace-а), которое в скрипте WorkSpace-а получает атрибут 'ID', со значением BaseWorkspace.GridDataset.Values('ID')

SetAttribute(WindowGrid, 'ID', BaseWorkspace.GridDataset.Values('ID'));

Из детали, при добавлении(Add), редактировании(Edit) и копировании(Copy) открывается другое окно WindowEdit, и срабатывает

function wnd_WindowEditOnPrepare(Window)
{
ApplyDatasetFilter(Dataset, 'ID', Value, true);
которое фильтрует и показывает некоторые значения на WindowEdit в зависимости от значения атрибута.

}

Вопрос: как вместо Value получить значение атрибута окно WindowGrid?

Спасибо!

Нравится

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

По идее, из открывшейся карточки окно, которое её открыло, доступно как:

var NotifyObject = Self.Attributes('NotifyObject');

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

Спасибо Александр. Работает!

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

Здравствуйте.
Подскажите пожалуйста в чем может быть проблема или как выявить.
В TS вызывается хранимка (в хранимка используеться транзакция, возвращаеться 0 если все хорошо, или текст ошибки), хранимка выполняеться нормально, если скажем она делаеться меньше 5 минут, TS получает ответ и идет дальше, но если делаеться больше 5 минут, TS просто висит (ждали больше часа).
Во время зависания проверил sp_who2, последняя активность соединения была в момент запуска ХП, сама ХП завершает работу успешно. В профайлере активности пользователя активности от пользователя тоже нет.
Также такое зависание бывает просто при переходе из раздела в раздел.
Пользователи работаю с TS через удаленку, т.е. TS запускается на компьютере где развернута БД.

Нравится

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

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

Это проводка документа определенного документа, запускается по кнопке когда необходимо клиенту.
Я правильно понимаю, что единственный вариант это уменьшить время выполнения процедуры?

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

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

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

Подскажите, как можно осуществить проверку наличия таблиц и их колонок БД по именам, используя EntitySchemaManager в веб-сервисе? Чтобы проверить перед внесением изменений в БД.

Нравится

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

В Terrasoft 3.Х нет механизма EntitySchemaManager. Там всё устроено иначе.

"Зверев Александр" написал:

В Terrasoft 3.Х нет механизма EntitySchemaManager. Там всё устроено иначе.


Понял. Спасибо.

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

У нас реализована интеграция 1С и Террасофт. После переезда на другой сервер столкнулась с проблемой, "Невозможно создание объекта сервером программирования объектов".
Новая версия ОС - Windows Server 2012, раньше был Windows Server 2008.
Версия sql не менялась, 2008 R2.
Кроме этого изменилась организация работы: sql находися на одном сервере, а 1С и соответствено запуск интеграции под клиентским приложением - на другом.
Раньше все было на одном сервере.
Как починить интеграцию?

Нравится

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

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

Возможно я плохо объяснила, у нас интеграция средствами Террасофт. Эта же интеграция в коробочной версии 3.4 уже прописана.

См. ответ тут.

1. На том компьютере, с которого Вы пробуете запустить утилиту интеграции, не установлена 1С либо COM-объекты 1С

Я сразу указала , что запускают утилиту там же где стоит 1с, я знаю про эту особенность утилиты.
Как могут не быть установлены СОМ объекты, если 1с стоит и работает? Какие именно сом-объекты?

2. Вами не настроено соответствующим образом подключение к базе данных 1С.

Мною настроено соединение, так как написано в инструкции , и так как оно раньше работало ( конечно,с учетом нового пути к базе 1с)

Возможно все-таки проблемы в отсутствии какой-то зарегистрированной библиотеки в Windows 2012?

"Тихенко Виктория" написал:Возможно все-таки проблемы в отсутствии какой-то зарегистрированной библиотеки в Windows 2012?

Такое тоже может быть, особенно, если проблема наблюдается только на конкретном компьютере. Для начала можно перерегистрировать библиотеки Terrasoft (проще всего переименовать папку с Terrasoft и запустить TSClient, а потом закрыть и переименовать обратно).

Вообще -то я имела ввиду библиотеки Windows, но террасофт на всякий случай перерегистрировала тоже. Не помогло.

Значит, действительно что-то не то в Windows или 1С.

Может быть есть какие-то идеи что именно не так? Библиотеку зарегистрировать не сложно , знать бы какую

Я бы начал с регистрации 1С-овской comcntr.dll в папке bin установленной 1с на той машине, где стартует интеграция.
А вообще неплохо бы посмотреть в каком скрипте возникает ошибка и какой объект пытается кто создать.
ps здесь читали /это в тему поиска проблемного скрипта?

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

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

Нужно вытащить из базы 4 таблицы по 8-10 полей, прав на каждую у пользователя нет, это нужно сделать для отчета(fast report). какие у кого идеи есть?

Нравится

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

Классическая задача :)
Создайте view на сервере с выборкой нужных данных. На view право чтения для public. В terrasoft соответствующий по структуре и названию объект таблица, только не сохраняйте его в базу данных. Далее стандартно, sq_, ds_

Огромное спасибо, выручили!

"Александр Кудряшов" написал:оздайте view на сервере с выборкой нужных данных.

это можно применить к разделу звонков от Webitel?

"Радчук Виталий Владимирович" написал:это можно применить к разделу звонков от Webitel?

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

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

Здравствуйте!
Подскажите, как в Террасофте 3.5.1 реализовать следующий java script:

var https = require('https');
var fs = require('fs');

var file = fs.createWriteStream("file.jpg");
var request = https.get("http://test/test.jpg", function(response) {
  response.pipe(file);
});

Т.е. нужно по https ссылке сохранить файл в определенную директорию.
Как это можно сделать в Террасофт?

Нравится

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

Что-то похожее делают тут. Там файл из Интернета сохраняют во временную папку, но код функции можно переделать под нужное место. Не уверен только по поводу HTTPS.

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