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

15.03.18

Разработка - Механизмы платформы 1С

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


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

 

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

См. также

Динамическое обновление - это зло?

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Копнем глубже в тему "Что же такое динамическое обновление" и почему оно может привести к проблемам. И может ли?

09.05.2022    27413    Infostart    83    

243

Совместимость работы со строками. Жизнь до 8.3.6 и после

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Немного о совместимости со старыми версиям платформы 1С в работе со строками.

21.02.2020    8401    Infostart    25    

69

Эволюция расширения конфигурации

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

С каждым днем всё больше возможностей появляется в расширении конфигурации, но не все до сих пор работают даже на платформе 8.3.6! Давайте окунемся в историю появления и эволюции расширения конфигурации, чтобы знать и понимать, когда можно применить тот или иной функционал!

06.02.2020    26774    Xershi    51    

223

Как работают управляемые формы и тонкий клиент 1С – взгляд "из-под капота"

Механизмы платформы 1С Управляемые формы Бесплатно (free)

Переход на управляемые формы перевернул процесс разработки на 1С, заставив программистов менять привычные подходы к описанию логики работы интерфейса. Руководитель компании «Цифровой Кот» Юрий Лазаренко в своем докладе на конференции Infostart Event 2019 Inception рассказал о том, как устроены управляемые формы и как правильно работать с тонким клиентом платформы 1С:Предприятие.

23.12.2019    25143    TitanLuchs    23    

100

30 задач. Странных и не очень

Математика и алгоритмы Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

30 задач на знание языка программирования 1С и некоторого поведения платформы. Маленьких. Странных и не очень.

02.12.2019    50764    Infostart    65    

164

Фишечки-рюшечки

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

За годы работы с 1С собрался определенный багаж хитростей, который позволяет разрабатывать быстрее/эффективнее/качественнее. Поделюсь ими в данной статье.

06.11.2019    11204    mpeg1989    95    

66

ЧтениеДанных и ЗаписьДанных. Работа со строками

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Использование потоков и двоичных данных для работы со строками.

04.10.2019    23851    Yashazz    16    

76
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. palsergeich 18.01.18 11:33 Сейчас в теме
Очень опасный запрос, да еще и в транзакции. Особенно если документов вводится будет много.
+
5. Dr.Mult 20 31.01.19 11:42 Сейчас в теме
(1)Это точно... в БД с нормальным документооборотом (а не шаражкиной конторой)... висяки обеспечены... а также не учтен момент блокировок..
+
2. Lem0n 420 18.01.18 14:12 Сейчас в теме
1. выборка документов за год,
2. отсутствие блокировки номера может привести к дублированию номеров

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

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

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