Раздел: [[Программирование | ]] > [[СредаИсполнения]]
----
Номерные серии предназначены для автоматической генерации заначений полей вида <префикс><номер><суффикс> на основе счетчика. При помощи номерных серий заполняюется такие поля как "Номер складского журнала" и т.д.
C номерными сериями документов можно работать через пункт главного меню "Основное\Настройки\Серии документов\Серии документов"
Хорошее описание того, как делать номерные серии есть в статье [[http://axapta.mazzy.ru/lib/numbersequence/]]
В качестве альтернативы можно использовать RecId, но следует учесть, что его значение не сохраняется при экспорте-иморте
{{toc}}
=== Создание собственного модуля номерных серий ===
*добавить новое значение в BaseEnum/NumberSeqModule
*создать подкласс [[Класс/NumberSeqReference]]
*в созданном подклассе:
*добавить статический метод numberSeqModule возвращающий значение нового элемента BaseEnum/NumberSeqModule
*перекрыть метод loadModule (см. ниже)
*добавить создание экземпляра этого класса в [[AxPath://AOT/Classes/NumberSeqReference/construct?line=53&pos=9]]
*добавить свой тип в перечень типов модулей в [[AxPath://AOT/Classes/NumberSeqReference/moduleList?line=53&pos=5]]
*добавить в форму параметров своего модуля закладку "Номерные серии" (пример создания такой закладки содержит Форма/LedgerParameters)
=== Создание номерной серии ===
*создать собственный ExtendedDataType типа [[Тип/str]]
*добавить инициализацию номерной серии в метод loadModule потомка класса NumberSeqReference (например, NumberSeqReference_Ledger для модуля [[ГлавнаяКнига]]):
// Укажем, какой тип мы хотим использовать.
// Разумеется, здесь должен быть наш тип - тот,что мы использовали в таблице.
numRef.DataTypeId = typeid2extendedtypeid(typeid(SalesManagersGroupId));
// Это будет в подсказке
numRef.ReferenceHelp = literalStr("Уникальный идентификатор групп менеджеров");
// А это само имя - его мы видим в графе <Ссылка> при настройке номерных серий.
numRef.ReferenceLabel = literalStr("Идентификатор группы менеджеров");
// Настройка мастера.
// Если мы решим запустить стандартны мастер, то он
// по-умолчанию сформирует нашу серию как <Непрерывную>
numRef.WizardContinuous = false;
// Допускать изменения пользователем <Вручную>
numRef.WizardManual = NoYes::No;
// : только на понижении серии
numRef.WizardAllowChangeDown = NoYes::No;
// : только на повышение номера.
numRef.WizardAllowChangeUp = NoYes::No;
// Максимальный номер.
// Здесь мы предполагаем, что у нас не будет больше 9999 групп менеджеров.
numRef.WizardHighest = 9999;
numRef.SortField = 3;
// Создаем
this.create( numRef);
=== Использование номерной серии ===
==== Вне формы ====
// Получение объекта "Номерная серия"
NumberSeq sequence = NumberSeq::newGetNum(
NumberSequenceReference::find(
typeId2extendedTypeId(typeID(<Ваш EDT>))));
;
// получение нового значения из номерной серии
<Таблица>.<Поле> = sequence.num();
==== В форме ====
Ниже инструкция, как добавить использование номерной серии в форму. //Немного переработанный пример из [[http://axapta.mazzy.ru/lib/numbersequence/]] -- устранена избыточность кода//
в **class declaration** формы добавить:
NumberSeqFormHandler numberSeq;
в форму добавить метод для получения обработчика номерной серии (используется приём [[:ЛениваяИнициализация]])
NumberSeqFormHandler numberSeq()
{
;
if(!numberSeq)
{
numberSeq = numberSeqFormHandler::newForm(
NumberSequenceReference::find(
typeId2extendedTypeId(typeID(ИмяТипаДанных))
).NumberSequence,
element,
element.dataSource(),
fieldNum(НазваниеТаблицы, НазваниеПоля)
);
}
return numberSeq;
}
Перекрыть метод close на форме:
public void close()
{
;
if (numberSeq)
numberSeq.formMethodClose();
super();
}
Перекрыть следующие методы источника данных формы и добавить в них обращения к обработчику номерной серии:
public void delete()
{
;
ttsbegin;
element.numberSeq().formMethodDataSourceDelete();
super();
ttscommit;
}
public void linkActive()
{
;
element.numberSeq().formMethodDataSourceLinkActive();
super();
}
public void write()
{
;
ttsbegin;
super();
element.numberSeq().formMethodDataSourceWrite();
ttscommit;
}
public boolean validateWrite()
{
boolean ret;
;
ret = super();
ret = ret && element.numberSeq().formMethodDataSourceValidateWrite();
return ret;
}
public void create(boolean _append = false)
{
;
element.numberSeq().formMethodDataSourceCreatePre();
super(_append);
element.numberSeq().formMethodDataSourceCreate();
}
===== примечания =====
1. Aльтернативный эквивалентный вариант validateWrite:
public boolean validateWrite()
{
return element.numberSeq().formMethodDataSourceValidateWrite(super());
}
2. При удалении записей из таблицы, в номерную серию возвращается номер только если запись не была сохранена.
3. При закрытии происходит то же самое
=== см. также ===
*[[http://axapta.mazzy.ru/lib/numbersequence_using/]]
*[[http://axapta.mazzy.ru/lib/numbersequenceformat/]]