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

11.04.19

Разработка - Математика и алгоритмы

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

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

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

Решена задача создания собственного алгоритма нумерации документов Реализация в 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.

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

См. также

Метод Дугласа-Пойкера для эффективного хранения метрик

Математика и алгоритмы Платформа 1C v8.2 Конфигурации 1cv8 Россия Абонемент ($m)

На написание данной работы меня вдохновила работа @glassman «Переход на ClickHouse для анализа метрик». Автор анализирует большой объем данных, много миллионов строк, и убедительно доказывает, что ClickHouse справляется лучше PostgreSQL. Я же покажу как можно сократить объем данных в 49.9 раз при этом: 1. Сохранить значения локальных экстремумов 2. Отклонения от реальных значений имеют наперед заданную допустимую погрешность.

1 стартмани

30.01.2024    1753    stopa85    12    

33

Алгоритм симплекс-метода для решения задачи раскроя

Математика и алгоритмы Бесплатно (free)

Разработка алгоритма, построенного на модели симплекс-метода, для нахождения оптимального раскроя.

19.10.2023    4415    user1959478    50    

34

Регулярные выражения на 1С

Математика и алгоритмы Инструментарий разработчика Платформа 1С v8.3 Мобильная платформа Россия Абонемент ($m)

Что ж... лучше поздно, чем никогда. Подсистема 1С для работы с регулярными выражениями: разбор выражения, проверка на соответствие шаблону, поиск вхождений в тексте.

1 стартмани

09.06.2023    7450    4    SpaceOfMyHead    17    

56

Модель распределения суммы по базе

Математика и алгоритмы Платформа 1С v8.3 Россия Абонемент ($m)

Обычно под распределением понимают определение сумм пропорционально коэффициентам. Предлагаю включить сюда также распределение по порядку (FIFO, LIFO) и повысить уровень размерности до 2-х. 1-ое означает, что распределение может быть не только пропорциональным, но и по порядку, а 2-ое - это вариант реализации матричного распределения: по строкам и столбцам. Возможно вас заинтересует также необычное решение этой задачи через создание DSL на базе реализации текучего интерфейса

1 стартмани

21.03.2022    7848    7    kalyaka    11    

44

Изменения формата файлов конфигурации (CF) в 8.3.16

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

Дополнение по формату файлов конфигурации (*.cf) в версии 8.3.16.

16.12.2021    4443    fishca    13    

36

Интересная задача на Yandex cup 2021

Математика и алгоритмы Бесплатно (free)

Мое решение задачи на Yandex cup 2021 (frontend). Лабиринт. JavaScript.

12.10.2021    8830    John_d    73    

46

Механизм анализа данных. Кластеризация.

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

Подробный разбор, с примером использования, встроенного механизма кластеризации 1С.

31.08.2021    7796    dusha0020    8    

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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