Я всегда с собой беру... кусочек кода.

Опубликовано:
22 августа в 13:20
  • 9

Наверно у каждого разработчика или толкового администратора всегда есть некий блокнотик, куда вбиты основные и наиболее часто используемые фрагменты кода. Давайте я начну своей статьей и выпишу свои любимые фрагменты, а вы подхватите! Представьте какой у нас получится Шпаргальник!

И сразу к делу!

1. Определение пользователя, группы, роли:

CurrentUser = ServiceFactory.GetUserByName(Application.Connection.UserName) // Текущий пользователь
Admin = ServiceFactory.GetGroupMembers(ServiceFactory.GetGroupByName('Administrators')).Find(CurrentUser) // Группа администраторов
FinDirectorRole = ServiceFactory.GetRoleMembers(ServiceFactory.GetRoleByName('ФинДиректор'); NIL) // Роль Финансового директора
  IsFinDirector = FinDirectorRole.Find(CurrentUser)
// Admin и IsFinDirector соответственно принимают значения TRUE, если пользователь относится к ним

2. Переборка параметров по Именам:

RequisitesTabMain = 'Sourcers;Direction;ProjectStatus;Работник;ДаНет2' // Перечисляем
    foreach ReqName in CSubString(RequisitesTabMain; ';')  // Перебираем
      if Object.Requisites(ReqName).CanGUIWrite   // Проверяем
        Object.Requisites(ReqName).CanGUIWrite = FALSE // Делаем
      endif
    endforeach

3. Начало задачи (Параметры и проверка документа):

Params = Sender.WorkFlowParams
  // Подтянуть вложенный документ в параметры Маршрута
  Attachments = Sender.GetAttachments(True) // Активируем
  foreach Attachment in Attachments // Просматриваем
    EDocInfo = Attachment.ObjectInfo     
    if EDocInfo.ComponentType = ctEDocument // А это точно документ?
      if EDocuments.GetObjectByID(EDocInfo.id).SYSREQ_EDOC_KIND == 'Д000095' // Отбираем основной вид
      Params.ValueByName("Attachment").Value = EDocInfo // Подхватываем в параметры маршрута
    endif
  endforeach

  if not Assigned(Params.ValueByName("Attachment").Value) // Обозначим ошибку без документа!
      Raise(СоздатьИсключение('ВНИМАНИЕ!'; 'Не вложен основной документ!'; ecException))
  endif
// Объявим тему исходящей задачи
  Object.Subject = Format("Согласование: %s";EDocuments.GetObjectByID(EDocInfo.id).SYSREQ_EDOC_NAME)

4. Теперь События Задания (Тема):

Params = Object.WorkFlowParams
EDocInfo = Params.ValueByName("Attachment").Value
Sender.Properties.ValueByName(JOB_BLOCK_SUBJECT_PROPERTY).Value = Format("Согласование: %s"; EDocInfo.Name)

5. Отправка почты с вложениями из задачи:

  TempFolder = GetTempFolder() 
  AttachmentsListStr = ""
  МоментЗапуска = Params.ValueByName("Moment").Value  
  EDocInfo = Params.ValueByName("Attachment").Value
  RassEmail = Params.ValueByName("email2").Value

        // Получить электронный документ   
        EDoc = EDocInfo.Document 
        // Определить номер экспортируемой версии
        VersionNum = GetNumVersionEDoc(EDoc; EDOC_VERSION_ACTIVE_STAGE_CODE)
        if VersionNum = -1
          VersionNum = GetNumVersionEDoc(EDoc; EDOC_VERSION_DESIGN_STAGE_CODE)
          if VersionNum = -1
            VersionNum = GetNumVersionEDoc(EDoc; EDOC_VERSION_OBSOLETE_STAGE_CODE)
          endif
        endif
        // Сформировать наименование фaйла
        EDocumentVersion = EDoc.Versions.ValueByName(VersionNum)
        FileName = GetFullEDocumentVersionFileName(EDocumentVersion; TempFolder)
        // Экспортировать документ во временную папку    
        EDoc.Export(VersionNum; FileName; FALSE)
        // Добавить имя экспортированного файла в список вложений
        AttachmentsListStr = AddSubString(FileName; AttachmentsListStr; ';')    

Theme = 'Новые точки от' & МоментЗапуска
MailText = 'Коллеги, внесены новые точки!' & CR
MailText = MailText & 'Информация во вложении.' & CR & CR & 'Данное сообщение сформировано автоматически, просьба - не отвечать на него!'
//******************************************************************************
ПЧТОтправитьПисьмо(RassEmail;;;Theme;MailText;;AttachmentsListStr;)

6. Наполнение Списка Пользователей в маршруте из справочника:

UserList1 = ServiceFactory.GetUSerList 
UserList2 = ServiceFactory.GetUSerList
UserList3 = ServiceFactory.GetUSerList
КДГDDS = References.КДГ.GetObjectByCode(КатДог) // Получение элемента справочника из документа
// КатДог - реквизит документа типа "Категория договора"
Listering1 = КДГDDS.DetailDataSet(2)
 foreach List in Listering1
    UserList1.Add(ServiceFactory.GetUserByCode(List.Requisites("RabLevel1").Value))
 endforeach
Listering2 = КДГDDS.DetailDataSet(3)
  if Listering2.RecordCount > 0
   foreach List in Listering2 
      UserList2.Add(ServiceFactory.GetUserByCode(List.Requisites("RabLevel_2").Value))
   endforeach 
endif
Listering3 = КДГDDS.DetailDataSet(4)
  if Listering3.RecordCount > 0
    foreach List in Listering3 
      UserList3.Add(ServiceFactory.GetUserByCode(List.Requisites("RabLevel_3").Value))
   endforeach
  endif 
Params.ValueByName("1Уровень").Value = UserList1 // Параметр типа Список пользователей
Params.ValueByName("2Уровень").Value = UserList2 // Параметр типа Список пользователей
Params.ValueByName("3Уровень").Value = UserList3 // Параметр типа Список пользователей

7. Формирование листа согласования и вложения его в документ по окончанию маршрута:

Params = Object.WorkFlowParams

CurrentUser = Object.Requisites("Author").DisplayText     // Получаем Инициатора
USERL = ServiceFactory.GetUserByCode(НайтиРеквизитПоФИО(CurrentUser; "Пользователь"))      
JobIndex = 1       // Индекс

  Задача = Tasks.GetObjectByID(Object.ID)       // Формализуем для работы
  DetailJobs = Задача.DetailDataSet(3)          // Полоучаем Job`ы задачи
  NameP = Задача.SYSREQ_ID                      // Снимаем имя задачи в переменную для Листа согласования
  DetailJobs.Index = ArrayOf('EndDate;ASC'; 'Performer;ASC')    // Сортируем по дате и ФИО
  DetailJobs.Indexed = TRUE  
  DetailText = Задача.DetailDataSet(5)  // Получить детальный раздел "Тексты заданий"
  JobsList = CreateList()               // Создать список заданий
  foreach DetailJob in DetailJobs       // Пока мы получаем Job`ы
    JobID = DetailJob.SYSREQ_ID         // ID Job
    AuthorJob = ServiceFactory.GetUserByCode(DetailJob.Performer).FullName      // Ловим автора Задания
    JobText = ""    // Обозначаем переменную
    if DetailText.Locate("JobID"; JobID)     // Формируем строку с данными для дальнейшей работы
      JobText = JobIndex & "|"& AuthorJob & "|" & DetailJob.UTCModified & "|" & DetailText.Text
    endif
    if JobText <<>> ""      // Заполняем лист, индексируем
      JobsList.Add(JobIndex; JobText)
      JobIndex = JobIndex + 1 
    endif                
  endforeach
   
  Excel = CreateObject("Excel.Application")     // Теперь готовим к работе Excel
  ExcelBook = Excel.Workbooks.Add               // Готовим...
  WorkSheet = ExcelBook.WorkSheets(1)           // Готовим...
  WorkSheet.Activate                            // Готовим...
    WorkSheet.Rows(1).Cells(4).Value = 'Лист Согласования сформирован автоматически:'    
    WorkSheet.Rows(2).Cells(4).Value = "GUID: " & GetHashInFormatGUID(Задача.ID)         
    WorkSheet.Rows(3).Cells(2).Value = "ID: " & Задача.ID                                
    WorkSheet.Rows(4).Cells(2).Value = "ТЕМА: " & Задача.Subject                         
    WorkSheet.Rows(7).Cells(1).Value = '№'                                               
    WorkSheet.Rows(7).Cells(2).Value = 'Исполнитель'                                     
    WorkSheet.Rows(7).Cells(3).Value = 'Когда выполнено'                                 
    WorkSheet.Rows(7).Cells(4).Value = 'Содержание ответа'                               

    index = 8     // Указываем на строку, с которой начинается таблица
    foreach JobText in JobsList     // Снимаем строки и заполняем таблицу по кусочкам:
        WorkSheet.Rows(Index).Cells(1).Value = SubString(JobText;"|";1)
        WorkSheet.Rows(Index).Cells(2).Value = SubString(JobText;"|";2)
        WorkSheet.Rows(Index).Cells(3).Value = SubString(JobText;"|";3)
        WorkSheet.Rows(Index).Cells(4).Value = Trim(SubString(JobText;"|";4))
        Index = Index + 1
    endforeach    
    WorkSheet.Rows(Index + 1).Cells(2).Value = "Инициатор задачи: " & CurrentUser  
    WorkSheet.Rows(Index + 2).Cells(2).Value = Сейчас()  
      
// Наводим красоту с жестким фанатизмом. Как и где найти мануал - отвечаю: https://club.directum.ru/post/773
  Подпись1 = Index + 1
  Подпись2 = Index + 2 
  Край = Index - 1
  
  WorkSheet.Range("B4:D5").Merge
  WorkSheet.Range("B4").WrapText = True
  WorkSheet.Range("D:D").WrapText = True
  WorkSheet.Range("D1").Font.Underline = True
  WorkSheet.Range("D1").Font.Italic = True
  WorkSheet.Range("D2").Font.Underline = True
  WorkSheet.Range("D2").Font.Italic = True
  WorkSheet.Range("D2").Font.Size = 9
  WorkSheet.Rows("6:30").EntireRow.AutoFit
  WorkSheet.Range("B3:B5").Font.Bold = True
         
  WorkSheet.Columns("A:A").ColumnWidth = 2  //EntireColumn.AutoFit
  WorkSheet.Columns("B:B").ColumnWidth = 35 //EntireColumn.AutoFit
  WorkSheet.Columns("C:C").ColumnWidth = 20 //EntireColumn.AutoFit
  WorkSheet.Columns("D:D").ColumnWidth = 60 //EntireColumn.AutoFit
  WorkSheet.Range("B" & Подпись1 & ":B" & Подпись2).Font.Bold = True
  WorkSheet.Range("B" & Подпись1 & ":B" & Подпись2).HorizontalAlignment = -4131
  WorkSheet.Range("B" & Подпись1 & ":B" & Подпись2).VerticalAlignment = -4108
  WorkSheet.Range("A1:D" & Край).HorizontalAlignment = -4131                   
  WorkSheet.Range("A1:D" & Край).VerticalAlignment = -4108
  WorkSheet.Range("A7:D" & Край).Borders(7).LineStyle = 1
  WorkSheet.Range("A7:D" & Край).Borders(8).LineStyle = 1
  WorkSheet.Range("A7:D" & Край).Borders(9).LineStyle = 1
  WorkSheet.Range("A7:D" & Край).Borders(10).LineStyle = 1
  WorkSheet.Range("A7:D" & Край).Borders(11).LineStyle = 1
  WorkSheet.Range("A7:D" & Край).Borders(12).LineStyle = 1
  WorkSheet.Range("D1").HorizontalAlignment = -4152
  WorkSheet.Range("D2").HorizontalAlignment = -4152
  WorkSheet.Range("A7:D7").HorizontalAlignment = -4108
  WorkSheet.Range("A7:D7").Font.Bold = True
  WorkSheet.PageSetup.Orientation = 2

//Сохраняем Нашу таблицу в PDF и XLS
  FilenamePDF = 'C:\Temp\Лист_Согласования_' & Задача.ID & ".pdf"  
  FilenameXLS = "C:\Temp\Temporary.xls"   
  ExcelBook.SaveAs(FilenameXLS)  // Сохраняем таблицу в XLS, этого можно и не делать, но так происходит работе без лишних вопросов   
  ExcelBook.ExportAsFixedFormat(0; FilenamePDF;1; FALSE; FALSE) // Сохраняем таблицу в PDF
  Excel.Quit                // Закрываем Excel без вопросов
  ExcelBook = nil           // Убираемся
  Excel = nil               // Убираемся                           
  УдалитьФайл(FilenameXLS)  // Убираемся, так как работа с таблицей закончена
       
   Attachments = Object.GetAttachments(True)
   DocSog = EDocuments.CreateNewFromFile('ПЭА'; 'Д000055'; 'ACROREAD'; FilenamePDF)
   try
     SetAccessRightsEDoc(DocSog.Info; ; ; USERL)  
   except
     //  
   endexcept   
   Attachments.Add(DocSog.Info)
   DocSog.Save   
  Object.Save
  EDocInfo = nil 
  УдалитьФайл(FilenamePDF)  

8. Старт задачи из другой задачи при помощи кода:

Task = Tasks.CreateNew()
Task.LoadStandardRoute('CancelS')
Task.Subject = Format("Внимание! Инициирована отмена! Клиент: %s | Менеджер: %s"; ArrayOf(Клиент; ServiceFactory.GetUserByName(Params.ValueByName('OsnManager').Value).FullName)) 
Task.get
Task.Author = 'Д005669' // Автор указывается конкретно
TaskParms = Task.WorkflowParams
TaskParms.ValueByName('OsnManager').Value = Params.ValueByName('OsnManager').Value
TaskParms.ValueByName('Клиент').Value = Клиент 
TaskParms.ValueByName('Отказ').Value = Params.ValueByName('Отказ').Value
if Assigned(Params.ValueByName('Отказ2').Value)
  TaskParms.ValueByName('Отказ2').Value = Params.ValueByName('Отказ2').Value
endif
if Assigned(Params.ValueByName('Отказ3').Value)
  TaskParms.ValueByName('Отказ3').Value = Params.ValueByName('Отказ3').Value
endif 

  ActText = 'Ведущий Менеджер: ' & ServiceFactory.GetUserByName(Params.ValueByName('OsnManager').Value).FullName & CR &  
  'Наименование клиента: ' & Params.ValueByName('Клиент').Value & CR & 
  'Вид Деятельности клиента: ' & Params.ValueByName('ВидДеятельности').Value & CR & 
  'Торговое наименование: ' & Params.ValueByName('ТорговоеНаименование').Value & CR & 
  'ИНН: ' & Params.ValueByName('ИНН').Value & CR
  if Assigned(Params.ValueByName('email').Value)  
      ActText = ActText & 'E-mail клиента: ' & Params.ValueByName('email').Value & CR
  endif
  if Assigned(Params.ValueByName('Контакты').Value)
      ActText = ActText & 'Контактный телефон: ' & Params.ValueByName('Контакты').Value & CR
  endif
  ActText = ActText & '========================================================='
TaskParms.ValueByName('ActText').Value = ActText

Task.Start()

9.  Нарезка того, что частенько требуется в работе:

Ref = CreateReference('РАБ') // Указываем справочник
// или так: References.РАБ.GetComponent()
AddWhere = Ref.AddWhere(Format("%s.%s = 'З'"; ArrayOf(Ref.TableName; Ref.Requisites('Состояние').SQLFieldName)))
    View = Ref.CreateView('Главное')                     
    View.ViewMode =  vmSelect 
    View.MultiSelection = TRUE
    View.MainForm.Show

Ref.DelWhere(AddWhere) 
//**********************************************************
//РАСШИРЕНИЕ ДОКУМЕНТА:
Docum = EDocuments.GetObjectByID(Doc.ID) 
Docum.Info.Editor.Extension 
//**********************************************************
// Генерация из шаблона:
EDoc = EDocuments.CreateNewFromTemplate('TMCards';'Д000091';'Д004330')
ФИО = Params.ValueByName("ФИО").Value
EDoc.Requisites('ISBEDocName').Value = "Служебная записка на прием на работу Кандидата: "& ФИО & " от " & Today() 
EDoc.Save()
ТМДобавитьВложение("Эл.документ";EDoc.ID)
//**********************************************************
// Вычислить работника и его руководителя:
Params.ValueByName("Инициатор").Value = ServiceFactory.GetUserByCode(Object.Author)
  Работник =  EDocuments.GetObjectByID(EDocInfo.id).Requisites('Персона').DisplayText
  КодПользователя = НайтиРеквизитПоФИО(Работник; 'Пользователь')
  Руководитель = ServiceFactory.GetUserByCode(КодПользователя)
//**********************************************************
// Показать связанные эл. документы      
  GetBoundEDocuments(Object; EDocKind; TRUE; ReadOnly; RightsToRead; RightsToWrite)
//**********************************************************
// Excel:
ExcelApp = CreateObject("Excel.Application")
NewWb = ExcelApp.WorkBooks.Add
Sh = NewWb.Sheets(1)
Astr = 1
Sh.Range("D" & Astr).Value = Данные
Sh.Columns("A:A").ColumnWidth = 50
Sh.Rows("1:1").RowHeight = 25
Sh.Range("A1:E1").Select
Selection = ExcelApp.Selection
Selection.Font.Bold = True
xlcenter = -4108				// По центру
Selection.HorizontalAlignment = xlcenter
Selection.VerticalAlignment = xlcenter
Sh.Range("A1:E1").Select
    Selection.AutoFilter
Sh.Range("A1").Select
NewWb.SaveAs("C:\temp\PS.xlsx")
ExcelApp.WorkBooks.Close
//**********************************************************
// Сбор данных из наименования справочника:
Список = CreateStringList()
Список.Delimiter = ';'
foreach Sprkod in CSubString(ПоискСпр('АДР';'Состояние:Действующая'); '|')
      Список.Add(ReferenceRequisiteValue('АДР';Sprkod;'Строка'))  
endforeach
RassEmail = Список.DelimitedText 
//**********************************************************
// Сам себе руководитель:
if ServiceFactory.GetUserByCode(Object.Author) == Руководитель // Руководитель - параметр
      Params.ValueByName('РуководительКандидата').Value = ServiceFactory.GetUserByCode(Object.Author)
  else
      Params.ValueByName('РуководительКандидата').Value = Руководитель
  endif
//**********************************************************
// Планировщик заданий:
//"C:\Program Files (x86)\Common Files\NPO Computer Shared\IS-Builder\SAJobRunner.exe"
//-S="ServerDir" -D="DIRECTUM" -CT="Script" -F="ScriptName"

В моем блокнотике пока это наиболее популярная подборка. А что есть у вас? Делимся - не стесняемся! 

13
Подписаться

Комментарии

Тарас, сегодня в ударе. Статья на статьёй. 

Тоже собираюсь сделать такую копилку. Но пока не много.

Отобразить критерии поиска для механизма поисков:

Search = Searches.CreateNew(ckEDocument) 
Criteries = Search.SearchCriteria
T = 'Критерии поиска:' 
ForEach RequisiteDescription in Search.RequisiteDescriptionList 
   T = AddSubString(RequisiteDescription.Name & TAB & RequisiteDescription.Title; T; CR)  
EndForEach 
EditText(T)
Criteries.Add('КритерийПоиска').Add(Object.SYSREQ_CODE)
Searches.Show(Search)

Число элементов в массиве и перебор элементов:

Array = ArrayOf('v1'; 'v2'; 'v3')
CArray = CArrayElement(Array)
Count = CArray.Count
ForEach Element In CArray
  ShowMessage(Element)
EndForEach

Реверс списка:

List = CreateList()
List.Add(3; 'Значение 1')
List.Add(5; 'Значение 2')
List.Add(1; 'Значение 3')
ForEach Item In List
  ShowMessage(Item)
EndForEach
// В обратном порядке
i = List.Count - 1
While i >= 0
  ShowMessage(List.Names(i))
  ShowMessage(List.Values(i))
i = i - 1
EndWhile

 

CurrentUser = ServiceFactory.GetUserByName(Application.Connection.UserName) // Текущий пользователь

есть немного проще вариант

CurrentUser = EDocuments.CurrentUser

 

FinDirectorRole = ServiceFactory.GetRoleMembers(ServiceFactory.GetRoleByName('ФинДиректор'); NIL) // Роль Финансового директора

тут главное не забывать в этой шпаргалке, что это только для стат. роли, для вычисляемой надо Sender передавать =)

Task.Start()

Я не использую такой вызов без Try ... Exception. Задачка ведь может и не создаться.

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

*. Если пользуюсь МД, то собираю в окно результатов все выбранные пользователем значения, разместив их в скрытом листе и отображая в спец. этапе..

If not _Assigned(Wizard)
  Raise(CreateException('';'Не передан объект - МД, в переменной Wizard';ecWarning))    
EndIf

If not _Assigned(StepName)
  Raise(CreateException('';'Не передано имя этапа для сканирования в переменной StepName';ecWarning))    
EndIf


// Получить все элементы формы этапа 
Try
  Elements = Wizard.Steps.ValueByName('Скрытый. Лист результата').Elements
Except
  Raise(CreateException('';Format('Нет такого этапа «%s» в переданном МД «».';ArrayOf(StepName;Wizard.Name));ecWarning))
EndExcept
  // Перебираем его элементы
foreach Element in Elements
  // Если элемент формы связан с параметром
  if Element.ElementType = wfetQueryParameter
    // Получить параметр
    Param = Element.Parameter
    // Для разных типаов параметров формировать значение по-разному
    // Для параметров типа Запись справочника брать Наименование
    if in(ArrayOf(wptReferenceRecordInfo; wptUser); Param.ParamType)
      ParamValue = ''
      if Assigned(Param.Value)
        if Param.ParamType = wptUser
          ParamValue = Param.Value.FullName
        else
          ParamValue = Param.Value.Name
        endif
      endif
    else
      // Для параметров типа Список записей справочников сформировать нумерованный список
      if in(ArrayOf(wptReferenceRecordInfoList; wptUserList; wptEDocumentInfoList); Param.ParamType) 
        ParamValue = ''
        if Assigned(Param.Value)
          ParamValue = TAB
          foreach Record in Param.Value
            if Param.ParamType = wptUserList
              ParamValue = AddSubString(Format('%s%s'; ArrayOf(TAB & TAB; Record.FullName)); ParamValue; CR)
            else
              ParamValue = AddSubString(Format('%s%s'; ArrayOf(TAB & TAB; Record.Name)); ParamValue; CR)
            endif
          endforeach
        endif 
      else
        // Для всех остальных типов параметров взять просто значение
        ParamValue = Param.Value  
      endif         
    endif
    ParamValue = Format('%s%s: %s'; ArrayOf(TAB; Param.Title; ParamValue))
    Result = AddSubString(ParamValue; Result; CR)
  endif    
endforeach

*. Часто пользуюсь заполняемым реквизитом типа признак в диалогах, динамически высчитываю ID очередной записи. Ф-я "_GetNextSymvInCount"

If not Assigned(CurrentValueOfCount)
  Raise(CreateException('';'Не передано значение параметра CurrentValueOfCount';ecWarning))    
endif

  // До 10 можем вернуть текущее значение счётчика, это ОК, т.к. цифра однозначная (а не двузначная и больше)
If CurrentValueOfCount < 10
  Result = CurrentValueOfCount
Else
  // Будем возвращать буквы англ. алфавита. Их 26. Сперва вернём заглавные буквы, потом прописные
    // Заглавные
  If CurrentValueOfCount >=10 and CurrentValueOfCount <=36
      // Буква "A" имеет код 65. "Z" - код 90.
    CurrentValueOfCount = 55+CurrentValueOfCount
      // Получаем символ по коду
    Result = Char(CurrentValueOfCount)
    
    // Прописные
  else if CurrentValueOfCount >= 37 and CurrentValueOfCount <=63
  
      // Буква "a" имеет код 97. "Z" - код 122.
    CurrentValueOfCount = 60+CurrentValueOfCount
      // Получаем символ по коду
    Result = Char(CurrentValueOfCount)
  
  else
    Raise(CreateException('';'Слишком большое значение счетчика, нет сопоставимых букв';ecWarning))
  Endif Endif
EndIf

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

i = 1
while ...
Object.Requisites("ChooseUser").Items.Add(_GetNextSymvInCount(i); Record.SYSREQ_CODE; Record.SYSREQ_NAME)
i = i + 1
endwhile
// включая выставить значением по умолчанию первое значение списка
Object.Requisites("ChooseUser").Value = Object.Requisites("ChooseUser").Items.Value.Value

* Иногда приходилось дебажить таблицы с скрытыми реквизитами, отображает все записи и все реквизиты и их значения переданной DDS

  // Таблица данных, основная или дополнительная, которую будем сканировать
If not Assigned(DataSet)
  Raise(CreateException('EDIRInvalidUserAction'; LoadStringFmt('DIR82CF5DAD_AD28_4B83_9B21_D3561FE30F62'; 'COMMON'; 'DataSet'); ecWarning))
EndIf

  // Список строк, в который будем записывать информацию о реквизитах
RequisiteList= CreateStringList()
  // Разделитель между строками – знак переноса строки, CR
RequisiteList.Delimiter = CR

RequisiteList.Add('Количество записей: «'& DataSet.RecordCount &'»')
RequisiteList.Add('Количество реквизитов: «'& DataSet.RequisiteCount &'»')
RequisiteList.Add(' ')
  // Пройдёмся по каждой записи
ForEach Record in DataSet
  ReqIndex = 0
  RequisiteList.Add('Запись номер: «'& Record.SYSREQ_LINE_NUMBER &'»')  
    // Пройдемся по всем реквизитам текущей записи
  while ReqIndex < DataSet.RequisiteCount
    Record = DataSet.RequisiteByIndex(ReqIndex) 
    RequisiteList.Add('Req Name          - «'& Record.Name &'»')
    RequisiteList.Add('Req Field Name    - «'& Record.SQLFieldName &'»')  
    RequisiteList.Add('Req SQLField Name - «'& Record.FieldName &'»')
    If Record.DataType == rdtText
      RequisiteList.Add('Req Value is text, skipping')
    Else
      RequisiteList.Add('Req Value         - «'& Record.AsString &'»')
    EndIf
    RequisiteList.Add("----------") 
    ReqIndex = ReqIndex + 1
  endwhile
RequisiteList.Add('=======================================')
RequisiteList.Add(' ')    
EndForEach  
EditText(RequisiteList.DelimitedText)      


* Полезная и малоиспользуемая фича - объявление переменной сразу в разрезе определенной ТКЭД. Вспоминаю только когда смотрю в блокнот, никак не привыкну 

EDoc : IEDocument.TFD_DCTS_EML = 

* Всякие формы для проверки реквизитов вовсе записал в конструкции редатора кода ISBL и теперь быстро вызываю, например, оформление "красивых" стен аля

/*------------------------------------------------------------------------------
                    
------------------------------------------------------------------------------*/

//----------------------------------------------------------------------------//

Или, например самое частоиспользуемое в функциях и сценариях, такая обертка

If not Assigned(XXX)
  Raise(CreateException('EDIRInvalidUserAction'; LoadStringFmt('DIR82CF5DAD_AD28_4B83_9B21_D3561FE30F62'; 'COMMON'; 'XXX'); ecWarning))     
EndIf   

 

Копилка — это полезно. Объединить копилки — двойная польза. Но сваливать их в кучу в комментариях, наверное, не самый классный способ организации знаний. Смотрите, у нас есть база знаний, есть "Вопросы", есть даже примеры кода в справке. Как считаете, есть ли у какого-то из этих инструментов перспектива превратиться в удобную базу сниппетов для решения типовых задач? Какого функционала от такой базы ожидаете вы? Чего не хватает сейчас? Почему до сих пор в блокнотиках? :)

Мои 5 копеек — список ИД групп пользователей, подчиненных группе "Developers" и просто "рыба" для написания рекурсивных запросов:

PIPELINE = "|"
InitialGroupName = "Developers"
Query = Format("with GroupTree (GroupID) as
                (
                  select  UserID
                  from    MBUser
                  where   UserKod = '%s'
                          and UserType = 'Г'
                  
                  union all
                  
                  select  Groups.UserID
                  from    MBUser Groups
                          join GroupTree on GroupTree.GroupID = Groups.ParentGroup
                  where   Groups.ParentGroup is not null
                  
                )
                
                select * from GroupTree
                option (maxrecursion 32)"; InitialGroupName)
RMGroupTree = SQL(Query; ; PIPELINE)

 

 

Поделюсь и я чем-нибудь

// Регулярные выражения
ValueString = 'ФИО - Петрович Л Л
Дата приёма - 15.03.2019
Должность - тест
Подразделение - тест
Организация - тест
Инв. номер оборудования - тест
Тел. номер - 
Доп. информация - 
Контактное лицо - Разуваева Мария Валерьевна'
RegExp = CreateObject('VBScript.RegExp')
RegExp.Global = TRUE 
RegExp.IgnoreCase = TRUE
RegExp.Multiline = TRUE        
RegExp.Pattern = "(.*)\s\-\s(.*)"
Matches = RegExp.Execute(ValueString)
i = 0
while i < Matches.Count
  Match = Matches.Item(i).Value
  ShowMessage(Match)  
  Submatches = Matches.Item(i).Submatches
  Submatch0 = Submatches.Item(0)
  Submatch1 = Submatches.Item(1)
  ShowMessage(Submatch1)
  i = i + 1 
endwhile



// Формирование документа PDF из документа Excel при помощи VBAScript
PathFilelExcel = "C:\test\test.xlsx"
PathFilelPDF = "C:\test\test.pdf" 
ScriptControl = CreateObject("MSScriptControl.ScriptControl")
ScriptControl.Language = "VBScript"
ScriptControl.Reset
Script = '  
  On Error Resume Next
    Set objExcel = GetObject(, "Excel.Application")
  If objExcel Is Nothing Then Set objExcel = CreateObject("Excel.Application")
  On Error GoTo 0  
    
  Set objWorkbooks = objExcel.Workbooks.Open("%0:s")
  Set objWorksheets = objWorkbooks.Worksheets(1)
  objExcel.DisplayAlerts = False
  objWorkbooks.SaveAs "%1:s", 57
  objWorkbooks.Close
  Set objWorkbooks = Nothing
  Set objWorksheets = Nothing
  Set objExcel = Nothing
  '
Script = Format(Script; ArrayOf(
  PathFilelExcel;
  PathFilelPDF
))
ScriptControl.ExecuteStatement(Script)



// Формирование документа PDF из документа Excel при помощи DCOM 
PathFilelExcel = "C:\test\test.xlsx"
PathFilelPDF = "C:\test\test.pdf"
FormatType = 0 // формат документа - PDF
FormatQuality = 1 // качество экспортируемого файла 
IncludeDocProperties = true
IgnorePrintAreas = true
Excel = CreateObject('Excel.Application')
Book = Excel.Workbooks.Open(PathFilelExcel)
Sheets = Book.Sheets(1)
Sheets.ExportAsFixedFormat(FormatType; PathFilelPDF; FormatQuality; IncludeDocProperties; IgnorePrintAreas)
Book.Close()
Excel.Quit()



// Выбор пользователей с моментальным открытием справочника
Result = CreateInputDialog('Пользователи'; ''; 'ReferenceM:ПОЛ';'Параметры типового маршрута';;;;;'User')
Result.Form.ShowNoModal                   
Result.Form.Actions.FindAction('LookupAction').Execute

 

Немного полезных функций для работы с пользователями

        LD_AddUserListToUserList
        LD_ConvertStringListToUsers
        LD_ConvertUsersToStringList
        LD_UserListAddUser
        LD_UserListDeleteUser
        LD_UserListMerge

Прикреплен файл: func_users.zip

Сергей Меньших: обновлено 22.08.2019 в 15:23

Копилка - штука полезная. Тем, кто будет использовать рекомендации Тараса, крайне рекомендую в п.3 вместо вызова исключения при отсутствии нужного документа ставить признак обязательной запрашиваемости у соответствующего параметра; а соответствие вида/типа проверять уже после запроса параметров. Текущий метод из п.3 кастрирует доступные способы инициирования задач по ТМ.

Свою копилку не собирал, но несколько примеров докину:

При разработке типов справочников, событие Сохранение возможность:

 // Не давать сохранять не утвержденные записи
  if Object.Requisites(SYSREQ_RECORD_STATUS).AsString == "?"
    // Должны быть заполнены все обязательные реквизиты
    Message = LoadString('DIRF1E053C9_B6E2_4F21_B056_B00E7F4D435D'; 'DISI')
    Raise(CreateException('EDIRInvalidRequisiteValue'; Message; ecWarning))
  endif

Переопределение выбора записи справочника на пользовательский, на примере Работников:

  ADD_WHERE_VARIABLE_NAME = "AddWhereCondition"
  REQUISITE_DEPARTMENT = "Подразделение"
  
  // Добавить в фильтр условие, что у работника указан пользователь и работник действующий
  EmplRef = CreateReference('РАБ')
  UserRef = CreateReference('ПОЛ')
  AddWhere = Format("%0:s.%1:s = 'Д' AND %0:s.%2:s IN (SELECT usr.%3:s FROM %4:s usr WHERE %0:s.%2:s = usr.%3:s AND usr.%5:s = 'Д')"; ArrayOf(
    EmplRef.SQLTableName; EmplRef.Requisites(SYSREQ_STATE).SQLFieldName;
    EmplRef.Requisites('Пользователь').SQLFieldName;
    UserRef.Requisites(SYSREQ_ID).SQLFieldName; UserRef.SQLTableName;
    UserRef.Requisites(SYSREQ_STATE).SQLFieldName
  ))
  Object.Environment.SetVar(ADD_WHERE_VARIABLE_NAME; AddWhere)
  
  SelectFromReferenceAction('РАБ'; SelectMode; InputValue; Requisite;)
  
  if Object.Environment.IndexOfName(ADD_WHERE_VARIABLE_NAME) >= 0
    Object.Environment.PopVar(ADD_WHERE_VARIABLE_NAME)
  endif
  
  EmplRef = nil
  UserRef = nil

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

  UserName = Application.Connection.UserName
  User = ServiceFactory.GetUserByName(UserName)
  UserID = User.ID
  GroupRefID = ИДТипСпр('ГПЛ')
  
  // Проверить вхождение пользователя или замещаемого в группы пользователей
  Query = "
          DECLARE
          @UserID int;
          SET @UserID = " & UserID & "
          SELECT 1 WHERE
          EXISTS(SELECT RightsAs.UserID
          FROM dbo.SBFullAccessRights RightsAs
          INNER JOIN dbo.MBAnValR UserGroupsT ON (UserGroupsT.Vid = " & GroupRefID & " AND UserGroupsT.PolzovatelT = RightsAs.UserOrGroupID)
          INNER JOIN dbo.MBAnalit UserGroups ON (UserGroupsT.Analit = UserGroups.Analit AND UserGroups.Dop IN ('<имя группы 1>','<имя группы 2>',...))
          WHERE RightsAs.UserID = @UserID)"
  MemberOfGroups = Assigned(SQL(Query))

 

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

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

Но база сниппетов — это другое. На мой взгляд, это общедоступная база готовых примеров кода для решения  задач, не обязательно часто встречающихся. Причем для одной и той же задачи сниппетов может быть несколько (один — быстрый, другой — красивый  ). Предложить свой сниппет в базу может любой ее пользователь, и его сниппет после модерации, сразу доступен всем. Модерация нужна — кто-то должен следить за тем, чтобы сниппеты, как минимум, удобно и единообразно искались, чтобы не было совсем уж дублирующихся. Сниппеты должны находиться как поисковым запросом по фрагменту сниппета, так и по тегам. Кроме того, нужна возможность просто серфить по базе — когда поиск нужных результатов не дал, я захочу пройти сам по дереву сниппетов и найти что-то близкое к моей задаче. По какому принципу строить дерево, и дерево ли — отдельный вопрос.

Алексей Семакин: обновлено 30.08.2019 в 17:45
Авторизуйтесь, чтобы написать комментарий