Инструменты пользователя

Инструменты сайта


axapta:номерныесерии

Раздел: Программирование > СредаИсполнения


Номерные серии предназначены для автоматической генерации заначений полей вида <префикс><номер><суффикс> на основе счетчика. При помощи номерных серий заполняюется такие поля как «Номер складского журнала» и т.д.

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. При закрытии происходит то же самое

см. также

axapta/номерныесерии.txt · Последнее изменение: 2018/04/13 22:43 (внешнее изменение)