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

Программирование - Практика программирования

нумерация документ динамически подписка на событие для всех для конкретного документ

6
Была задача сделать для одного вида документа (например "Кадровый перевод") динамическую нумерацию, при этом редактирование номера доступно только Администратору, например, то есть чтобы при установке флажка нумерация менялась с НС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ТП  
   //Источник.Номер = Префикс + Формат(НомерЧисло, "ЧЦ=" + Строка(СтрДлина(Источник.Номер) - СтрДлина(Префикс)) + "; ЧВН=; ЧГ=") + Постфикс;   
  КОнецЕсли;
 КонецЕсли;   


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

 

6

См. также

Комментарии
Избранное Подписка Сортировка: Древо
1. palsergeich 18.01.18 11:33 Сейчас в теме
Очень опасный запрос, да еще и в транзакции. Особенно если документов вводится будет много.
2. Lem0n 98 18.01.18 14:12 Сейчас в теме
1. выборка документов за год,
2. отсутствие блокировки номера может привести к дублированию номеров

Я так понимаю вся чехарда из-за букв в конце.Лучше подменить основное представление и номер на печать.
3. pavel_pss 213 18.01.18 14:59 Сейчас в теме
Да согласен, такие опасности есть, но они возникнут при большом количестве ввода документов. Для документов которые создаются одним, двумя пользователями, вероятность ошибки маленькая.

Вторым вариантом, данного действия конечно было бы лучше подменять в печатной форме или создать доп. реквизит с выводом его в печат. форму, чтобы видеть его в списке документов.

Поэтому на идеальное решение не претендую, но как вариант может быть.
4. ice-net 14 20.01.18 14:40 Сейчас в теме
Лучше, наверное, сделать отдельный р/с с парой измерений (Период, организация, имя метаданных типа "Документ.Закупка" и ресурсом счетчика).
И при записи менять значение в этом регистре с блокировкой на чтение. А шаблон формирования номера или засунуть реквизитом в организацию или в отдельный регистр.
Плюсы:
1. Легко добавить сколько угодно документов/справочников, если понадобиться в будущем.
1.1. Можно описать разную логику для разных объектов в отдельном регистре, типа для этих доков нумерация годовая с такими шаблонами, для тех- другая. Читай универсальность!
2. Если вдруг какой-то документ будет удален из базы - вы не получите задвоение номера.
3. Запрос на поиск в регистре(1 из максимум 20 записей) будет отрабатывать в разы быстрее, разве что добавить сюда время на изменение этой записи.
4. ..?
Оставьте свое сообщение