Собственный алгоритм нумерации документов определенного вида

Публикация № 1042149

Обработки - Обработка документов

нумерация номер

1
Создание собственного, отличного от платформенного алгоритма нумерации документов определенного вида.

Решена задача создания собственного алгоритма нумерации документов Реализация в 1С Бухгалтерия 3. Необходимо было убирать из порядка нумерации документы с символом "/", определяя последний номер без этого символа и присваивать новому документу следующий по порядку номер. Реализовано расширением общего модуля ПрефиксацияОбъектовБПСобытия, модификация обработчика подписки на событие УстановитьПрефиксИнформационнойБазыОрганизацииПодразделенияНомеруДокумента, обрабатывающей событие ПриУстановкеНовогоНомера.

&После("УстановитьПрефиксИнформационнойБазыОрганизацииПодразделения")
Процедура ТЭКУстановитьПрефиксИнформационнойБазыОрганизацииПодразделения(Источник, СтандартнаяОбработка, Префикс)
	ИспользоватьСвойАлгоритмНумерацииРеализаций=Справочники.ТЭКконстанты.ИспользоватьСвоюНумерациюРеализаций.Значение;
	Если Не ТипЗнч(ИспользоватьСвойАлгоритмНумерацииРеализаций)=Тип("Булево") Тогда
		Возврат;
	КонецЕсли; 
	Если ТипЗнч(Источник)=Тип("ДокументОбъект.РеализацияТоваровУслуг") И ИспользоватьСвойАлгоритмНумерацииРеализаций Тогда
		СтандартнаяОбработка=ложь;
		// Определим последний номер
		НомерЧисло=ОпределитьПоследнийНомерДокументаРеализации(Источник.Дата);
	    СледующийНомерДокументаЧисло=НомерЧисло+1;
		//Сформируем строку Номера как Префикс+Номер
		ДлинаНомера=СтрДлина(Источник.Номер);
		ДлинаНомераБезПрефикса=ДлинаНомера-СтрДлина(Префикс);
		СледующийНомерДокументаСтрока=Строка(СледующийНомерДокументаЧисло);
		ДлинаПоследнегоНомера=СтрДлина(СледующийНомерДокументаСтрока);
		ИтогСтрокаНомераБезПрефикса="";
		Для Н=1 По ДлинаНомераБезПрефикса-ДлинаПоследнегоНомера Цикл
			ИтогСтрокаНомераБезПрефикса=ИтогСтрокаНомераБезПрефикса+"0";
		КонецЦикла;
		ИтогСтрокаНомераБезПрефикса=ИтогСтрокаНомераБезПрефикса+СледующийНомерДокументаСтрока;
		ОчереднойНомерДокументаСтрока=Префикс+ИтогСтрокаНомераБезПрефикса;
		Источник.Номер=ОчереднойНомерДокументаСтрока;
	КонецЕсли; 
		
КонецПроцедуры

Функция ОпределитьПоследнийНомерДокументаРеализации(ДатаДокумента)
	ПоследнийНомер=1;	
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ ПЕРВЫЕ 30
		|	РеализацияТоваровУслуг.Номер КАК НомерДокумента,
		|	РеализацияТоваровУслуг.Ссылка КАК Ссылка
		|ПОМЕСТИТЬ ИсходнаяТаблица
		|ИЗ
		|	Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
		|ГДЕ
		|	РеализацияТоваровУслуг.Дата >= &Дата1
		|	И РеализацияТоваровУслуг.Дата <= &Дата2
		|	И НЕ РеализацияТоваровУслуг.Номер ПОДОБНО &ПараметрСтрокаПоиска
		|
		|УПОРЯДОЧИТЬ ПО
		|	РеализацияТоваровУслуг.МоментВремени УБЫВ
		|;
		|
		|////////////////////////////////////////////////////////////////////////////////
		|ВЫБРАТЬ
		|	КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ИсходнаяТаблица1.Ссылка) + 1 КАК НомерСтроки,
		|	ИсходнаяТаблица.НомерДокумента КАК Строка
		|ПОМЕСТИТЬ ТаблицаНомеров
		|ИЗ
		|	ИсходнаяТаблица КАК ИсходнаяТаблица
		|		ЛЕВОЕ СОЕДИНЕНИЕ ИсходнаяТаблица КАК ИсходнаяТаблица1
		|		ПО ИсходнаяТаблица.Ссылка > ИсходнаяТаблица1.Ссылка
		|
		|СГРУППИРОВАТЬ ПО
		|	ИсходнаяТаблица.НомерДокумента
		|;
		|
		|////////////////////////////////////////////////////////////////////////////////
		|ВЫБРАТЬ
		|	0 КАК С,
		|	1 КАК П
		|ПОМЕСТИТЬ Р16
		|
		|ОБЪЕДИНИТЬ
		|
		|ВЫБРАТЬ
		|	1,
		|	10
		|
		|ОБЪЕДИНИТЬ
		|
		|ВЫБРАТЬ
		|	2,
		|	100
		|
		|ОБЪЕДИНИТЬ
		|
		|ВЫБРАТЬ
		|	3,
		|	1000
		|
		|ОБЪЕДИНИТЬ
		|
		|ВЫБРАТЬ
		|	4,
		|	10000
		|
		|ОБЪЕДИНИТЬ
		|
		|ВЫБРАТЬ
		|	5,
		|	100000
		|
		|ОБЪЕДИНИТЬ
		|
		|ВЫБРАТЬ
		|	6,
		|	1000000
		|
		|ОБЪЕДИНИТЬ
		|
		|ВЫБРАТЬ
		|	7,
		|	10000000
		|
		|ОБЪЕДИНИТЬ
		|
		|ВЫБРАТЬ
		|	8,
		|	100000000
		|
		|ОБЪЕДИНИТЬ
		|
		|ВЫБРАТЬ
		|	9,
		|	1000000000
		|
		|ОБЪЕДИНИТЬ
		|
		|ВЫБРАТЬ
		|	10,
		|	10000000000
		|
		|ОБЪЕДИНИТЬ
		|
		|ВЫБРАТЬ
		|	11,
		|	100000000000
		|
		|ОБЪЕДИНИТЬ
		|
		|ВЫБРАТЬ
		|	12,
		|	1000000000000
		|
		|ОБЪЕДИНИТЬ
		|
		|ВЫБРАТЬ
		|	13,
		|	10000000000000
		|
		|ОБЪЕДИНИТЬ
		|
		|ВЫБРАТЬ
		|	14,
		|	100000000000000
		|
		|ОБЪЕДИНИТЬ
		|
		|ВЫБРАТЬ
		|	15,
		|	1000000000000000
		|
		|ОБЪЕДИНИТЬ
		|
		|ВЫБРАТЬ
		|	16,
		|	10000000000000000
		|;
		|
		|////////////////////////////////////////////////////////////////////////////////
		|ВЫБРАТЬ ПЕРВЫЕ 1
		|	СУММА(А.П * Б.С) / МИНИМУМ(А.П) КАК Ответ
		|ИЗ
		|	ТаблицаНомеров КАК ТаблицаНомеров,
		|	Р16 КАК А,
		|	Р16 КАК Б
		|ГДЕ
		|	Б.С < 10
		|	И ПОДСТРОКА(ТаблицаНомеров.Строка, 17 - А.С, 1) = ПОДСТРОКА(""0123456789"", Б.С + 1, 1)
		|
		|СГРУППИРОВАТЬ ПО
		|	ТаблицаНомеров.НомерСтроки
		|
		|УПОРЯДОЧИТЬ ПО
		|	Ответ УБЫВ";
	
	Запрос.УстановитьПараметр("Дата1", НачалоГода(ДатаДокумента));
	Запрос.УстановитьПараметр("Дата2", КонецГода(ДатаДокумента));
	Запрос.УстановитьПараметр("ПараметрСтрокаПоиска", "%/%");
	
	РезультатЗапроса = Запрос.Выполнить();
	
	ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
	
	Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
		ПоследнийНомер=ВыборкаДетальныеЗаписи.Ответ;
	КонецЦикла;
	
	Возврат ПоследнийНомер;
	
КонецФункции // ОпределитьПоследнийНомерДокументаРеализации()
 

Необходимо создать свою константу в основной Конфигурации Справочники.ТЭКконстанты.ИспользоватьСвоюНумерациюРеализаций с реквизитом Значение тип Булево. Идею запроса с преобразованием строки в Число взял здесь //infostart.ru/public/170336/

Расширение протестировано на релизе БП 3.0.7.25.

1

Скачать файлы

Наименование Файл Версия Размер
Собственный алгоритм нумерации документов:
.cfe 123,13Kb
11.04.19
2
.cfe 123,13Kb 2 Скачать

См. также

Специальные предложения

Комментарии
Избранное Подписка Сортировка: Древо
1. tusv 158 11.04.19 15:59 Сейчас в теме
Что то много лишних букв
В Запросе Вторую временную таблицу зачем? Когда Можно сгруппировать и по Ссылка, вместо НомерСтроки.
Да и можно сразу
ВЫБРАТЬ
1  КАК НомерСтроки,
Максимум(РеализацияТоваровУслуг.Номер) КАК Строка
ПОМЕСТИТЬ Дано
ИЗ
	Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
ГДЕ
	РеализацияТоваровУслуг.Дата Между &Дата1 и  &Дата2
Показать

Зачем выводить лидирующие нули циклом когда можно форматом
НовыйНомер = Префикс+Формат(НомерЧисло+1, "ЧЦ="+ДлинаНомераБезПрефикса+"; ЧВН=; ЧГ=");
3. xan333 37 11.04.19 16:33 Сейчас в теме
(1)

1. tusv 26 11.04.19 15:59
Что то много лишних букв
В Запросе Вторую временную таблицу зачем? Когда Можно сгруппировать и по Ссылка, вместо НомерСтроки.
Да и можно сразу

Мне нужно было пронумеровать строки в результате запроса, приведенный вами фрагмент эту задачу не решает
4. tusv 158 11.04.19 19:56 Сейчас в теме
(3)
Мне нужно было пронумеровать строки в результате запроса, приведенный вами фрагмент эту задачу не решает

Вы нумеруете строки для того, чтобы Сгруппировать по номеру строки. Совершенно лишняя операция. Сгруппируйте по ссылке. То же самое, только быстрее на 30%
ВЫБРАТЬ ПЕРВЫЕ 30
	РеализацияТоваровУслуг.Номер КАК Номер,
	РеализацияТоваровУслуг.Ссылка КАК Ссылка
ПОМЕСТИТЬ Данные
ИЗ
	Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг

УПОРЯДОЧИТЬ ПО
	РеализацияТоваровУслуг.Дата УБЫВ
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ ПЕРВЫЕ 1
	СУММА(А.П * Б.С) / МИНИМУМ(А.П) КАК Ответ
ИЗ
	Р16 КАК А,
	Р16 КАК Б,
	Данные КАК Данные
ГДЕ
	Б.С < 10
	И ПОДСТРОКА(Данные.Номер, 17 - А.С, 1) = ПОДСТРОКА("0123456789", Б.С + 1, 1)

СГРУППИРОВАТЬ ПО
	Данные.Ссылка

УПОРЯДОЧИТЬ ПО
	Ответ УБЫВ
Показать
Прикрепленные файлы:
6. xan333 37 12.04.19 09:26 Сейчас в теме
(4)
ВЫБРАТЬ ПЕРВЫЕ 30
РеализацияТоваровУслуг.Номер КАК Номер,
РеализацияТоваровУслуг.Ссылка КАК Ссылка
ПОМЕСТИТЬ Данные
ИЗ
Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг

УПОРЯДОЧИТЬ ПО
РеализацияТоваровУслуг.Дата УБЫВ
;

////////////////////////////////////////////////////////////­­////////////////////
ВЫБРАТЬ ПЕРВЫЕ 1
СУММА(А.П * Б.С) / МИНИМУМ(А.П) КАК Ответ
ИЗ
Р16 КАК А,
Р16 КАК Б,
Данные КАК Данные
ГДЕ
Б.С < 10
И ПОДСТРОКА(Данные.Номер, 17 - А.С, 1) = ПОДСТРОКА("0123456789", Б.С + 1, 1)

СГРУППИРОВАТЬ ПО
Данные.Ссылка

УПОРЯДОЧИТЬ ПО
Ответ УБЫВ
Показать

Вы моделировали ситуацию в своей базе? С номером документа включающим "/"? Ваш запрос верно определяет последний номер документа? Приведите целиком ваш запрос, мне пришлось вставлять в него недостающие временные таблицы, и он не дает мне правильный номер, у меня получилось вот так:
ВЫБРАТЬ ПЕРВЫЕ 30
    РеализацияТоваровУслуг.Номер КАК Номер,
    РеализацияТоваровУслуг.Ссылка КАК Ссылка
ПОМЕСТИТЬ Данные
ИЗ
    Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг

УПОРЯДОЧИТЬ ПО
    РеализацияТоваровУслуг.Дата УБЫВ
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	0 КАК С,
	1 КАК П
ПОМЕСТИТЬ Р16

ОБЪЕДИНИТЬ

ВЫБРАТЬ
	1,
	10

ОБЪЕДИНИТЬ

ВЫБРАТЬ
	2,
	100

ОБЪЕДИНИТЬ

ВЫБРАТЬ
	3,
	1000

ОБЪЕДИНИТЬ

ВЫБРАТЬ
	4,
	10000

ОБЪЕДИНИТЬ

ВЫБРАТЬ
	5,
	100000

ОБЪЕДИНИТЬ

ВЫБРАТЬ
	6,
	1000000

ОБЪЕДИНИТЬ

ВЫБРАТЬ
	7,
	10000000

ОБЪЕДИНИТЬ

ВЫБРАТЬ
	8,
	100000000

ОБЪЕДИНИТЬ

ВЫБРАТЬ
	9,
	1000000000

ОБЪЕДИНИТЬ

ВЫБРАТЬ
	10,
	10000000000

ОБЪЕДИНИТЬ

ВЫБРАТЬ
	11,
	100000000000

ОБЪЕДИНИТЬ

ВЫБРАТЬ
	12,
	1000000000000

ОБЪЕДИНИТЬ

ВЫБРАТЬ
	13,
	10000000000000

ОБЪЕДИНИТЬ

ВЫБРАТЬ
	14,
	100000000000000

ОБЪЕДИНИТЬ

ВЫБРАТЬ
	15,
	1000000000000000

ОБЪЕДИНИТЬ

ВЫБРАТЬ
	16,
	10000000000000000
;


////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ ПЕРВЫЕ 1
    СУММА(А.П * Б.С) / МИНИМУМ(А.П) КАК Ответ
ИЗ
    Р16 КАК А,
    Р16 КАК Б,
    Данные КАК Данные
ГДЕ
    Б.С < 10
    И ПОДСТРОКА(Данные.Номер, 17 - А.С, 1) = ПОДСТРОКА("0123456789", Б.С + 1, 1)

СГРУППИРОВАТЬ ПО
    Данные.Ссылка

УПОРЯДОЧИТЬ ПО
    Ответ УБЫВ
Показать
8. xan333 37 12.04.19 09:54 Сейчас в теме
(6)Ваш вариант работает, разобрался почему были разные результаты. У вас сортировка в первом запросе по Дате, а у меня по МоментВремени. Верный номер на моих данных определялся по МоментВремени.
10. tusv 158 12.04.19 14:42 Сейчас в теме
(6)(8)
Вы моделировали ситуацию в своей базе? С номером документа включающим "/"?

Да моделировал в Демо торговле. В диаграмме Ваш запрос со второй таблицей и без нее. И оба не работают, ибо возвращается максимальный номер первых 30 - последних документов без учета Организаций
У вас сортировка в первом запросе по Дате, а у меня по МоментВремени. Верный номер на моих данных определялся по МоментВремени.

У меня в примере не правильно. Что такое МоментВремени. Это составное не индексированное поле из Дата и Ссылка. Потому его не рекомендуют использовать. Правильней сортировать по Дата убыв, Ссылка убыв
11. xan333 37 12.04.19 14:56 Сейчас в теме
(10) У меня база Бухгалтерия 3 и одна организация, для случая нескольких Организаций возможно последний номер получается не верно
2. xan333 37 11.04.19 16:22 Сейчас в теме
Совершенству нет предела! Улучшите и доработайте как вам нужно, если есть желание. У меня Алгоритм работает в реальной базе и свою задачу выполняет.
5. Oldsad 12.04.19 08:21 Сейчас в теме
(2)

К сожалению очень много подобных костылей работает в реальных базах и
свою задачу выполняет

И это понятно и объяснимо, когда нужно заставить работать базу "здесь и сейчас", и времени сделать грамотное и красивое решение нет

Вы же выложили ЭТО на инфостарте

Единственная ценность ЭТОГО, это запрос, в котором строки преобразуются в числа,
но и в нем используются не нужные временные таблицы, на что вам совершенно справедливо указали

П.С. Данный код в общем случае не решает поставленную задачу
7. xan333 37 12.04.19 09:29 Сейчас в теме
(5)Вы видимо до сих пор отлаживаете свои разработки, если ни одной публикации у вас нет на Инфостарте. Видимо стремитесь к идеалу. Код решает задачу. Это не голая теория, он работает в реальной рабочей базе Бухгалтерия3.
9. Oldsad 12.04.19 10:27 Сейчас в теме
(7)

от того что код работает в реальной базе, лучше он не становится

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

во вторых, попробуйте создать один документ, записать его к примеру вначале года (перед этим не забудьте сделать тысячу документов из предыдущего пункта), затем создать еще один документ и записать

и это только вопросы к работоспособности

про такие мелочи как автонумерация в запросе я вообще молчу, т.к. там нумерация как пятая нога собаке
12. xan333 37 12.04.19 15:00 Сейчас в теме
(9)В моем конкретном случае нет такого объемного документооборота, не более тысячи документов в год, бухгалтера довольны что им не приходится номер руками перебивать. В любой момент простым изменением значения константы я могу отключить эту нестандартную нумерацию.
Оставьте свое сообщение