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