Каталог решений - Динамическая нумерация документов

Динамическая нумерация документов

Динамическая нумерация документов

В наличии

Была задача сделать для одного вида документа (например «Кадровый перевод») динамическую нумерацию, при этом редактирование номера доступно только Администратору, например, то есть чтобы при установке флажка нумерация менялась с НС00-00001 на НС00-00001тс.
А если флаг не стоит, то продолжалась дальше, так же продолжалась и для новой нумерации, то есть уже НС00-00002 или НС00-00002тс. и т.д.

Категория:

Описание

Что делаем:

1. В документ добавляем новый реквизит "ТехническийНомер" типа Булево и кладем его на форму. Поле "номер" у документа, закрываем на редактирование снятием флага "редактирование текста" что позволит выделять номер в поле и копировать его, но не позволит его менять.

2. Создаем подписку на событие "КадровыйПереводТехническийПриУстановкеНовогоНомера" с событием "ПриУстановкеНовогоНомера"

3. Создаем новый (или используем свои существующие) "Общий модуль" например "Мои доработки" с признаком "Сервер" и в этот вставляем следующую процедуру (см. ниже), данная процедура вызывается единожды, пока номер не установлен.

 

 

// Здесь проверяем документ кадровый перевод, если это технический перевод, то назначаем ему свою сквозную нумерацию, а если нет, то типовую.  
//
// Суть следующая, в документе Кадровый перевод есть флаг "технический перевод" (рядом с полем номер).
// Если он не стоит, то ведется стандартная нумерация вида "Префикс организации - 4 знака, 0015-номер документа 4 знака - Например НС00-0015 или ЕК00-0024
// если стоит, то у них своя нумерация, "Префикс организации - 4 знака, 0015ТП-номер документа 6 знаков, ТП - Например НС00-0015ТП или ЕК00-0024ТП
//
// Данная процедура ищет последний номер по организации и по состоянию флага "Технический перевод" и добавляет к номеру +1.  
// Для того чтобы сюда попадали и другие документы, необходимо их выбрать в подписке на событие "КадровыйПереводТехническийПриУстановкеНовогоНомера"
//
Процедура УстановитьНомерДокумента(Источник, СтандартнаяОбработка, Префикс) Экспорт
 
 СтандартнаяОбработка = Ложь;
 Постфикс = "";
 Префикс = СокрЛП(Источник.Организация.Префикс);
 ВидДокумента = Источник.Метаданные().Имя;
 
 Если ВидДокумента = "КадровыйПеревод" Тогда // пока только для него
  
  Если Источник.ТехническийНомер Тогда
   Постфикс = "тп";
  КонецЕсли;   
  
  Префикс4 = Префикс;
  
  
  НомерЧисло = 1;
  
  Запрос = Новый Запрос;
  Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1
  | ПОДСТРОКА(Документ.Номер, 6, 15) КАК Номер
  |ИЗ
  | Документ.КадровыйПеревод КАК Документ
  |ГДЕ
  | ПОДСТРОКА(Документ.Номер, 1, 4) = &Префикс
  | И Документ.Дата МЕЖДУ НАЧАЛОПЕРИОДА(&Дата, ГОД) И КОНЕЦПЕРИОДА(&Дата, ГОД)
  | И Документ.Организация = &Организация
  | И &НомерБезПрефикса
  |
  |УПОРЯДОЧИТЬ ПО
  | Номер УБЫВ";
  
  Запрос.Текст = СтрЗаменить(Запрос.Текст, "КадровыйПеревод", ВидДокумента);
  
  // Примечание
  // •% (процент) — допускает любую последовательность произвольных символов;
  // •_ (нижнее подчеркивание) — любой один символ;
  // •[…] – один произвольный символ из перечисленных внутри скобок. Кроме перечисления символов можно использовать диапазоны. Пример: а-о;
  // •[^…] – то же самое, что и предыдущее, но наоборот. Знак «^» означает отрицание.
  
  Если Постфикс = "тп" Тогда // Источник.ТехническийПеревод
		Запрос.Текст = СтрЗаменить(Запрос.Текст, "&НомерБезПрефикса", "ПОДСТРОКА(Документ.Номер, 6, 15) ПОДОБНО ""%[тп]%""");    // ищем где после после префикса в номере есть буквы ТП
  Иначе
		Запрос.Текст = СтрЗаменить(Запрос.Текст, "&НомерБезПрефикса", "ПОДСТРОКА(Документ.Номер, 6, 15) НЕ ПОДОБНО ""%[а-я/]%""");  // ищем где после после префикса только числа
  КонецЕсли;   
  
  Пока СтрДлина(Префикс4) < 4  Цикл
   Префикс4 = Префикс4 + "0";
  КонецЦикла;                
  
  Запрос.УстановитьПараметр("Организация", Источник.Организация);
  Запрос.УстановитьПараметр("Префикс", Префикс4);
  Запрос.УстановитьПараметр("Дата", Источник.Дата);
  Выборка = Запрос.Выполнить().Выбрать();
  
  Если Выборка.Следующий() Тогда
   Попытка
    Если Постфикс = "тп" Тогда
     НомерЧисло = Число(Лев(Выборка.Номер, 4)) + 1;
    Иначе
     НомерЧисло = Число(Выборка.Номер) + 1;
    КонецЕсли;
    
    Источник.Номер = Префикс + "00-" + Формат(НомерЧисло, "ЧЦ=4; ЧВН=; ЧГ=") + Постфикс; // это следующий документ создадим ему номер НС00-0015 или НС00-0015ТП  
    
    //Источник.Номер = Префикс + Формат(НомерЧисло, "ЧЦ=4" + Строка(СтрДлина(Источник.Номер) - СтрДлина(Префикс)) + "; ЧВН=; ЧГ=") + Постфикс;   
   Исключение
   КонецПопытки;
  Иначе   
   НомерЧисло = 1;
   Источник.Номер = Префикс + "00-" + Формат(НомерЧисло, "ЧЦ=4; ЧВН=; ЧГ=") + Постфикс; // это первый документ создадим ему номер НС00-0015 или НС00-0015ТП  
   //Источник.Номер = Префикс + Формат(НомерЧисло, "ЧЦ=" + Строка(СтрДлина(Источник.Номер) - СтрДлина(Префикс)) + "; ЧВН=; ЧГ=") + Постфикс;   
  КОнецЕсли;
 КонецЕсли;   


КонецПроцедуры

 

has been added to your cart:
Оформление заказа