Добрый день!

Выполняю автонумерацию записей по статье:

 https://academy.terrasoft.ru/docs/developer/elements_and_components/bas….

На клиентской части все работает.

На серверной части Номер записи не формируется,

стал разбираться - не срабатывает действие [сгенерировать номер по порядку],

класс объявлен, но никакой обработки в нем нет:

public partial class GenerateSequenseNumberUserTask

    {

    }



Как на данный момент формируется автонумерация через БП?

Версия 7.17.4.

Нравится

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

Реализация лежит в файле GenerateSequenseNumberUserTaskPartial

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

Добрый день.

Вы же через процесс объекта добавляете серверную генерацию номера? Если да, то не забыли ли поток разместить в событийном подпроцессе? На скриншоте выделил, что я имею ввиду.

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

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

Спасибо!

Нравится

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

По идее если использовать формирование номер на событийном БП  (штатно как описано в документации) то после сохранения он должен отображатся на детали, посмотрите тут (Алгоритм реализации кейса на стороне сервера)

 

"Методы, которые работают для нумерации строк для обычной детали, в данном случае не работают"  - а что это за методы? Просто нигде в базовых версиях не видел нумерации строк в гриде.

Варфоломеев Данила,

Наверное речь о формировании номера для объекта по маске по аналогии с тем как это делается в карточке редактирования открываемой из реестра. 

По идее если использовать формирование номер на событийном БП  (штатно как описано в документации) то после сохранения он должен отображатся на детали, посмотрите тут (Алгоритм реализации кейса на стороне сервера)

 

Добрый день, коллеги! Спасибо за обратную связь!  

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

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

Я смотрю в решении Террасофта с маркета в Конструкторе отчетов даже это не сделано… там всегда проставляется по умолчанию просто 1… и далее ты сам сидишь и нумеруешь.

 

Похожее обсуждали тут. Возможно, такой код и для редактируемых будет работать.

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

При реализации вот этого примера, при компиляции, получаю следующую ошибку

Изображение удалено.

при детальном осмотре - вообще непонятно:

Изображение удалено.

Кто сможет пояснить в чем моя ошибка?

Нравится

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

3 скобки в конце =)

1 от getTypedColumnValue + 1 от stringIsNullOrEmpty + 1 от Convert

3 скобки в конце =)

1 от getTypedColumnValue + 1 от stringIsNullOrEmpty + 1 от Convert

разработка расположена в облаке. как можно внести изменение? 

Варфоломеев Данила пишет:

3 скобки в конце =)

1 от getTypedColumnValue + 1 от stringIsNullOrEmpty + 1 от Convert

Терещенко Алексей,

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

http://prntscr.com/kytzo0

далее переходите во вкладку конфигурация и в поиске ищите ту схему где реализован код - http://prntscr.com/kyu0ax

все как на скринах.

Терещенко Алексей,

подождите. это автосгенерированный код? если да, то никак.

+ можно скрин как у вас выполнен пункт 4.2 по гайду. что-то мне кажется, что вы дописали и скобку забыли

Нигрескул Алексей пишет:

Нигрескул Алексей

Это автосгенерированый код системы, которая расположена в облаке. 

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

Варфоломеев Данила пишет:

Варфоломеев Данила

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

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

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

повторил кейс - действительно кривые руки...

спасибо всем за помощь

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

Коллеги, добрый день!

Выполняем нумерацию собственного объекта (сметы).

Создали настройку, в которой хранится маска номера и текущий номер последнего созданного объекта (последний номер нужен еще для других целей).

Объект создается из другого через бизнес-процесс и при его создании необходимо не просто считать  настройку (текущий номер объекта), но и добавить к значению системной настройке единицу.

Подскажите пжлст можно ли это сделать через БП... городить код не хочется).

ЗАранее спасибо!)

Нравится

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

Из кода изменить настройку можно так, если дело касается общих настроек или значений по умолчанию:

Terrasoft.Core.Configuration.SysSettings.SetDefValue(userConnection, "SettingName", value);

Для текущего пользователя устанавливается так:

Terrasoft.Core.Configuration.SysSettings.SetValue(userConnection, "SettingName", value);

Для конкретного пользователя или группы:

Terrasoft.Core.Configuration.SysSettings.SetDefValue(userConnection, sysAdminUnitId, "SettingName", value);

Во 2-м и 3-м случаях настройка должна быть персональной, иначе словите исключение.

Добрый день!



Можно считать настройку с текущим номером, дальше через элемент "формула" получить этот номер и добавить к нему 1. А дальше номер можно передавать в элементы добавить данные или изменить данные, в зависимости от ситуации. 

Евгений Манько,

Евгений,  а каким элементом процесса записать полученный рассчитаный номер обратно в системную настройку?  Через "изменить объект"? или есть более простой способ?). Спасибо!

Есть готовый элемент GenerateSequenseNumberUserTask, предназначенный именно для этого. Вот разные примеры нумерации.

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

Александр, спасибо! Да, это элемент для нумерации.  Нам нужно не просто пронумеровать объект, а этот получившийся через формулу номер, записать в системную настройку.номевернуть 

Из кода изменить настройку можно так, если дело касается общих настроек или значений по умолчанию:

Terrasoft.Core.Configuration.SysSettings.SetDefValue(userConnection, "SettingName", value);

Для текущего пользователя устанавливается так:

Terrasoft.Core.Configuration.SysSettings.SetValue(userConnection, "SettingName", value);

Для конкретного пользователя или группы:

Terrasoft.Core.Configuration.SysSettings.SetDefValue(userConnection, sysAdminUnitId, "SettingName", value);

Во 2-м и 3-м случаях настройка должна быть персональной, иначе словите исключение.

Бершеда Д. Н. Спасибо!!!)

Бершеда Д. Н.,

Не получается настроить элемент процесса скрипттаск так, чтоб сохранить значение параметра процесса в системную настройку (общую, не персональную).

 

Попытался вот так:

var userConnection = context.UserConnection;

String IDToken = Get<String>("IDToken"); 

Terrasoft.Core.Configuration.SysSettings.SetDefValue(userConnection, "System ID Token", IDToken);

return true;

 

Никакой ошибки не дает, компилируется, но при выполнении процесса этот скрипттаск не отрабатывает - процесс на нем и останавливается.

 

Похоже, я что-то делаю сильно не так. Прошу развернуто привести пример кода скрипттаска. Возможно что-то еще нужно сделать - добавить в зависимости пакета или в параметрах/настройках бизнес-процесса, чтоб SetDefValue работал.

 

Версия платформы - текущая. Пробую на триальном 14-дневном сайте.

Добрый день.

Скорее всего вы передаете неправильный код системной настройки.

Пример рабочего скрипт-таска:

string settingCode = "SystemIdToken"; // код системной настройки
string settingValue = "Test2"; // новое значение
Terrasoft.Core.Configuration.SysSettings.SetDefValue(UserConnection, settingCode, settingValue);
return true;

Результат:

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

Для встроенного механизма авто-нумерации описанного в этой статье академии

Предлагается 2 варианта использования, собственно на стороне сервера через БП и в UI через вызов специализированного метода getIncrementCode()
Остановимся на втором варианте.
Так вот; есть тут небольшая проблема: если мы хотим показывать собственно сгенерированный номер в поле открывшейся карточки то мы вызываем его при инициализации (собственно аналогично примеру из статьи помещая вызов в onEntityInitialized.
Проблема: Итератор сдвигается при каждом вызове, т.е. открывая карточку в режиме добавления новой записи или копирования номер сдвинется, но это не гарантирует нам того что эта запись в конечном итоге вообще произойдет, т.е. пользователь может просто нажать "Отмена" или уйти с карточки - а номерок уже прирос на один.
Мы конечно можем привязаться к методу save и осуществлять вызов getIncrementCode() там, но номерок-то хочется получить на этапе открытия карточки.

Можно ли как-то вызвать его без сдвига итератора ?
PS: я безусловно понимаю что очевидный ответ - не мороч голову делай сервер-сайд, а для показа сделай ESQ запрос в системную настройку напрямую и добавь еденичку :)
Или получай номерок при открытии, ESQ Update запросом в сист.настройку делай роллбек ее на 1 назад, и повторно вызывай метод уже при сохранении.
Но может есть какие-то более лаконичные способы ?

Нравится

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

Добрый день, Илья!

К сожалению, изменить это логику возможности нет. Также, менять ее, как и использовать Ваш вариант с запросом в системную настройку - не очень хорошая идея, так как есть ненулевая верояность того, что несколько пользователей одновременно начнут создавать, допустим, счет, в результате получим несколько счетов с одинаковым номером. Если все-таки есть желание получать данные номера строго по порядку, можно вызвать данный метод в save.

Понятно,
Хотя кстати для тех же счетов законодательство РФ требует соблюдения строгой очередности, так что надо как-то этот момент контролировать.
Идеальный вариант:
Выдавать очередной номер для демонстрации.
Но в процессе сохранения снова проверять его доступность, и в случае если за время редактирования карточки другим пользователем уже был создан документ (получил текущий номер), то получать следующий и извещать об этом пользователя, мол при сохранении номер документа был изменен т.к. текущий уже занят.
т.е. разделить на метод получения без итерирования:
showIncrementCode()
И собственно метод запроса, установки и итерирования
getIncrementCode()
незначительно расширив логи последнего проверкой на факт предоставления номера для другой записи.

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

Добрый день.

Решил изучить процесс автонумерации на возможность генерации одинаковых номеров.

  1. Настроил процесс в соответствии с инструкцией.
  2. Написал консольное приложение для создания записей в несколько потоков в соответствии с инструкцией.

При первом же тесте по созданию записей в 20 потоков, по 1 записи в каждом потоке, получил следующие результаты:
Дубли2

Собственно вопросы:
Есть ли какая то возможность гарантированно генерировать уникальный номер?
Есть ли возможность модифицировать класс GenerateSequenseNumberUserTask?

Нравится

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

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

Альтернативный вариант - генерировать номер по факту создания записи триггером в БД.

"Демьяник Алексей" написал:

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

Альтернативный вариант - генерировать номер по факту создания записи триггером в БД.


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

Например шаблон названия/кода: <Тип_записи>/<Категория_записи>/<Год_создания>_<Уникальный_порядковый_номер>

И есть ли возможность модифицировать класс GenerateSequenseNumberUserTask, который отвечает за генерацию номера?

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

Можно сделать следующее:
1) В конфигурации выгрузить GenerateSequenseNumberUserTask.md (выделите схему и выберите действие "Экспорт в файл".
2) Открыть выгруженный файл и подменить значения параметров:

  • UID
  • NAME
  • CAPTION

3) Загрузить полученный файл в конфигурацию (действие "Импорт файла")
4) Внести в загруженный файл требуемые изменения
5) Опубликовать изменения
6) Использовать в действии процесса на объекте созданное (импортированное вами действие)

P.S. Все еще не вижу проблемы в создании триггера.

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

Добрый день!

Возник вопрос при реализации автонумерации для нового раздела.
Руководствовалась данной инструкцией:
https://academy.terrasoft.ru/documents/technic-sdk/7-9/primer-ispolzovan...

1. Создала новый раздел, новое поле UsrNumber. UsrNumber содержит код новой записи раздела.
2. Создала две системные настройки: маска и текущий номер.
3. В конфигурации у созданного объекта добавила БП при добавлении новой записи.
4. Настроила БП как в примере. Указывала свое поле номера(UsrNumber).
6. Все сохранила,обновила.
5. Добавляю новую запись, номер записи не создается.
Подскажите,пожалуйста, что может быть не так. Как можно проверить,запустился ли БП?
Как происходить связывание маски и текущего номера записи с действием "Сгенерировать номер по порядку"? При открытии исходного кода такого же процесса у объекта "проблема" не нашла использование маски и текущего номера.

Нравится

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

Обычно вся консоль красная, если хоть что-то отрабатывает с ошибкой

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

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

Если бы в ходе выполнения произошла ошибка, то запись в разделе бы не сохранилась.

Рекомендую проверить - был ли опубликован процесс. Также проверьте правильно вы выбрали событие или нет - нужно выбрать событие "Перед добавлением записи" и обязательно использовать сообщение, а не сигнал.

При публикации процесса ошибки нет,использовала начальное событие "сообщение". Возможно ошиблась в поле Сообщение - указывала название UsrPaymentInserting.
Записи в раздел добавляются.

Судя по всему процесс идет по потоку по умолчанию. Проверьте условие в условном потоке.

К сожалению,не могу понять в чем ошибка.
В новой разделе создала колонку "Номер", в бд -UsrNumber.
В условном потоке указываю именно это поле.
Код из условного потока :
string.IsNullOrEmpty(Entity.GetTypedColumnValue("UsrNumber"))

Здравствуйте
не отображается при создании записи? Или уже в сохраненной записи? Повторно открытой?
Если в первом случае, то внимательно читайте

... после публикации схемы объекта на странице редактирования продукта после сохранения нового продукта в поле [Код] будет указан автоматически сгенерированный код (рис. 13, рис. 14).

Также последнее примечание

ВАЖНО

Поскольку автогенерация кода и его сохранение в колонку выполняется на сервере при возникновении события [Перед сохранением записи], то значение кода никак нельзя отобразить на странице добавления продукта. Это связано с тем, что событие возникает уже после отправки запроса на добавление записи с клиенской части приложения.

У меня была такая же ситуация. Оказалось, что проблема заключается в том что процесс нумерации должен обязательно находиться в блоке "Событийный подпроцесс".

Спасибо! Заработало=)
Действительно, надо было в этот блок добавить.

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

Создала системную переменную, в дизайнере объектов присвоила полю значению по умолчанию из этой переменной.Что ещё нужно сделать? потому как инкремента поля не происходит, при добавлении новой записи выставляется в 0, а в БД эта возможность заблокирована.

Нравится

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

Посмотрите, как это сделано в процессе объекта "Документ".
нумерация документа

Посмотрела,скопировала к себе этот кусок - не работает.Не пойму, как работает это действие "Сгенерировать порядковый номер" - оно использует системные настройки(Текущий номер и Маска)?

Да, нужно создать системные настройки.

Системные настройки уже созданы, я как раз не могу найти, где при создании Действия процесса, нужно указывать конкретные системные настройки?, или это определяется по имени

Да, по имени. В коде схемы "Сгенерировать номер по порядку" есть:

	var entitySchemaName = entitySchema.Name;
	string codeMaskSettingName = entitySchemaName + "CodeMask";
	string lastNumberSettingName = entitySchemaName + "LastNumber";

Сделала ранее по аналогии, как в схеме Документ - не работает, потом так

В скрипт вставила код из схемы "Сгенерировать номер по порядку"

object EntitySchema = Entity.Schema;
if (EntitySchema != null) {
	var entitySchema = EntitySchema as Terrasoft.Core.Entities.EntitySchema;
	var entitySchemaName = entitySchema.Name;
	string codeMaskSettingName = entitySchemaName + "CodeMask";
	string lastNumberSettingName = entitySchemaName + "LastNumber";
 
	var connection = context.UserConnection;
	string sysSettingsCodeMask = (string)SysSettings.GetValue(connection, codeMaskSettingName);
	int sysSettingsLastNumber = (int) SysSettings.GetValue(connection, lastNumberSettingName);
 
	SysSettings.SetValue(connection, UserConnection.RootAdminUnitGroupId, lastNumberSettingName, ++sysSettingsLastNumber);
 
	var code = string.Format(sysSettingsCodeMask,sysSettingsLastNumber);
	var update = new Update(UserConnection, Entity.Schema.Name)
	.Set("Number", Column.Parameter(code))
	.Where("Id").IsEqual(Column.Parameter(Entity.PrimaryColumnValue));
update.Execute();
}

При компиляции ругается

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

Все-таки рекомендую сделать по аналогии с "Документом". Что именно у Вас не получилось?

Здравствуйте, Дмитрий
Сделала по аналогии с "Документом"

В скрипте SetGenerateParamScript сначала 1 строка идентична как в Документе
но поскольку не работала, добавила код на обновление поля....не работает (((

GenerateNumberUserTask.EntitySchema = Entity.Schema;
string code = "1";
var update = new Update(UserConnection, Entity.Schema.Name)
	.Set("Number", Column.Parameter(code))
	.Where("Id").IsEqual(Column.Parameter(Entity.PrimaryColumnValue));
update.Execute();

Такое ощущение что вообще не происходит наступление этого события, тем не менее Заказ в таблицу добавляется....

А какая у этого объекта PrimaryColumn?
Также, пожалуйста, т.к. у Вас On-Site версия - попробуйте запустить Profiler и посмотреть какие запросы идут на сервер после нажатия на "ОК".

Если я не ошибаюсь, то по умолчанию PrimaryColumn это Id (объект наследован от базового)
В профайлере обязательно посмотрю, пока сделала через триггер: после вставки читаю значение из системной таблицы, обновляю поле Number, потом обновляю значение системной переменной в таблице....Понимаю что не совсем правильно, но так хотя бы работает

Если у Вас On-Site, то триггер - вполне разумное решение. :)

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

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

Можна ли настроить автонумерацую и построит новый бизнес процесс для нового раздела в демо-версии? Я все настроила и создала новое действие «Сгенерировать номер по порядку». Но у меня выдает ошибка кода.

С уважением,

Гюнель Рустамова

Нравится

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

Gunel, демо-версия позволяет вносить изменения в конфигурацию так же, как и полная. Вероятно, причина ошибки заключается во внесенных Вами изменениях.
Проверьте, все ли действия выполнены корректно (на примере создания автонумерации счета):
1. Добавлены две системные настройки, которые будут определять текущий номер и маску генерации номера. В качестве примера Вы можете использовать настройки «Маска номера счета» и «Текущий номер счета».
2. В процессе страницы карточки редактирования после элемента ScriptPageLoadCompleteBase реализована генерация номера, аналогично тому, как это реализовано для счетов (в качестве образца используйте процесс страницы карточки счета)
	 http://www.community.terrasoft.ru/system/files/1_99.png
3. В скрипт после события PageLoadCompleteBase добавлен код
	 http://www.community.terrasoft.ru/system/files/2_57.png

NumberGenerator.EntitySchema = Page.DataSource.Schema;
return true;

	 http://www.community.terrasoft.ru/system/files/3_28.png

Спасибо за ответь

1. Я сделала
2. На "Странице карточки счета" к сожалению, нет таких элементов. Не могли бы пожалуйста описать по подробней создание скрипта "NumberGenerator".

С уважением,
Гюнель Рустамова

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

Чтобы создать нумерацию, выполните такие действия:
- После промежуточного генерирующего сообщения PageLoadComplete добавьте элемент «Действие процесса», заполните его свойства подобным образом:

http://www.community.terrasoft.ru/system/files/11_2.png
- Следующим элементом добавьте «Скрипт», с таким содержимым:

if (IsNew) {
	Page.DataSource.ActiveRow.SetColumnValue("Code", NumberGenerator.ResultCode);
}
return true;

Вместо "Code" следует указать название поля, для которого создается нумерация.
- Не забудьте про 3 шаг предыдущего комментария (http://www.community.terrasoft.ru/forum/topic/8603#comment-36183).

Спосиба за ответ. Вы мне очень помогли.

С уважением,
Гюнель Рустамова

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