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