Вопрос

Добрый день!

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

У меня такой же вопрос

4 комментария
Лучший ответ

нет, точнее так:

1. Если запускаете из пользовательского интерфейса - там только на запуск, нельзя отследить окончание выполнения.

2. Если есть преднастроенные страницы (кастомные), то можно в них последовательно включать и выключать маску.

3. Никто не помешает пользователю нажать рефреш :)

нет, точнее так:

1. Если запускаете из пользовательского интерфейса - там только на запуск, нельзя отследить окончание выполнения.

2. Если есть преднастроенные страницы (кастомные), то можно в них последовательно включать и выключать маску.

3. Никто не помешает пользователю нажать рефреш :)

Дмитрий Степанов,

Дмитрий, добрый день!
Спасибо за предложенные варианты.
Мне не совсем они подходят, возможно я не совсем точно описал кейс.
Кейс состоит в том, что:
последовательно выполняются три подпроцесса:
1) Первый заканчивается

преднастроенной страницей, далее идет переход во 2-й подпроцесс

2) Второй подпроцесс без страниц, и он выполняется достаточно долго(порядка 10 сек). В это время отображается единое окно и пользователь может быть сбит с толку.

3) После выполнения 2-го процесса запускается 3-й процесс с преднастроенной страницей. 

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

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

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

 

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

Александр, спасибо за идею. Похоже на самый реалистичный вариант.

Войдите или зарегистрируйтесь, чтобы комментировать
Вопрос

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

Известный модуль MultiMaskEdit позволяет реализовать маску, но значение в базу данных записывает в таком же виде. Если при сохранении очистить значение от ненужных символов, то при последующей загрузке значение не отображается, т.к. не соответствует маске. Также не отображаются частичные значения.
Например при маске +7(999) 999-99-99 и значении +7(999) 123-34-5 мы не увидим значения.

У меня такой же вопрос

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

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

Хардкод-решение. Сделать два поля, одно — номер с символами, другое — только цифры. Маску привязать к первому полю. Второе заполнять программно при изменении первого (при помощи БП или триггера в БД).

Александр, спасибо, пока примерно так и работает. Думал, может есть какое-то красивое решение.

Войдите или зарегистрируйтесь, чтобы комментировать
Вопрос

Добрый день!
Подскажите пожалуйста, есть ли возможность реализовать для версии 5.4, ввод телефона по фиксированной маске, например: +7 (___) _______ ?

У меня такой же вопрос

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

Да, такая возможность есть (см. в конце статьи).

Спасибо, ценный материал!

Войдите или зарегистрируйтесь, чтобы комментировать
Вопрос

Коллеги. доброго вечера!
Каким образом можно изменить маску ввода E-mail в детали "Средства связи контрагента"? Проблема в том, что она сейчас не принимает адрес в домене *.company - в маске стоит ограничение на 4 символа в строке после точки (а нужно 7)

У меня такой же вопрос

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

В общем и целом расписано здесь (см. пример 2)

Но нужно сказать, что у нас на версии 7.5 этот пример оказался некорректен в плане переопределения метода addItem, так как он не возвращает никаких item. Поэтому пришлось его полностью скопипастить из родительской BaseCommunicationDetail и заменить строчку

this.addColumnValidator("Number", newItem.validateField, newItem);

на

this.addColumnValidator("Number", this.validateCommunicationFormat, newItem);

Ну и, конечно, определить метод validateCommunicationFormat, в котором проверять в зависимости от типа средства связи по регэкспу формат и возвращать объект с invalidMessage и fullInvalidMessage.

Андрей, большое спасибо, всё получилось!

{
                validateEmailFormat: function (value) {
                    var invalidMessage = "";
                    var isValid = true;
                    var communicationType = this.get("CommunicationType");
                    var number = value || this.get("Number");
                    // Проверка введенного E-mail на соответствие маске ввода.
                    if (communicationType.value == "ee1c85c3-cfcb-df11-9b2a-001d60e938c6") {	// E-mail
                        isValid = (Ext.isEmpty(number) || new RegExp("^[0-9a-z_]+@[0-9a-z_]+\.[a-z]{2,10}$").test(number));
                        if (!isValid) {
                            invalidMessage = "Укажите E-mail по формату";
                        }
                    }
                    return {
                        fullInvalidMessage: invalidMessage,
                        invalidMessage: invalidMessage
                    };
}

Замечательно. Наверное стоит еще добавить дефис в список символов допустимых в E-mail. Только нужно добавлять его либо самым последним перед ], либо первым - сразу после [

ещё вопрос возник - как заставить код принимать русские символы в e-mail? Например, для info@сайт.рф. Вариант ^[0-9a-z_-\.]+@[0-9a-zа-яё_-\.]+\.[a-zа-яё]{2,10}$ почему-то не срабатывает

Здравствуйте, Антон!

Ваш вариант не будет работать.
Корректной маской будет:

var emailPattern = /^[a-zA-Z0-9._-]+@[a-zA--ЯА-Я0-9.-]+\.[a-zA--яА-Я]{2,10}$/;

Алексей, предложенный Вами вариант тоже не сработал. Может быть, для работы с кириллицей что-то дополнительно подключить нужно?

Несколько уточняющих уточняющих вопросов:
1) Вы замещали EmailHelper?
2) После замещения EmailHelper Вы скопировали весь код из материнской схемы и заменили одну строку определения параметра emailPattern?
3) После сохранения схемы необходимо очистить кэш браузера. Вы это сделали?

1. Замещал BaseCommunicationDetail
2. -
3. -

Тогда:
1) Заместите EmailHelper. В замещающую схему вставьте следующий код:

define('EmailHelper', ['ext-base', 'terrasoft', 'EmailHelperResources', 'ConfigurationConstants', 'MaskHelper'],
	function(Ext, Terrasoft, resources, ConfigurationConstants, MaskHelper) {
 
		function isEmailAddress(emailAddress) {
			var emailPattern = /^[a-zA-Z0-9._-]+@[a-zA--яА-Я0-9.-]+\.[a-zA--яА-Я]{2,9}$/;
			return emailPattern.test(emailAddress);
		}
 
		function getEmailUrl(emailAddress) {
			if (isEmailAddress(emailAddress)) {
				return 'mailto:' + emailAddress;
			}
			return '';
		}
 
		function onEmailUrlClick(emailAddress) {
			var url = getEmailUrl(emailAddress);
			if (!Ext.isEmpty(url)) {
				var win = window.open(url, '', 'height=1,width=1');
				setTimeout(function() {
					win.close();
				}, 1000);
			}
		}
 
		return {
			isEmailAddress: isEmailAddress,
			getEmailUrl: getEmailUrl,
			onEmailUrlClick: onEmailUrlClick
		};
	});

2) Очистите кэш.

В результате Вы сможете создавать средства связи с типом Email с кириллическими символами в домене (например *.почта.рф) , а также с длиной домена в 9 символов (например, *.travel)

Алексей, работает, спасибо!

Войдите или зарегистрируйтесь, чтобы комментировать
Вопрос

Добрый день. Необходимо в bpmonline 7.5 на детали "Средства связи" в контактах, по аналогии, сделать как здесь http://www.community.terrasoft.ru/forum/topic/11152. Но проблема в том, что эти поля добавляются динамически. Не подскажите в каком направлении двигаться?

У меня такой же вопрос

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

Приложил обновленный контрол и инструкцию.
maski_vvoda.rar

Андрей, спасибо за помощь.

"Андрей Каспаревич" написал:

Приложил обновленный контрол и инструкцию.
maski_vvoda.rar

Андрей, здравствуйте!

Возможно, существует новая версия этого контрола? Обнаружился ряд проблем на версии 7.9, в частности при установке маски на деталь Средств связи не работает добавление Facebook.

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

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

"Смородинов Денис" написал:Возможно, существует новая версия этого контрола?

Новой версии к сожалению нет. Но вы можете доработать текущую самостоятельно.

Переработал существующую.

На всякий случай: из схемы BaseCommunicationDetail в инструкции из архива удалил переопределение метода addItem. В этом случае синхронизация и подключение соцсетей работает как надо. Версия 7.9 sales.

Переработал существующую.

На всякий случай: из схемы BaseCommunicationDetail в инструкции из архива удалил переопределение метода addItem. В этом случае синхронизация и подключение соцсетей работает как надо. Версия 7.9 sales.

Войдите или зарегистрируйтесь, чтобы комментировать
Вопрос

У нас реализована раздельная автоматическая нумерация счетов и документов для разных юр.лиц нашей компании. То есть, если юр. лицо Xxx, то по маске для Xxx документам и счетам присваивается присваиваются соответствующие номера с префиксом X. Если Yyy - то с префиксом Y.
Для счетов в src_InvoiceEditScript по событию OKClick обрабатываем функцию btnOKOnClick(), где в зависимости от значения поля 'SupplierID' (поставщик) вызываем SetItemSystemNumber() с разными значениями.

function btnOKOnClick(Control) {
        var Dataset = dlData.Dataset;
        var DefaultValues = GetAttribute(Self, 'DefaultValues');
        var WorkflowItemID = Dataset.ValAsStr('WorkflowItemID');
        if (Dataset.State != dstInsert) {
                if (!ClearVises('InvoiceVises', 'InvoiceID', Dataset('ID'))) {
                        return;
                }
        }
    var oDate = new Date();
    var DYear = oDate.getYear();
    DYear = DYear - 2000;
    var SYear = DYear.toString();
        if (Dataset.Values('InvoiceNumber') == null) {         
                if (Dataset.Values('SupplierID') == '{7F8B1E5C-C450-47C6-B770-1AF0CBCAF591}') {
                //ShowConfirmationDialog(Dataset.Values('SupplierID'));
            SetItemSystemNumber('InvoicePro', Dataset, 'InvoiceNumber');
            } else
                if (Dataset.Values('SupplierID') == '{933958B9-E358-4A98-8A02-5BAD9AC869A8}') {
            SetItemSystemNumber('InvoiceIp', Dataset, 'InvoiceNumber');
            } else
            if (Dataset.Values('SupplierID') == '{61773DB2-980C-49F2-881D-8BD59EC1A0AA}') {
            SetItemSystemNumber('InvoiceTch', Dataset, 'InvoiceNumber');
            } else
            if (Dataset.Values('SupplierID') == '{006B2B81-D597-40E9-A4EC-73171D224F5C}') {
            SetItemSystemNumber('InvoiceBLD', Dataset, 'InvoiceNumber');
            } else
                if (Dataset.Values('SupplierID') == '{084FA6BB-4421-4E23-9641-1E8D11D407C8}') {
                SetItemSystemNumber('InvoiceGms', Dataset, 'InvoiceNumber');
            } else {
            SetItemSystemNumber('Invoice', Dataset, 'InvoiceNumber');
            }
            var GeneratedNumber = Dataset.Values('InvoiceNumber') + '/' + SYear;
                  Dataset.Values('InvoiceNumber') = GeneratedNumber;
        }      
        InvoiceEdit.IsCompleting = true;
        if (CheckItemNumberDuplicate('Invoice', Dataset, 'InvoiceNumber',
                "Счет")){
                if (!scr_BaseDBEdit.btnOKOnClick(Control)) {
                        return;
                }
        }
        var IsCreatedByDocumentID = Self.Attributes('IsCreatedByDocumentID');
        if (IsCreatedByDocumentID) {
                if (ShowConfirmationDialog("Перейти к созданному счету?") == wmrYes) {
                        GotoWorkspace('wnd_InvoicesWorkspace', BaseDBEdit.RecordID);
                }
        }
        if (Self.IsVisible) {
                return;
        }
        ProcessWorkflowItem(WorkflowItemID);
}

Аналогичным реализована работа с названиями для документов в src_DocumentEditScript:

function dlDataOnDatasetBeforePost(Dataset, DoPost) {
    var oDate = new Date();
    var DYear = oDate.getYear();
    var DMonth = oDate.getMonth()+1;
    var DDate = oDate.getDate();
    DYear = DYear - 2000;    
    var SYear = DYear.toString();
    if (DMonth10)
     {
      var SMonth = '0' + DMonth.toString();
     }
    else {
          var SMonth = DMonth.toString();
         }
        if (DDate10)
         {
          var SDate = '0' + DDate.toString();
         }
        else {
          var SDate = DDate.toString();
         }  
    var DocumentTypeID = Dataset('DocumentTypeID');    
        if (Dataset.Values('DocumentNumber') == null) {
            if (DocumentTypeID == '{D8525E18-F8FE-4583-9E54-CA43A7129C45}' || DocumentTypeID == '{DE983B1A-6CF3-4A79-AF34-DCB6A2D0DB76}') /* Акт и Торг12 */
             {
                  var InvoiceID = Dataset.Values('InvoiceID');
              if (InvoiceID != null) {
                        var InvoiceDataset = Services.GetNewItemByUSI('ds_Invoice');
                    ApplyDatasetFilter(InvoiceDataset, 'ID', InvoiceID, true);
                    InvoiceDataset.Open();
                    var InvoiceSupplierID = InvoiceDataset('SupplierID');
                    InvoiceDataset.Close();
                  }
                  else {
                        MessageBox("Нет привязанного счета!");
                  }
                  if (InvoiceSupplierID == '{7F8B1E5C-C450-47C6-B770-1AF0CBCAF591}') {
                SetItemSystemNumber('DocumentPro', Dataset, 'DocumentNumber');
                var GeneratedNumber = Dataset.Values('DocumentNumber');
              } else
                  if (InvoiceSupplierID == '{006B2B81-D597-40E9-A4EC-73171D224F5C}') {
                SetItemSystemNumber('DocumentBLD', Dataset, 'DocumentNumber');
                var GeneratedNumber = Dataset.Values('DocumentNumber');
              } else
                  if (InvoiceSupplierID == '{933958B9-E358-4A98-8A02-5BAD9AC869A8}') {
                SetItemSystemNumber('DocumentIp', Dataset, 'DocumentNumber');
                var GeneratedNumber = Dataset.Values('DocumentNumber');
              } else
              if (InvoiceSupplierID == '{61773DB2-980C-49F2-881D-8BD59EC1A0AA}') {
                SetItemSystemNumber('DocumentTch', Dataset, 'DocumentNumber');
                var GeneratedNumber = Dataset.Values('DocumentNumber');
              } else
              if (InvoiceSupplierID == '{084FA6BB-4421-4E23-9641-1E8D11D407C8}') {
                SetItemSystemNumber('DocumentBgm', Dataset, 'DocumentNumber');
                var GeneratedNumber = Dataset.Values('DocumentNumber');
              } else {
                SetItemSystemNumber('Document', Dataset, 'DocumentNumber');
                var GeneratedNumber = Dataset.Values('DocumentNumber');
              }
             }    
            else if (DocumentTypeID == '{584720AE-7F93-461B-BE79-AFA15A4D85D4}') /* Входящий */
             {
              SetItemSystemNumber('DocumentVI', Dataset, 'DocumentNumber');
              var ii = 0;
              var array = Dataset.Values('DocumentNumber').split("");
              for(var i = 0; i array.length; i++)
               {
                if (array[i] == '№')
                 {
                  var ii = 1;
                 }
                   }
              if (ii != 1)
               {
                var GeneratedNumber = 'ВХ-' + Dataset.Values('DocumentNumber');
                Dataset.Values('DocumentNumber') = GeneratedNumber;    
               }
             }
            else if (DocumentTypeID == '{EFFB172C-B755-4E77-BFC8-3B121140C74F}') /* Исходящий */
             {
              SetItemSystemNumber('DocumentVI', Dataset, 'DocumentNumber');
              var ii = 0;
              var array = Dataset.Values('DocumentNumber').split("");
              for(var i = 0; i array.length; i++)
               {
                if (array[i] == '№')
                 {
                  var ii = 1;
                 }
                   }
              if (ii != 1)
               {
                var GeneratedNumber = 'ИСХ-' + Dataset.Values('DocumentNumber');
                Dataset.Values('DocumentNumber') = GeneratedNumber;    
               }
             }
            else if (DocumentTypeID == '{DD6B6F0E-FD7B-42EF-95D0-486A2EFC02B3}') /* Счет-фактура */
             {
                  var InvoiceID = Dataset.Values('InvoiceID');
              if (InvoiceID != null) {
                        var InvoiceDataset = Services.GetNewItemByUSI('ds_Invoice');
                    ApplyDatasetFilter(InvoiceDataset, 'ID', InvoiceID, true);
                    InvoiceDataset.Open();
                    var InvoiceSupplierID = InvoiceDataset('SupplierID');
                    InvoiceDataset.Close();
                  }
                  else {
                        MessageBox("Нет привязанного счета!");
                  }
                  if (InvoiceSupplierID == '{7F8B1E5C-C450-47C6-B770-1AF0CBCAF591}') {
                        SetItemSystemNumber('DocumentIF', Dataset, 'DocumentNumber');
                var GeneratedNumber = 'СФ-БПР-' + Dataset.Values('DocumentNumber');
                Dataset.Values('DocumentNumber') = GeneratedNumber;
              } else
                  if (InvoiceSupplierID == '{933958B9-E358-4A98-8A02-5BAD9AC869A8}') {
                        SetItemSystemNumber('DocumentIF', Dataset, 'DocumentNumber');
                var GeneratedNumber = 'СФ-ДНБ-' + Dataset.Values('DocumentNumber');
                Dataset.Values('DocumentNumber') = GeneratedNumber;
              } else                                                                      
                  if (InvoiceSupplierID == '{006B2B81-D597-40E9-A4EC-73171D224F5C}') {
                        SetItemSystemNumber('DocumentIF', Dataset, 'DocumentNumber');
                var GeneratedNumber = 'СФ-БЛД-' + Dataset.Values('DocumentNumber');
                Dataset.Values('DocumentNumber') = GeneratedNumber;
              } else                                                                      
              if (InvoiceSupplierID == '{61773DB2-980C-49F2-881D-8BD59EC1A0AA}') {
                        SetItemSystemNumber('DocumentIF', Dataset, 'DocumentNumber');
                var GeneratedNumber = 'СФ-ТЧК-' + Dataset.Values('DocumentNumber');
                Dataset.Values('DocumentNumber') = GeneratedNumber;
              }                                                                          
              if (InvoiceSupplierID == '{084FA6BB-4421-4E23-9641-1E8D11D407C8}') {
                    SetItemSystemNumber('DocumentIfBgm', Dataset, 'DocumentNumber');
                var GeneratedNumber = 'СФ-' + Dataset.Values('DocumentNumber');
                Dataset.Values('DocumentNumber') = GeneratedNumber;
              }                                                                          
              else {
                var GeneratedNumber = Dataset.Values('DocumentNumber');
              }    
             }
            else {
              SetItemSystemNumber('Document', Dataset, 'DocumentNumber');
              var GeneratedNumber = Dataset.Values('DocumentNumber');
             }
             var GeneratedNumber = Dataset.Values('DocumentNumber') + '/' + SYear;
             Dataset.Values('DocumentNumber') = GeneratedNumber;
     }
}

Так было заведено несколько юр. лиц и для них всё замечательно работало. Сейчас я добавил ещё одно юр. лицо. Раздельная автоматическая нумерация с нужным префиксом по маске работает замечательно, но в отчётах по документам и счетам (ТОРГ-12, счет-фактуры, счтеа и др.) выводится только футер (там только одно статическое поле memo не связанное не получающие никаких данных ни из каких датасетов).

Есть подозрение, что нужно было поправить ещё где-то. но я совершенно не помню где ещё.
Подскажите, что я забыл?

У меня такой же вопрос

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

что-то я не уловил связи между нумерацией и отчетами


но в отчётах по документам и счетам выводится только футер

И? Тоже не понял в чем проблема. В отчетах номер не выводится вообще или как?

Войдите или зарегистрируйтесь, чтобы комментировать
Вопрос

Добрый день,
Подскажите как можно реализовать ввод телефона по маске +7 (ххх) ххххххх?
Версия 7.4

У меня такой же вопрос

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

Здравствуйте, Олег!

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

Олег, во вложении документик, посмотрите.

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

Олег, понял спасибо. Есть примерчик для фиксированной маски (т.е. нет возможности изменять на лету, к примеру с маски для рос. телефона на маску для укр. телефона). Если интересует - ближе к вечеру могу скинуть.

Дмитрий, как раз фиксированная и нужна, спасибо, буду ждать

Дмитрий?

Да, я тут, извиняюсь.

Во вложении контрол позволяющий вводить текст по массиву масок.

Чтобы его использовать необходимо добавить этот модуль в dependency страницы и в секцию define, а в diff поля указать, что необходимо использовать класс MultiMaskEdit и его маску:

{
                    "operation": "merge",
                    "name": "MobilePhone",
                    "values": {
                                         "controlConfig": {
                                                             className: "Terrasoft.controls.MultiMaskEdit",
                                                             mask: {
                                                                                 formats: ["+7(999)999-99-99", "+380(99)999-99-99"]
                                                             },
                                                             onBeforePasteFormatValue: TSCCommon.getDigitsFromString
                                         }
                    }
}

Метод onBeforePasteFormatValue указываете, если хотите обработать значения перед вставкой из буфера обмена в контрол. Этот метод необязательный – контрол вставит только допустимые значения, но, например, если предварительно обработать вставляемую строку и оставить только цифры - то для маски выше телефон вставиться полностью, независимо от того какие символы использовались дополнительно.
По умолчанию в качестве символов подстановки в шаблонах маски используются:

{
                    //цифры
                    "9": {
                                         re: "[0-9]"
                    },
                    //кириллица
                    "к": {
                                         re: "[а-яА-ЯёЁ]"
                    },
                    //латинские
                    "l": {
                                         re: "[a-zA-Z]"
                    },
                    //любая буква
                    "c": {
                                         re: "[а-яА-ЯёЁa-zA-Z]"
                    },
                    //любая буква или цифра
                    "#": {
                                         re: "[а-яА-ЯёЁA-Za-z0-9]"
                    }
}

Вы можете задать собственный символ для шаблон ввода с помощью maskConfig, например, если вам нужна 9-ка как обычный символ, то можно указать что для подстановки цифр использовать «0». В re мы указываем регулярное выражение для проверки. Также необходимо указать символ заменяющие пустые значение в параметре placeHolderChar.
Например, так можно задать маску позволяющая вводить книжные коды (ISBN), где 978 это просто цифры, а «0» - подстановочный символ:

{
                    className: 'Terrasoft.controls.MultiMaskEdit',
                    value: {
                                         bindTo: 'ISBN'
                    },
                    mask: {
                                         formats: ["978-0-000-00000-0"]
                    },
                    maskConfig: {
                                         definitions: {
                                                             //цифры
                                                             "0": {
                                                                                 re: "[0-9]"
                                                             },
                                                             placeHolderChar: "_"
                                         }
                    }
}

Известная проблема – валидация контрола не передается в модель карточки, т.е. хотя контрол показывает что значение не верно, карточка все равно сохраняется. Пока что надо делать дополнительные проверки в карточке руками.

Спасибо

Дмитрий подскажите, не смог разобраться, как подключить Terrasoft.controls.MultiMaskEdit во вложении, чтобы его можно было добавить в dependencies и define?
Пробовал создать модуль, в него перенести код из вложения, подключил его в dependencies, объявил в define, но получаю следующую ошибку

GET http://*********/0/Nui/Terrasoft/controls/MultiMaskEdit.js?_dc=1416552545493 404 (Not Found)

Олег, к сожалению, не я автор данного контрола и сам не пробовал его реализовать (однако видел уже готовый пример по инструкции выше). Может быть проблема в пакете, в который вы добавили данный модуль? Прописаны ли в нём все зависимости?
Проверьте, пожалуйста, если не поможет - вынужден попросить Вас подождать с ответом, задам ваш вопрос автору, как только он вернется из заслуженного отпуска :)

Разобрался, объявил вложенный контрол как MultiMaskEdit вместо Terrasoft.controls.MultiMaskEdit и использовал уже короткое название, отлично работает. Спасибо

Добрый день!
Подскажите как использовать маску для телефона в зависимости от значения другого поля (например от страны)?

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

Спасибо, Дмитрий, большое!
Подсказали в каком направлении двигаться.

Контрол обновлен. В приложении описание и исходники.
maski_vvoda.rar

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

Александр, вместо

//цифры
                                                             "0": {
                                                                                 re: "[0-9]"
                                                             },

прописываете:

"l": {
                                         re: "[a-zA-Z]"
 },

Спасибо

Андрей Каспаревич пишет:

Контрол обновлен. В приложении описание и исходники.
maski_vvoda.rar

Андрей, а посвежее версии нет случаем?

Основное что тут не очень хорошо смотрится, это когда для редактирования еще пустого поля с маской кликаем в середину поля и попадаем для редактирования некрасиво в середину пустого шаблона...

Войдите или зарегистрируйтесь, чтобы комментировать
Публикация

Периодически возникает необходимость создавать маски номеров не стандартного типа (%1), а с использованием нулей в начале (например, 000000%1).

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

00000010

получиться следующая:

000000010

Есть некоторые варианты решения вопроса, но мы «выкрутились» простым кодом JavaScript:

1. Создали для примера следующую маску:

/system/files/invoicemask_1.png

2. Добавили следующий код для счетов:

         var CurrentNumber = Dataset.Values('InvoiceNumber');
         var CurrentNumberLength = CurrentNumber.length;
         if (CurrentNumberLength > 8) {
                   var NewNumber = CurrentNumber.substring(CurrentNumberLength - 8);
                   Dataset.Values('InvoiceNumber') = NewNumber;
         }

/system/files/invoice_2.png

В результате мы получили нумерацию такого типа:

/system/files/invoicenumber_3.png

Поделиться

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

Доброго времени суток всем!
Недавно вот придумал такой еще универсальный вариант:

В сервисе Common\Library\scr_CommonActions приведите функцию
function GenerateSystemNumber(ItemName) к виду:

function GenerateSystemNumber(ItemName) {
	var GeneratedNumber;
	var SystemParameterName = FormatStr('%1Number', ItemName);
	var MaskName = FormatStr('%1Mask', ItemName);
	var SystemNumber =
		GetSystemParameterValueEx(SystemParameterName, true) + 1;		
 
	try {
        var MaskLength = System.GetSystemSettingValue(FormatStr('%1Length', MaskName), false);
 
    	while (SystemNumber.toString().length < MaskLength) {
           SystemNumber = '0'.concat(SystemNumber);
        }
 
    } catch (e) {
    	Log.Write(0, e.message);
	} finally {
        //var MaskLength = null;
    }
 
	SetSystemParameterValue(SystemParameterName, SystemNumber);
	var Mask = GetSystemParameterValueEx(MaskName, false);
	if ((Mask != EmptyStr) && (Mask != undefined) && (Mask != null)) {
		GeneratedNumber = FormatStr(Mask, SystemNumber.toString());
	} else {
		GeneratedNumber = SystemNumber.toString();
	}
	return GeneratedNumber;
}

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

<Имя Разделя><Mask>Length

.

Например:
раздел Счета - Invoice
маска счета: InvoiceMask
количество символов номера в номере счета: InvoiceMaskLength

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

Есть вопрос: что будет, если в момент времени между выполнением строк

var SystemNumber =
                GetSystemParameterValueEx(SystemParameterName, true) + 1;

и

SetSystemParameterValue(SystemParameterName, SystemNumber);

то же самое проделает скрипт другого пользователя?

Например, если у нас в системе не 10-20 пользователей работают, а 200-500?

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

Если такая ситуация в жизни возможна - приведет только к тому, что в системе появится 2 счета с одинаковыми номерами. Но к ошибке это точно не приведет. Т.к. GetSystemParameterValueEx и SetSystemParameterValue приводят к обращению в СУБД, а она уже управляет очередью запросов.

Поэтому, теориетически, если рассматривать "чистую модель" ситуации, получение одного и того же параметра SystemParameterName возможно. Когда второй пользователь его уже получает пока первый еще не изменил. Но, фактически ситуация настолько маловероятна, если учесть что проме этих двух запросов в БД будет еще с десяток других идти, и все они будут в очередь попадать...

В целом, можно не беспокоиться.

Позволю себе не согласиться...

У нас регулярно происходят подобные ситуации, правда применительно к шагам процесса, а не генерации уникальных номеров. Когда-нибудь думаю дойдут руки поправить.

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

Войдите или зарегистрируйтесь, чтобы комментировать
Публикация

Добрый день, уважаемые пользователи интернет сообщества Terrasoft!

Как вы знаете, в системе BPMonline в таких сущностях как счет, документ и пр., существует поле "Номер", которое автоматически (если другой не указан) проставляется как номер предыдущей сущности плюс один. Иногда возникает необходимость добавить префиксы к нумерации, т.е к примеру счета нумеровать как С-1, С-2 и т.д., документы - Д-1, Д-2 и т.д.
Предлагаю Вам простой способ реализации автоматического проставления префиксов к номерам:
для этого Вам необходимо перейти в раздел «Системные настройки» меню [Инструменты] и открыть группу «Автонумерация записей». В этой группе откройте системную настройку «Маска номера инцидента» (документа, счета и т. д.)

1

и измените значение следующим образом:

I: {0} (для инцидента, другие префиксы - для других сущностей).

2

Приятной работы с BPMonline!

Поделиться

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

Добрый день!
А как например добавить текущую дату к номеру документа?
Какие-то еще маски кроме {0} целочисленных допускаются?
Или это уже на уровне базы данных нужно делать?
Спасибо

На уровне конфигурации.

Чтобы произвольным образом изменить маску, нужно доработать в схеме «Сгенерировать номер по порядку» функцию «GenerateNumberForSchemaName». Там на вход подаётся название раздела, можно для какого-то одного или для любого раздела заменять определённый макрос на текущую дату.

Если возникают вопросы о конретной реализации, напишите пример формата номера, который хотите получить.

Спасибо, Александр.
Нашел метод GenerateSequenseNumber в схеме «Сгенерировать номер по порядку» в пакете Base 7.5.0
Подскажите еще, как мне его переопределить в своем пакете? Создать свой бизнес-процесс?
Хочу формировать номер заказа в формате YYYY/MM-###

Ниже генерация номера договора (OrderPageV2) в формате Город: кодГорода + Знач.Сис.Настройки + НомерПопорядку(6 знаков) + Знач.Сис.Настройки + КодПродуктаВДоговоре.
Может поможет:

onEntityInitialized: function() {
				this.callParent(arguments);
				if (this.isAddMode() || this.isCopyMode() || this.get("NumberEx") === ""
                        || this.get("NumberEx") === undefined || this.get("NumberEx") === null) {
                    if (this.get("Number") === "") {
                        this.getIncrementCode(function (responce) {
                            this.set("Number", responce);
                        });
                    }
					var owner = this.get("Owner");
					if (!this.Ext.isEmpty(owner)) {
						this.getContactCityCode(owner, function(cityCode) {
							if (this.Ext.isEmpty(cityCode) || this.Ext.isEmpty(cityCode.city)) {
								this.set("Number", "");
								this.set("NumberEx", "");
								this.showMessage("Номер договора не сгенерирован. В карточке ответственного не указан город!");
								return;
							}
							else if (this.Ext.isEmpty(cityCode.code)) {
								this.set("Number", "");
								this.set("NumberEx", "");
								this.showMessage("Номер договора не сгенерирован. Для города ответственного не указан код!");
							} else {
								this.getProductCode(function(productCode) {
									if (this.Ext.isEmpty(productCode) || this.Ext.isEmpty(productCode.product)) {
										this.set("Number", "");
										this.set("NumberEx", "");
										this.showMessage("Номер договора не сгенерирован. В заявке нет продуктов!");
										return;
									} else if (this.Ext.isEmpty(productCode.code)) {
										this.set("Number", "");
										this.set("NumberEx", "");
										this.showMessage("Номер договора не сгенерирован. В продукте заявки не указан код!");
									} else {
										var OrderNumber = this.get("Number");
										while(OrderNumber.length < 6) {
											OrderNumber = "0" + OrderNumber;
										}
										var parentThis = this;
										Terrasoft.SysSettings.querySysSettingsItem("OrderNumberSeparator", function(value) {
											parentThis.set("NumberEx", cityCode.city + ": " + cityCode.code + value +
												OrderNumber + value + productCode.code);
											parentThis.set("Number", cityCode.city + ": " + cityCode.code + value +
												OrderNumber + value + productCode.code);
										});
									}
								});
							}
						});
					}
				}
			}

Спасибо большое!

Каким образом решить проблему с сортировкой по полю номер с использованием маски, т.к. поле "Номер" является текстовым и в следствии этого возникает следующая ситуация:

Вопрос с сортировкой продолжили обсуждать здесь.

Здравствуйте. Подскажите пожалуйста, а как настроить маску, чтобы нумерация была типа цифры-год. Чтобы каждый год естественно концовка менялась. К примеру, 1885-15
Благодарю

Какая версия используется?

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

Какая версия используется?

Здравствуйте, Александр. Используется версия 7.6

Войдите или зарегистрируйтесь, чтобы комментировать
Публикация

Иногда возникает необходимость "нумеровать" контрагентов (по аналогии с "масками" в других разделах). Для реализации можно рассмотреть следующий вариант.

Перед изменениями сделайте резервную копию базы.

Для такой возможности следует:

1. Зайти в системные настройки:

/system/files/1_55.png

2. Добавить новую настройку:

/system/files/2_38.png

3. Ввести следующие параметры:

/system/files/3_21.png

4. Создать еще одну настройку с такими параметрами:

/system/files/4_14.png

5. Далее открыть функцию ds_AccountOnDatasetBeforePost в скрипте scr_Account и добавить в ней строку:

SetAccountNumber(Dataset);

6. Также необходимо прописать функцию, которая будет вызываться:

function SetAccountNumber(Dataset) {
var AccountNumber = Dataset.Values('AccountCode');
if (IsEmptyValue(AccountNumber)) {
SetItemSystemNumber('Account', Dataset, 'AccountCode');
}
}

Где – 'AccountCode' название поля «Код» в конфигурации.

Сохраните изменения и проверьте работоспособность.

/system/files/6_1_0.png

Поле «Код» после сохранения будет заполняться автоматически.

/system/files/6_2_0.png

Поделиться

0 комментариев
Войдите или зарегистрируйтесь, чтобы комментировать