Раздел: [[Программирование | ]] > [[СредаИсполнения]] ---- Номерные серии предназначены для автоматической генерации заначений полей вида <префикс><номер><суффикс> на основе счетчика. При помощи номерных серий заполняюется такие поля как "Номер складского журнала" и т.д. 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/]]