Lock request time out period exceeded
закрытие расходных
превышено время ожидания запроса на блокировку
склад
Технические вопросы
Разработка

Добрый день, уважаемое сообщество.
Проявилась такая проблема в этом году. Возможно связано с большим количеством записей в базе данных. Но не факт.
Описание:
Terrasoft XRM 3.3.2.304.
Существует несколько расходных накладных.
Скрипт вызывает стандартную функцию ConductSelectedOfferingMovements:
В Data.OfferingMovementIDs передается массив ID складских документов.

                Data.IsRecalcPrimeCost = false;
                Data.IsConduct = true;
                Data.OfferingMovementStatus = omsCompleted;
                Data.IsRecalcOfferingPrices = false;
                Data.IsUpdateShipmentState = false;
                Data.IsUpdatePurchaseState = false;
                Data.IsReserveOfferingsFromOrders=false;
                Data.IsAddSupplierInOffering = false;
                var Result = ConductSelectedOfferingMovements(Data);

Все выполняется правильно, но пока идет выполнение этой функции на одном из рабочих мест, у других пользователей, работающих с разделами Склад (деталь Продукты)
или Продукты(деталь Складские документы), появляется ошибка "Ошибка открытия источника данных ds_MovementInOffering. Превышено время ожидания запроса на блокировку".
Изменений в функцию и хранимые процедуры не вносили.
Ошибка повторяется на 100 процентов.
Во время выполнения хранимой процедуры ошибка открытия может быть и для ds_Account и других
источников данных.
Сталкивался ли кто-нибудь с такой проблемой и в чем ее причина?

Нравится

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

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

Максим, добрый день.
Мы тут примерно в эту сторону и копаем. Похоже ХП блокирует tbl_MovementInOM. Мы убрали подзапросы в разделах и деталях, которые ее использовали. Но в том же ds_Offering поле Remain это подзапрос к этой таблице. Отсюда и ошибки.
По индексации: я правильно понимаю, что нужно добиваться того, чтобы ХП быстрее обрабатывала блокируемую таблицу?

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

Возможно, эти статьи будут полезными:
http://technet.microsoft.com/ru-ru/library/ms189081.aspx
http://samag.ru/archive/article/797

Во время выполнения ХП закрытия документа SQL сервер грузит процессор на 100%. Это нормально?

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

Проверял на тестовой базе.
Всего в этой базе 87 складских документов, т.е. нет больших данных на мой взгляд. Выполняется закрытие практически мгновенно. Но делаем закрытие в цикле нескольких расходных, и на это время загрузка процессора 100%.
И еще один момент. К моей радости он пока проявляется только на тестовом сервере. Любая конфигурация от самых старых до текущей копии рабочей базы. Закрытие документа с недостаточным количеством продукта в остатках(т.е. остаток 100, а списываю 101) приводит не к сообщению о недостаточном количестве, а полностью вешает клиента. Процессор на сервере загружен на 100%, пока аварийно не завершу клиента. Часами я конечно не ждал результата. Думаю, что-то с SQL сервером (2008). Будем разбираться.
С другой стороны анализируем ХП, чтобы понять в каком месте мы зависаем.

Новые данные. Виснет если по продукту указан метод списания Средневзвешенный и есть несколько приходов по ним.
зацикливается в tsp_OfferingDistribute
не может закончится цикл:

while (@ARemainQuantity >= @AUnitDivision)
begin
	OPEN Consignment_Cursor
	FETCH NEXT FROM Consignment_Cursor INTO @ConsignmentID, @ConsignmentQuantity
	WHILE @@FETCH_STATUS = 0
	BEGIN
		if (@ARemainQuantity < @AUnitDivision) 
			break
		update #ListQuantity 
		set Quantity=Quantity + @AUnitDivision 
		where ConsignmentID=@ConsignmentID
			and Quantity < @ConsignmentQuantity
		if (@@ROWCOUNT > 0) 
			set @ARemainQuantity = @ARemainQuantity - @AUnitDivision
		FETCH NEXT FROM Consignment_Cursor INTO @ConsignmentID, @ConsignmentQuantity
	END
	CLOSE Consignment_Cursor
end

Похоже выяснили причину зависания.
Пример:
Два прихода по продукту с количествами 1000 и 100.
Проводим.
Расходная с количеством 3500.
Зависание.
Дело в том что 3500 делится на части пропорционально остаткам по партиям.
Т.е получаем 3181,818 и 318,1818. И если правильно округлить, то 3182 и 318, что в сумме даст 3500.

Причина в ХП tsp_RoughOfferingDistribute

DECLARE Consignment_Cursor CURSOR FOR
....
 
WHILE @@FETCH_STATUS = 0
BEGIN
	....
	set @PartQuantity = floor(@PartQuantity / @AUnitDivision) * @AUnitDivision;
	insert into #ListQuantity 
		(ConsignmentID, Quantity, BasicPrice, ConsignmentQuantity) 
	values 
		(@ConsignmentID, @PartQuantity, @BasicPrice, @ConsignmentQuantity)
	set @RemainQuantity = @RemainQuantity - @PartQuantity;
	FETCH NEXT FROM Consignment_Cursor INTO @ConsignmentQuantity, @ConsignmentID, @BasicPrice
 
END
CLOSE Consignment_Cursor
DEALLOCATE Consignment_Cursor

Таким образом floor отбрасывает дробную часть и мы получаем в ListQuantity 3181, 318 и 1. А вот эта единичка и зацикливает tsp_OfferingDistribute, т.к. значений три, а партий только две.

меняем floor на round и все работает

set @PartQuantity = round((@PartQuantity / @AUnitDivision),0) * @AUnitDivision;

В любом случае по методу Средневзвешенный списание происходит неверно и возникают неверные остатки. Поэтому видимо сменим метод.

Здравствуйте, Виктор!
Большое спасибо за активное участие. Учтем Ваши замечания

Показать все комментарии
Word
Экспортировать
Отчёты
Разработка

Можно ли cохранить отчет в doc., docx формате в TS PSF 3.3.3.171?

Нравится

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

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

Здравствуйте, Виталий!

Если Вы имеете в виду отчеты формата Fast Report, то при их выгрузке, данные можно экспортировать только в следующие форматы:

В общем в Word можно экспортировать в других версиях Terrasoft???

Виталий! Если отчеты формата Fast Report, то сразу экспортировать в doc или docx не получится. Это применимо и к более новым версиям Terrasoft. Но можно экспортировать в RTF формат, после чего открыть файл с помощью MS Word.

Показать все комментарии
дзен.
связи
Цепь вызовов
Скрипты
Разработка

Y de nuevo Hola!

Вопрос возможно банальный. И требует понимание такого явления, как TerraSoft.
Есть карточка редактирования, на ней есть поле - Источник продаж.
"Его нужно поменять у имеющейся записи". После выбора нужного источника (двойной клик, либо кнопка OK) выбрасывается исключение:
Класс исключения EOleExeption
Сообщение об ошибке: Неопознанная ошибка
После повторного нажатия окно закрывается, но результат нулевый, то что должно произойти по логике не происходит.

Нравится

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

Откуда происходит вызов окна выбора источника? Где это прописывается в окне редактирования карточки?

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

F5 в скрипте, верно?
Если да, то в коде прописываю, но после запуска клиента, и вызова соответствующего кода, ничего не происходит.
Буду рад за маленькую инструкцию и по этому вопросу.

C Debagger'ом разобрался. Спасибо.
На поверхность всплыл факт, не отработки метода Dataset.Append() ( Вечная проблема =) ).
Причина пока не ясна, Dataset, настроен соответствующим образом http://www.community.terrasoft.ru/forum/topic/10595, как описывал Дмитрий.
Первое что пришло в голову - это пересоздать Dataset =)

Может не стоит галка "генерировать запрос на вставку"?

Галки все стоят (кроме "Справочник"). Так же указано "Первичное поле для отображения", и ключевое поле. Вроде бы ничего не забыл...
Код:

try {				
    if (Dataset('StatusID') == osDone || Dataset('StatusID') == osCanceled || Dataset('StatusID') == osExport) {
        var ds = Services.GetNewItemByUSI('ds_SourcesWereChanged');
        ds.Open();
        ds.Append();			
        ds('OrderID') = Dataset('ID');
        ds('NumberOrder') = Dataset('NumberOrder');
        ds('OldSourceID') = Dataset('SourceID');
        ds('SourceID') = DataField.Value;
        ds.Post();
        ds.Close();
        }
} catch (e) {
        MessageBox(e);
}		

При мониторинге через debugger после ds.Append(); ловит [object Error].

Если нужен Append() - Open() делать не нужно. Хотя это вряд ли причина проблемы - но все же избавитесь от "лишнего" SELECT в БД.

"Олейник Дмитрий" написал:

Если нужен Append() - Open() делать не нужно. Хотя это вряд ли причина проблемы - но все же избавитесь от "лишнего" SELECT в БД.


Уяснил.
Проблему нашёл. Благодарю за поддержку!
Причина - неопытные кривые руки, не дают сделать по нормальному связку tbl + sq + ds =(
Прогнал через TerraSoft Administrator без отслеживания исключений, интерпретатор подсказал ошибку.
Думаю всё должно быть ОК. Сейчас буду проверять таблицу, что записал туда.
Дмитрий - спасибо за помощь!

Не за что. Обращайтесь.

Показать все комментарии
Исключения
ошибки
Скрипты
Разработка

Salud, amigos!

Версия: 3.3.2.222
Класс исключения: EOleException
Сообщение об ошибке: OLE error 80020102
Прошу объяснить мне не образованному человеку причину этой ошибки
Возникает на коде:

...
Dataset('SomeName') = 0;    // (*)
...

Поле 'SomeName' - типа Boolean. Исключение выбрасывается не всегда, а только на некоторых записях.
При том перед присвоением:
Вывод -
MessageBox(Dataset.ValAsStr('SomeName'));

Отрабатывает корректно, но повторюсь иногда - после строчки кода (*) выбрасывает исключение [Object Error].

Буду очень признателен за руку помощи.

Нравится

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

Чтобы увидеть настоящую причину ошибки, надо установить отладчик.

Исключение выбрасывает строка *.

function RecalcPartableDiscounts(){  
    if (Self.State == dstEdit){               
        var UpdateQuery = GetSingleItemByCode('uq_SetOrderPartableParams');
        var Parameters = UpdateQuery.Parameters;
        Parameters('ID').Value = Self('ID');    
        Parameters('HasClientCard').Value = Self('HasClientCard');
        Parameters('SourceID').Value = Self('SourceID');
        Parameters('IsComplaintDiscount').Value = Self('IsComplaintDiscount');
        UpdateQuery.Execute(); (*)
        RecalcOrderPartableDiscounts(Self('ID'));
        CalcOrderLotsAmount(Self);
	}
}

А как выглядит uq_SetOrderPartableParams? И что именно пишет при возникновении исключения?

Исключение в принципе, всё то же, что и в названии темы. После установки отладчика, проследил стек вызовов, и дошёл до этого метода.

Егор, предоставьте, пожалуйста, более подробную информацию по uq_SetOrderPartableParams

Что выполняется в пользовательском запросе?

Напрашивается вопрос.
С каким Dataset взаимодействует UpdateQuery, и как можно определить тот самый Dataset? (По логике все Наборы данных которые могут иметь отношение к Запросу на обновление (в моём случае) отмечены CheckBox'ом Генерировать запрос на обновление.)
Вывод Assigned(Dataset.UpdateQuery.Caption) выдаёт false.
Прошу пояснить механизм работы конвейера, и прядок и принципы обработки данных.
С уважением
Ваш коллега.

"Резвов Роман" написал:Егор, предоставьте, пожалуйста, более подробную информацию по uq_SetOrderPartableParams

Что именно необходимо?
Я человек новый, пока всех тонкостей и особенностей сервисов не знаю, буду благодарен за более исчерпывающую информацию.

Егор, доброго времени суток.

UQ - это сервис который отсылает UPDATE запрос к базе, без всяких там датасетов и так далее.
По поводу ошибки, значение параметров нужно устанавливать так:

SetParameterValue(Parameters, 'ID', ID);

а

GetSingleItemByCode('uq_SetOrderPartableParams');

лучше заменить на

Services.GetNewItemByUSI('uq_SetOrderPartableParams');

И проверьте чтобы совпадал тип параметра с типом колонки в БД.

Удачи!

Дмитрий, и все участники обсуждения, выражаю огромную благодарность. Вы мне очень помогли. Проблема выявлена.
И заключалась в неверных типах значений сервиса UpdateQuery, которые не совпадали с типами в таблице БД.
Буду дальше выравнивать ситуацию после своих предшественников, и совершенствовать своё понимание системы, ещё раз всем огромное спасибо.
P.S.

"Олейник Дмитрий" написал:GetSingleItemByCode('uq_SetOrderPartableParams');
лучше заменить на

Services.GetNewItemByUSI('uq_SetOrderPartableParams');


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

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

Учту на будущее, благодарю!

С уважением,
Ваш коллега

Показать все комментарии
warhing
журнал
Технические вопросы
Разработка

Добрый день! Столкнулись со следующей проблемой:
Создаём задачу и устанавливаем галочку "Напоминания ответственному". После этого нажимаем отравить сообщения по задаче, и сразу отображается журнал сообщение Террасофт, с таким текстом:"[14.06.04 14.31.37.574] (W) Не удается сохранить вложение. Не удается вставить вложение; нет источника данных.".... дебаггером не смог отловить откуда это сообщение и почему оно тянется..
Подскажите может кто знает решение данной проблемы?? Сообщения уходят отлично всем кому надо, но постоянно отображается журнал, что не очень комфортно для пользователя
Заранее спасибо!

Нравится

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

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

Здравствуйте, Николай!
Не могли бы Вы уточнить, какую версию Террасофт Вы используете?
Возникает ли сообщенеие, если не ставить "галку" напоминания?

"Андрей Каспаревич" написал:
если не ставить "галку" напоминания

по-моему Николай спрашивал немного не о галке:

"Арефьев Николай Николаевич" написал:нажимаем отравить сообщения по задаче, и сразу отображается журнал сообщение Террасофт, с таким текстом:"[14.06.04 14.31.37.574] (W) Не удается сохранить вложение. Не удается вставить вложение; нет источника данных."

я бы смотрел в function ProcessSendMailMessageForTask(Dataset), т.к. это явно обработанное сообщение от Outlook'a

"Андросов Дмитрий" написал:
Андрей Каспаревич пишет:

если не ставить "галку" напоминания

по-моему Николай спрашивал немного не о галке:

Арефьев Николай Николаевич пишет:

нажимаем отравить сообщения по задаче, и сразу отображается журнал сообщение Террасофт, с таким текстом:"[14.06.04 14.31.37.574] (W) Не удается сохранить вложение. Не удается вставить вложение; нет источника данных."

я бы смотрел в function ProcessSendMailMessageForTask(Dataset), т.к. это явно обработанное сообщение от Outlook'a

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

Николай, добрый вечер.

Тут проблема в Outlook, нужно чинить именно его :)
Попробуйте этот совет:

http://xn--b1alhpkdec.xn--p1ai/outlook-2010-ne-udaetsya-sohranit-vlozhe…

Если не поможет, и Вас всё устраивает в плане отправки писем - всегда можно отключить вывод в журнал сообщений Террасофт`а данного предупреждения ;)

"Олейник Дмитрий" написал:

Николай, добрый вечер.

Тут проблема в Outlook, нужно чинить именно его :)

Попробуйте этот совет:

http://xn--b1alhpkdec.xn--p1ai/outlook-2010-ne-udaetsya-sohranit-vlozhen...

Если не поможет, и Вас всё устраивает в плане отправки писем - всегда можно отключить вывод в журнал сообщений Террасофт`а данного предупреждения ;)

С уважением,

Олейник Дмитрий

Попробую ваш вариант. А подскажите как можно отключить вывод в журнал сообщений Террасофта??

Найти в коде конфигурации (TSAdmin) строку вида Log.Write(...);

Показать все комментарии
импорт Excel
Установка и Администрирование
Разработка

Добрый день.
Как загрузить прайс лист с товаром и ценами в TS?

Нравится

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

Здравствуйте, Дмитрий.

Вы можете воспользоваться рекомендациями в теме: http://www.community.terrasoft.ru/forum/topic/6894

Касательно процесса импорта в целом Вы можете почитать в руководстве администратора на с.215:
http://www.training.terrasoft.ua/system/files/TS_AG_3.4.0.pdf

Показать все комментарии
Установка и Администрирование
Разработка

Добрый день.
как добавить в справочник заявок, колонку тип заявки? как показано в демонстрационном видео на 26 минуте
http://www.training.terrasoft.ru/resources/webinar/1248
в нашей базе такое поле отсутствует
скриншоты прилагаю

Нравится

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

Добрый день, видимо у вас версия старше чем на демо. Судя по скриншотам на видео версия 3.4.0.130.
Чтобы добавить такое поле надо почитать это и это

Александр прав, на видео версия 3.4.0. Поле [Тип] убрали из заявок начиная с 3.4.1

Показать все комментарии
LookupDataControl
Технические вопросы
Разработка

Может кто знает?!

Можно ли как-то нажать на лупу LookupDataControl-а программно?

Заранее благодарен за ответ

Нравится

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

Можно:

var Dataset = Services.GetNewItemByUSI('ds_Contact');
var SearchFieldNames = 'Name;Communication1;Communication2';
var DisplayFieldNames = 'Name;Communication1;Communication2';
var KeyFieldName = 'ID';
var KeyValue = '';
var SearchFieldName = 'Name';
var SearchValue = '';
ApplyDatasetFilter(Dataset, 'AccountID', dlData.Dataset('AccountID'), true);
Dataset.Open();
ShowSelectDataWindow(Dataset, SearchFieldNames, DisplayFieldNames,
	KeyFieldName, KeyValue, SearchFieldName, SearchValue, Self,
	'', false, true, null, null, false, null, false);

Ловить "ответ" на OnNotify у окна, и записывать его в нужное поле.

спасибо, но это немного не то

хотелось бы что-то типа метода DropDown() или схожих
мне нужно просто как бы нажать на лупу программно, а не создавать другое окно с выбором такими хардкодными методами

может можно как-то углубится в компоненты лукап-контрола и выделить среди них кнопку?
и сделать бы на ней .Click() !?

По клику собственно и отображается окно выбора :)

Понял) прошу прощения

Показать все комментарии
CustomSQLFilter
selectquery
Скрипты
Разработка

¡Hola!

Господа, в своём скрипте (scr_Script) имею

var sq = Services.GetNewItemByUSI('sq_SelectQuery');

sq_SelectQuery имеет вид
SELECT
    [tbl_First].[ID] AS [ID],
    [tbl_First].[Name] AS [Name]
FROM
    [dbo].[tbl_Second] AS [tbl_Second]
LEFT OUTER JOIN
    [dbo].[tbl_First] AS [tbl_First] ON [tbl_First].[FK] = [tbl_Second].[ID]
WHERE([tbl_Second].[ID] = [tbl_First].[FK]

Из скрипта необходимо добавить к sq фильтр типа CustomSQLFilter:
[tbl_Second].[Name] = 'Some string'

со строкой определённой в скрипте (обработчике)
Вывести результат и сбросить фильтр до следующего возникновения события с иной строкой.

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

С уважением
Ваш коллега.

Нравится

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

Добавляете в дизайнере в sq ещё один фильтр с текстовым параметром, затем его налагаете функцией ApplyDatasetFilter (для SelectQuery аналогичная ApplySelectQueryFilter).

Примеры можно найти в конфигурации по названию функции.

От теории к практике.
Не совсем пойму, как создать фильтр с текстовым параметром (я совсем новичок, ещё недели нет, как окунулся в TerraSoft).
Как я понял в самом SelectQuery с фильтра надо будет снять галку. А в коде применять его функцией

ApplySelectQueryFilter(sq, 'filter_name', 'здесь моя строка с которой хочу сравнивать поле указанное в фильтре', true (который говорит что галку надо поставить и применить фильтр));

Верный ли мой ход мыслей?

Верно. В дизайнере sq создаёте параметр, затем там же создаёте фильтр сравнения нужного поля с этим параметром.

Кроме sq лучше создать в дизайнере сервис ds и работать программно уже с ним.

"Зверев Александр" написал:Кроме sq лучше создать в дизайнере сервис ds и работать программно уже с ним.

То есть этот фильтр сразу применять к набору данных не затрагивая sq?

ApplyDatasetFilter(ds, 'filter_name', 'temp_string', true);

Никаких дополнительных манипуляций не требуется? а то у меня object Error выбрасывается.

А всё заполнено правильно в sq и ds?

"Litvyakov Yegor Vladimirovich" написал:Никаких дополнительных манипуляций не требуется? а то у меня object Error выбрасывается.

Название фильтра и параметра в sq должны совпадать.
Например:
/system/files/sq.png

Премного благодарен!
+10 к пониманию того что делаю =)
Всем ещё раз спасибо!

Показать все комментарии
column
grid area
Технические вопросы
Разработка

Добрый День!

Возник вопрос, не знаем, куда копать
Перекопал уже и BaseGridArea и другие сервисы
и таблицы с запросами и датасетами

А вопрос-то в следующем
Есть такие колонки в гриде, как "Создал" и "Изменил", которые по сути своей являются ссылками на соответствующие разделы

Как сделать такие колонки самому?!
Допустим, колонка отображает данные из раздела tbl_Document
Как мне сделать ее подчеркнутой и кликабельной?

Нравится

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

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

Вы имеете ввиду функционал "Перейти к"?

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

Не знал об этой возможности, но явно функция "Перейти к".
Вам надо зайти в скрипт scr_WindowUtils. Там будет функция FillReferencesDictionary()
По аналогии добавить свой раздел.

function FillReferencesDictionary() {
	var RefDictionary = GetNewDictionary();
	RefDictionary.Add('ds_Contact', 'wnd_ContactsWorkspace');
	...
	//RefDictionary.Add('датасет', 'окно воркспейса');
}

Можно обрабатывать событие двойного клика по DataGrid и делать всё что нужно, определяя кто был "щёлкнут".

function ElementOnClick(Control) {
	var Dataset = dBookAuthor.Dataset;
        Dataset.Open()
	var name= IsDatasetEmpty(Dataset) ? null : Dataset('Name');
	MessageBox(Author); // поле выделено цветом, и кликабельно, ибо будет делать то, что здесь написано. А мы можем сформировать объект Attributes из полей "щёлкнутой" записи, и к примеру передать его нужному окну в его вызове.
}        

Иван, колонка-ссылка реализована в базовой версии. alt+click открывает карточку, ctrl+click переходит в раздел.

"Сазанов Александр Владимирович" написал:

Не знал об этой возможности, но явно функция "Перейти к".

Вам надо зайти в скрипт scr_WindowUtils. Там будет функция FillReferencesDictionary()

По аналогии добавить свой раздел.

function FillReferencesDictionary() {

        var RefDictionary = GetNewDictionary();

        RefDictionary.Add('ds_Contact', 'wnd_ContactsWorkspace');

        ...

        //RefDictionary.Add('датасет', 'окно воркспейса');

}

к сожалению, FillReferencesDictionary - не то
она делает общий справочник из возможных датасетов для перехода в меню ПКМ "Перейти к"
у меня же в колонке тащатся стандартные датасеты, уже указанные в FillReferencesDictionary

и колонка все-равно не подчеркнута и переходить позволяет только по ПКМ, а не по нажатию на ней самой :(

"Litvyakov Yegor Vladimirovich" написал:Можно обрабатывать событие двойного клика по DataGrid и делать всё что нужно, определяя кто был "щёлкнут".

это можно
но, это уже скорее костыль)

"Maxim Gritsenko" написал:Иван, колонка-ссылка реализована в базовой версии. alt+click открывает карточку, ctrl+click переходит в раздел.

это значит, что самому сделать колонку ссылкой нельзя?
и почему альт+клик?
у нас ссылка открывается простым нажатием на нее ЛКМ
без альта

вот пример таких колонок

"Калинин Иван" написал:

это значит, что самому сделать колонку ссылкой нельзя?

и почему альт+клик?

у нас ссылка открывается простым нажатием на нее ЛКМ

без альта

День добрый Иван!!!

Максим в своем сообщение вам правильно описал, что в GridArea "колонки ссылки" открываются с удерживанием клавиши Alt. для перехода к записи в ее раздел удерживаем клавишу Ctrl и нажимаем ссылку. Это стандартные возможности Terrasoft 3.Х зашитые в ядре. Да вы так же правы Иван, что в версиях 3.3.2 и ниже террасофта можно было открыть карточку объекта обычным нажатием на ссылку, но в версиях 3.4.0 и выше это исправили на удержание клавиши Alt и нажатие на ссылку.

если говорить о ссылках в GridArea то это зиписи Типа "Поле Справочника". И они все отображаются в GridArea в виде ссылок.

Отвечая на ваш вопрос самый основной опираясь на последнюю вашу цитату Иван (где вы приводите примеры колонок со ссылками) отвечаю. Чтобы в GridArea содержимое колонки отображалось в виде ссылок, вам нужно выполнить следующее:

1. Создать Реляционную связь. как это сделано в вашем примере в таблице tbl_Contact, для примера беру реляционную связь с таблицей Контрагенты (tbl_Account). Пример во Вложенном скриншоте.
2. Добавить в запрос sq_Contact новое Левое соединение и 2 новых поля. Вот пример:

SELECT
...
	[tbl_Contact].[AccountID] AS [AccountID],
	[tbl_Account].[Name] AS [AccountName],
...
FROM
	[dbo].[tbl_Contact] AS [tbl_Contact]
...
LEFT OUTER JOIN
	[dbo].[tbl_Account] AS [tbl_Account] ON [tbl_Account].[ID] = [tbl_Contact].[AccountID]
...

3. В датасет ds_Contact добавить новое поле типа "Поле справочника". Пример во вложенном скриншоте.
4. Разместить поле в GridArea и все.

Спасибо за крайне развернутый ответ

У нас так реализованы все поля в террасофте, которые ссылаются на какие-либо данные
Но подчеркнутыми ссылками, почему-то, являются только те, что были уже настроены до нас

есть еще свойство IDataGridColumn, которое и отвечает за отображение колонки как ссылки (dgcltLookup) или как просто поля(dgcltGeneral):

dgcltDataFieldType - отрисовывает на основании типа поля (т.е. если справочник - то ссылкой, если что-то другое - нет)

вот сделал поле сумма "ссылкой" (правда она никуда не ведет):

Спасибо!!! Безумно благодарен!

Прошу прощения, но я рано порадовался
не помогает смена значения в данном свойстве колонки

никакое из свойств не делает колонку - ссылкой

при том, стандартные колонки "CreatedByID", "ModifiedByID" и "AccountID" и т.п. являются ссылкой при любом из значений данного поля

Иван, а версия/сборка приложения какая?

Иван, там написано, что сделав поле ссылкой, она никуда не приведет (просто будет подчеркнута).
Что бы куда-то привело воспользуйтесь этим

"Maxim Gritsenko" написал:

Иван, а версия/сборка приложения какая?


3.3.2.244

"Сазанов Александр Владимирович" написал:

Иван, там написано, что сделав поле ссылкой, она никуда не приведет (просто будет подчеркнута).

Что бы куда-то привело воспользуйтесь этим

я понимаю, что справочник должен был в референсах у террасофта, чтобы он знал, куда ему идти
только вот колонки у меня даже не подчеркиваются ;)

"Сазанов Александр Владимирович" написал:

Иван, там написано, что сделав поле ссылкой, она никуда не приведет (просто будет подчеркнута).

Что бы куда-то привело воспользуйтесь этим


действительно, чтобы отработал переход, надо чтобы спраовчник был в "референсах") (по крайней мере в 3.4.1 - см function DoLookupColumnClick)

но сама отрисовка ссылка\не_ссылка происходит, видимо, в ядре (не нашел отвечающего за это функционала в конфигурации)

Да, в ядре и в 3.3.2.224 это реализовано.

"Maxim Gritsenko" написал:

Да, в ядре и в 3.3.2.224 это реализовано.


Прошу прощения, не очень понял формулировку

Т.е. в нашей версии это реализовано в ядре, а не в открытом коде?

Надо так читать

"Андросов Дмитрий" написал:но сама отрисовка ссылка\не_ссылка происходит, видимо, в ядре

"Maxim Gritsenko" написал:Да, в ядре

"Maxim Gritsenko" написал:в 3.3.2.224 это реализовано.

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