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

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)

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

23.06.2024    7443    bayselonarrend    20    

154

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

Пример использования «Сервисов интеграции» без подключения к Шине и без обменов.

13.03.2024    5942    dsdred    16    

80

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

Все мы используем массивы в своем коде. Это один из первых объектов, который дают ученикам при прохождении обучения программированию. Но умеем ли мы ими пользоваться? В этой статье я хочу показать все методы массива, а также некоторые фишки в работе с массивами.

24.01.2024    17666    YA_418728146    26    

71

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

Вы все еще регистрируете изменения только на Планах обмена и Регистрах сведений?

11.12.2023    11222    dsdred    44    

130

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

Язык программирования 1С содержит много нюансов и особенностей, которые могут приводить к неожиданным для разработчика результатам. Сталкиваясь с ними, программист начинает лучше понимать логику платформы, а значит, быстрее выявлять ошибки и видеть потенциальные узкие места своего кода там, где позже можно было бы ещё долго медитировать с отладчиком в поисках источника проблемы. Мы рассмотрим разные примеры поведения кода 1С. Разберём результаты выполнения и ответим на вопросы «Почему?», «Как же так?» и «Зачем нам это знать?». 

06.10.2023    23757    SeiOkami    48    

135

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

Начиная с версии платформы 8.3.22 1С снимает стандартные блокировки БД на уровне страниц. Делаем рабочий скрипт, как раньше.

14.09.2023    18828    human_new    27    

80

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

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    14730    YA_418728146    7    

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

Я так понимаю вся чехарда из-за букв в конце.Лучше подменить основное представление и номер на печать.
3. pavel_pss 290 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) Можно посмотреть как реализовано в ДО, ИМХО реализовано там хорошо, и сделать по аналогии.
Оставьте свое сообщение