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

11.04.19

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

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

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Собственный алгоритм нумерации документов:
.cfe 123,13Kb
8
8 Скачать (1 SM) Купить за 1 850 руб.

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

38

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

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

19.10.2023    7555    user1959478    51    

36

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

Расширение (+ обработка) представляют собою математический тренажер. Ваш ребенок сможет проверить свои знание на математические вычисление до 100.

2 стартмани

29.09.2023    3110    maksa2005    8    

26

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

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

1 стартмани

09.06.2023    10904    7    SpaceOfMyHead    18    

61

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

Три задачи - три идеи - три решения. Мало кода, много смысла. Мини-статья.

03.04.2023    4359    RustIG    9    

25

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

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

23.11.2022    3529    gzharkoj    14    

25

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

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

1 стартмани

21.03.2022    9042    7    kalyaka    11    

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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