Содержание

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


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

C номерными сериями документов можно работать через пункт главного меню «Основное\Настройки\Серии документов\Серии документов»

Хорошее описание того, как делать номерные серии есть в статье http://axapta.mazzy.ru/lib/numbersequence/

В качестве альтернативы можно использовать RecId, но следует учесть, что его значение не сохраняется при экспорте-иморте toc

Создание собственного модуля номерных серий

Создание номерной серии

// Укажем, какой тип мы хотим использовать.
 
// Разумеется, здесь должен быть наш тип - тот,что мы использовали в таблице.
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. При закрытии происходит то же самое

см. также