LotsiaPDM
43 subscribers
30 photos
2 videos
30 files
19 links
Захотите что-то спросить — пишите в личку @dmilsa или на dsadovnikov@lotsia.com
Download Telegram
Всем привет!

О системных переменных

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

Вспомнил я о системных переменных когда решил дать себе немного отдыха и переделать карту работы, которая генерирует для сотрудников уведомления о событиях (дни рождения, праздники и т.д.) в нашей компании. Карта крутилась с 2007 года и ее реализация была выполнена на уровне того функционала и опыта. Она именно крутилась, потому с заданной периодичностью выполнялся закольцованный автоматический переход в ходе которого выполнялась проверка наличия новых событий. За 16 лет было выполнено более 19,5 тысяч переходов и, соответственно, сгенерировано такое же количество скрытых задач. Если при выполнении перехода было найдено событие, то дополнительно выполнялась рассылка уведомлений. Так вот, для того, чтобы найти следующее событие, нужно знать дату предыдущего, поскольку запрос ищет события с датой, которая больше даты предыдущего события и меньше или равна текущей дате. Здесь есть нюансы, можно и проще, но нам нужно было именно так, и речь сейчас не об этом. В итоге карта состоит из одной задачи начала работы, которая не сдвигается с места, но точно так же генерирует рассылку сообщений.

Возвращаюсь к теме. Дату предыдущего события мы хранили в атрибуте служебного объекта. В процессе упрощения процесса я решил пойти до конца и отказаться от действий над объектами. Сначала быстро переделал все на скрипты, а через несколько минут решил отказаться и от них и использовать системную переменную. Попросил администратора (в нашей базе я не администратор, а привилегированный пользователь) создать в окне «Общие параметры БД» датавременную переменную с определенным именем и перезапустить сервер автоматических этапов, чтобы он перечитал список системных переменных. Перевошел в программу и сам, а затем за несколько минут модифицировал шаблон работы. Теперь стартовая дата хранится в системной переменной, обращение к объектам не производится, а карта работы исправно работает и 19 мая исправно поздравила коллектив с Днем пионерии
image_2023-05-19_16-44-02.png
181.2 KB
Системные переменные могут быть тех же типов данных и значений (одиночные и массивы), что и переменные шаблонов работ.
image_2023-05-19_16-44-46.png
147.4 KB
В форму системную переменную добавить нельзя. Для записи значения, системная переменная добавляется в действия как обычная.
image_2023-05-19_16-45-22.png
200.4 KB
Для возврата значения, системная переменная выбирается в дереве атрибутов шаблона работы.
Добрый день!
🔸Опубликована сборка 230622 версии 5.80.
В ней исправлены обнаруженные ошибки, а в Редактор выражений добавлена функция f_GetRDN, возвращающая значение относительного отличительного имени (RDN) <key> из строки с отличительным именем <distinguished_name>.
Синтаксис функции: f_GetRDN ( <distinguished_name>, <key> )
Относительные отличительные имена должны начинаться с <key>= и разделяться запятой или точкой с запятой. Кавычки обрабатываются автоматически.
На практике рекомендуется использовать в функции SignCertList Редактора действий для формирования требуемого вида выпадающего списка сертификатов.

Пример строки distinguished_name:
'FIO=Иванов Иван Иванович, DB=12.07.1970, POL=M'
в этой строке три key: FIO, DB и POL

Примеры вызовов:
f_GetRDN ('FIO=Иванов Иван Иванович, DB=12.07.1970, POL=M', 'FIO') вернет 'Иванов Иван Иванович'
f_GetRDN ('FIO=Иванов Иван Иванович, DB=12.07.1970, POL=M', 'DB') вернет '12.07.1970'
f_GetRDN ('FIO=Иванов Иван Иванович, DB=12.07.1970, POL=M', 'POL') вернет 'M'

Вы также можете формировать свои строки, в том числе с помощью f_ExecSQLSelect_3, и парсить их новой функцией.

Нового функционала в версию сейчас добавляется мало по той причине, что мы активно работаем над версией 6.0.
Всем привет!

О вводе данных в отчетах

Я вам сейчас расскажу такое…
Если в отчете выполнить одну скриптовую строчку:
LsRpt.Modify("<col_name>.TabSequence =10")
то колонка с именем col_name станет редактируемой. TabSequence – это порядок обхода полей по клавише табуляции, он используется в формах ввода (пункт всплывающего меню «Задать порядок обхода»). Если у поля порядок обхода равен нулю, то курсор в него поместить нельзя. Если больше нуля, то можно. В формах, не предназначенных для редактирования данных, к которым относятся и отчеты, нулевой порядок обхода зашит для всех полей.
Но есть и очевидные нюансы: у полей отчета нет настроек, типичных для полей ввода, например, выбора даты из календаря, маски ввода.
Если надо закрыть колонку обратно, то верните в нее нулевой порядок обхода: LsRpt.Modify("<col_name>.TabSequence =0")
image_2023-08-30_12-37-47.png
7.3 KB
Добрый день!

В скрипты добавлен метод для назначения подборке формы. Не знаю, как вы, а я его ждал. Очень удобно открыть подборку с нужным видом списка объектов. Если форма не указана, подборка откроется с видом по умолчанию.
Функционал будет доступен в следующем обновлении.
Всем привет!

Как передать список объектов другому пользователю через ссылку типа lotsia://

Можно связать передаваемые объекты с каким-то служебным объектом и передать его ID в ссылку, затем у получателя запросом развернуть список. Недостатки: возможно, связи создадутся не очень быстро, если их много, и если связи одноразовые, то потом нужно их удалить. В принципе, легко это провернуть на сервере.
❗️Но есть идея, которая может показаться интереснее. Объекты скриптом помещаем в общедоступную подборку и в ссылку передаем ID подборки. Подборка создастся за несколько секунд, а удалится за доли секунды. Удобно также и то, что список объектов может быть массивом. Зная ID подборки, можно легко извлечь список объектов. Пример скрипта:
set oSvc = Application.CreateObjectService 'создать объектный сервис
oSvc.FastMode=True 'перевести сервис в быстрый режим
set oColl = oSvc.CreateObjectCollection 'создать подборку
oColl.Description = LsJob.GetVarValue("name") 'присвоить имя из переменной карты
oColl.IsPersonal = False 'сделать подборку общей
oColl.AddObjects LsJob.GetVarValue("obj_id") 'поместить массив ID объектов
oColl.Rights.Add 2009000, 1, False, "E DD" 'установить на подборку права доступа
oSvc.Update 'сохранить изменения
LsJob.SetVarValue "collect", oColl.ID 'вернуть ID подборки в переменную карты

А это пример скрипта для удаления подборки:
set oSvc = Application.CreateObjectService 'создать объектный сервис
oSvc.FastMode=True 'перевести сервис в быстрый режим
set oColl = oSvc.GetObjectCollection(LsJob.GetVarValue("collect")) 'инициализировать объект подборки
oColl.Delete 'удалить подборку
oSvc.Update 'сохранить изменения

Всем продуктивного дня!
Коллеги и друзья, стартовал приём работ на конкурс решений, выполненных с использованием Lotsia PDM PLUS!
К участию приглашаются представители компаний-пользователей и партнеров. Будем рады всем материалам. Подробности здесь.
❗️В скрипты добавлен метод SyncArch для синхронизации документа. Дополнительная фишка в том, что можно указать как ID версии, так и имя файла. Это дает возможность за один раз выполнить несколько операций с файлом. Например, открыть, синхронизировать, преобразовать в PDF, сохранить и закрыть. При этом, за счет однократного открытия значительно сокращается суммарное время операции. Проверено.
И еще момент, для синхронизации с файлами офисных форматов (за исключением xls, в том числе открытых), офисное приложение не нужно, запись идет напрямую в файл и очень быстро.
Речь идет о версии 6.0, которую скоро начнем публиковать для всех.
This media is not supported in your browser
VIEW IN TELEGRAM
Поиграл в отчете скриптами. Вечер субботы удался 👍
⚡️Подведены итоги нашего очередного ежегодного конкурса на лучший проект. Участие приняли пользователи и компании-разработчики решений на базе Lotsia PDM PLUS.

1️⃣ место жюри присудило проекту АО «ЭЛАРА». С помощью стандартного функционала системы собственными силами решен ряд задач менеджмента качества и бизнеса и работы с рационализаторскими предложениями. Работа проделана очень большая. Браво!

2️⃣ место присуждено совместному проекту ООО «ЛУКОЙЛ Пермнефтеоргсинтез» и нашего давнего и очень уважаемого партнера ГК «Русский САПР». Коллегами на базе Lotsia PDM PLUS реализована мощная и красивая информационная система электронного архива технической документации.

3️⃣ место присуждено ООО «ГПИ Сахалин». Администратор системы делится наработками для упрощения своей же работы и коммуникации с пользователями. Такие наработки есть у всех, но не все ими делятся.

Мои поздравления финалистам!
Дорогие друзья!

Поздравляю вас с наступающими каникулами и долгожданной передышкой перед погружением в следующий рабочий год!

С возрастом итоги года подводить становится труднее, потому что скорость течения времени значительно увеличивается и размываются границы календарных периодов. Щёлк – зима, щёлк – лето, щёлк – снова зима. Про недели я вообще молчу – они стали мгновениями.

Работы много. Иногда рабочий день достигает 14 часов. Моя мама любит вспоминать диалог между мной в детстве и моим дядей Мишей, который был программистом советского периода и ночами работал дома (код тогда писали на бумаге).
Я: Миша, что ты делаешь?
Дядя Миша: Работаю.
Я: Много работаешь и много получаешь?
Дядя Миша: Нет.
Я: Ааа… Плохо работаешь, значит.
😂
Если любишь свою работу и делаешь ее честно, то это уже большой жизненный успех. Устаешь, раздражаешься рутине, ищешь наилучшее решение, но результат радует. О деньгах даже и не думается. Они же во время работы не нужны, не так ли? 😜

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

Хочу поделиться одним из приемов для быстрого наполнения подборки объектами, которые не всегда напрямую связаны между собой. Когда объектов немного, то их можно без особых затрат поочередно перетащить в окно подборки или выполнить по каждому из них действие, добавляющее объект в подборку. Когда объекты в одной ветви дерева, в подборку можно добавить проект. В остальных случаях наполнение подборки может потребовать значительных затрат времени. Мне для подготовки к тестированию функционала нужно было удалить у множества разрозненных объектов документы архива, а затем импортировать в них другие. Для решения задачи я сделал простой отчет, который отфильтровал так, чтобы в нем остались только нужные строки. Затем сделал скриптовую процедуру и привязал ее к кнопке в форме аргументов. Секунда – и все готово! Свою задачу я решил.
Но потом я скрипт немного переделал и он стал универсальным. Первая процедура формирует массив, вторая создает подборку. Такая реализация универсальная и позволяет применять ее как в отчетах, так и в шаблонах работ и действиях над объектами.
Делюсь кодом:
sub CreateArrIDs
dim arrids
Redim arrids(1000) 'Расширили массив до 1000 элементов, предполагая, что больше точно не нужно

For i = 1 to LsRpt.RowCount 'Перебираем все строки
arrids(i-1) = LsRpt.GetItem (i, "isobject_id") 'Добавляем в массив ID очередного объекта
next
Redim Preserve arrids (i-1) 'Сохранили массив с нужным количеством элементом

RPT.CreateCollect arrids 'Вызвали процедуру CreateCollect и передали в нее arrids – массив ID объектов

end sub


sub CreateCollect (arrids)
Dim oSvc, oColl

set oSvc = Application.CreateObjectService
set oColl = oSvc.CreateObjectCollection 'Создали подборку
oColl.Description = cStr (Now) 'Дали подборке имя, например, по текущему времени
oColl.AddObjects arrids 'Добавили в подборку объекты из массива ID
oSvc.Update 'Сохранили подборку
Application.NewWindowObjectCollection oColl.ID Открыли окно подборки

end sub
Добавим в справку в раздел с примерами скриптов, чтобы было под рукой.
Коллеги, опубликовано небольшое, но важное обновление версии 5.80, сборка 240502.
Один из наших пользователей нашел отклонение поведения сервера автоматических этапов от документированного. Заметить это можно было в специфических условиях.
Итак: на сервере автоматических этапов при выполнении перехода на объединитель проверка условия автоматического перехода из объединителя откладывалась до следующего прохода очереди.
Всем привет!
Очень хочется поделиться интересной разработкой. Идею реализации мне подсказали наши разработчики, сам бы не додумался, уж простите. Задача состояла в выполнении в Lotsia PDM PLUS некоторых операций в фоновом режиме. Если более конкретно, то некоторыми операциями была выгрузка пакета файлов. Процесс может быть длительным, пользователю ждать его завершения не хочется. Можно делать на автосервере, но тогда может застрять очередь задач. То, что мне предложили сделать разработчики, сначала вызвало недоверие (а это вообще законно?), но по мере реализации удивило своей простотой.

Алгоритм следующий: пользователь запускает действие, заполняет форму, нажимает «Далее» и продолжает работать. Действие же содержит скрипт, который создает в файловой системе vbs-файл, запускает его на выполнение, а затем удаляет. Vbs-файл, в свою очередь, содержит скрипт для запуска отдельной копии Lotsia PDM PLUS и выполнения действия с указанным ID. Эта отдельная копия Lotsia PDM PLUS создается как объект с идентификатором «LotsiaPDM.ApplicationFactory». Нам нужен фоновый режим, поэтому видимый режим для нее включать не будем.
Про ApplicationFactory можно почитать в справке по скриптам, в разделе «API».

Итак, пример скрипта:
option explicit
sub Pre
Dim sVbs
Dim oFSO, oOut, WshShell

Set oFSO = CreateObject("Scripting.FileSystemObject")
sVbs = oFSO.GetAbsolutePathName("ls_delme1.vbs") 'Получить текущее расположение
set oOut = oFSO.CreateTextFile(sVbs, true) 'Создать в текущем расположении файл скрипта ls_delme1.vbs
'Ниже наполняем файл скрипта, не забывая, что строковые параметры должны быть в кавычках
'Скрипт запускает отдельную копию LotsiaPDM (ApplicationFactory), подключает ее к БД
'И выполняет действие с ID=171, инициируя значения переменной sArg1 значением переменной sArg текущего действия
'Затем очищает память от действия (иначе не завершится фоновый partyp.exe) и удаляет файл скрипта
oOut.Write("Dim oPDM, oOper" & vbCrLf & _
"set oPDM = CreateObject(""LotsiaPDM.ApplicationFactory"").Application" & vbCrLf & _
"oPDM.ConnectAttrib.DBType = """ & Application.ConnectAttrib.DBType & """" & vbCrLf & _
"oPDM.ConnectAttrib.Server = """ & Application.ConnectAttrib.Server & """" & vbCrLf & _
"oPDM.ConnectAttrib.User = """"" & vbCrLf & _
"oPDM.ConnectAttrib.Password = """"" & vbCrLf & _
"oPDM.Connect" & vbCrLf & _
"set oOper = oPDM.GetOperation(171)" & vbCrLf & _
"oOper.PrepareVars" & vbCrLf & _
"oOper.SetVarValue ""sArg1"", """ & Replace(LsOperation.GetVarValue("sArg"), """", """""") & """" & vbCrLf & _
"oOper.Execute" & vbCrLf & _
"oOper.Clear" & vbCrLf & _
"CreateObject(""Scripting.FileSystemObject"").DeleteFile """ & sVbs & """, True")
oOut.Close 'Завершить запись файла и закрыть его

set WshShell = CreateObject("Wscript.Shell")
WshShell.Run sVbs 'Запустить на выполнение скрипт

end sub


Запускаем действие, вводим значение переменной sArg, нажимаем «Далее» и продолжаем заниматься своими делами работой. В фоновой копии Lotsia PDM PLUS действие с ID 171 получит значение для своей переменной sArg1 и выполнит то, что необходимо. Хоть на клиенте, хоть серверным действием. По завершении может прислать сообщение типа «Я все сделала. Твоя Лоция».

Вот как можно! :)

P.S.:
1. Все, что будет выполняться в фоновом процессе, должно быть максимально отлажено. все возможные ошибки обработаны.
2. Обязательно применяйте метод Clear после выполнения действия, иначе фоновый процесс не завершится.
3. Как бы ни хотелось избавить пользователя от длительных операций, не переусердствуйте. Трезво оценивайте ресурсы компьютера, не все машины потянут десяток процессов с тяжелыми операциями, в том числе дисковыми. Иногда лучше перенести операцию на автосервер.
Коллеги,добрый день!

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

Автор объявления Рощин Дмитрий, тел.: +7 999 825 84 94