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

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)

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

13.03.2024    2542    dsdred    16    

57

Поинтегрируем: сервисы интеграции – новый стандарт или просто коннектор?

Обмен между базами 1C Администрирование СУБД Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

В платформе 8.3.17 появился замечательный механизм «Сервисы интеграции». Многие считают, что это просто коннектор 1С:Шины. Так ли это?

11.03.2024    5842    dsdred    53    

82

Как готовить и есть массивы

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

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

24.01.2024    5824    YA_418728146    25    

67

Планы обмена VS История данных

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

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

11.12.2023    6939    dsdred    36    

113

1С-ная магия

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

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

06.10.2023    19023    SeiOkami    46    

118

Дефрагментация и реиндексация после перехода на платформу 8.3.22

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

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

14.09.2023    12723    human_new    27    

76

Валидация JSON через XDTO (включая массивы)

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

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

28.08.2023    9359    YA_418728146    6    

143

Внешние компоненты Native API на языке Rust - Просто!

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

Внешние компоненты для 1С можно разработывать очень просто, пользуясь всеми преимуществами языка Rust - от безопасности и кроссплатформенности до удобного менеджера библиотек.

20.08.2023    6517    sebekerga    54    

95
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
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) Можно посмотреть как реализовано в ДО, ИМХО реализовано там хорошо, и сделать по аналогии.
+
Оставьте свое сообщение