Простая и полезная доработка. Позволяет решить проблему сбивания нумерации в документах. Иногда менеджерам или бухгалтерам необходимо внести кривой номер типа "000000305/2". Однако в стандартном нумераторе 1С после такого номера нумерация сбивается. Спорить с пользователями иногда бывает бесполезно и вредно. Приходится что-то придумывать. Предлагаемая доработка решает эту проблему. Учитывается префиксация. Для счёт-фактур на аванс добавляется префикс "А".
1. Создаём общий модуль, например «Процедуры разработчика»
2. Устанавливаем в свойствах модуля необходимые признаки «Клиент (обычный)»,»Сервер» и «Внешнее приложение»

3. Вносим в созданный общий модуль следующий код:
Процедура УстановитьНомерДокумента(Источник, СтандартнаяОбработка, Префикс) Экспорт
СтандартнаяОбработка = Ложь;
Префикс = СокрЛП(Источник.Организация.Префикс);
ВидДокумента = Источник.Метаданные().Имя;
Если ВидДокумента = «СчетФактураВыданный» Тогда
Если Источник.ВидСчетаФактуры = Перечисления.ВидСчетаФактурыВыставленного.НаАванс Тогда
Префикс = «А»+Префикс;
КонецЕсли;
КонецЕсли;
Префикс4 = Префикс;
НомерЧисло = 1;
Запрос = Новый Запрос;
Запрос.Текст=»ВЫБРАТЬ ПЕРВЫЕ 1
| ПОДСТРОКА(Документ.Номер, 5, 10) КАК Номер
|ИЗ
| Документ.РеализацияТоваровУслуг КАК Документ
|ГДЕ
| ПОДСТРОКА(Документ.Номер, 1, 4) = &Префикс
| И Документ.Дата МЕЖДУ НАЧАЛОПЕРИОДА(&Дата, ГОД) И КОНЕЦПЕРИОДА(&Дата, ГОД)
| И НЕ ПОДСТРОКА(Документ.Номер, 5, 10) ПОДОБНО «»%[#k8SjZc9Dxk0-9]%»»
|
|УПОРЯДОЧИТЬ ПО
| Номер УБЫВ»;
Запрос.Текст = СтрЗаменить(Запрос.Текст,»РеализацияТоваровУслуг»,ВидДокумента);
Пока СтрДлина(Префикс4)
Префикс4 = Префикс4 + «0»;
КонецЦикла;
Запрос.УстановитьПараметр(«Префикс»,Префикс4);
Запрос.УстановитьПараметр(«Дата»,Источник.Дата);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Попытка
НомерЧисло = Число(Выборка.Номер)+1;
Источник.Номер = Префикс+Формат(НомерЧисло,»ЧЦ=»+Строка(СтрДлина(Источник.Номер)-СтрДлина(Префикс))+»; ЧВН=; ЧГ=»);
Исключение
КонецПопытки;
Иначе
НомерЧисло = 1;
Источник.Номер = Префикс+Формат(НомерЧисло,»ЧЦ=»+Строка(СтрДлина(Источник.Номер)-СтрДлина(Префикс))+»; ЧВН=; ЧГ=»);
КОнецЕсли;
КонецПроцедуры
4. Добавляем новую подписку на событие, даём имя, в поле «Источник» выбираем необходимые документы, в поле «Событие» выбираем «ПриУстановкеНовогоНомера», в поле «Обработчик» выбираем созданную нами процедуру.

5. Сохраняем всё это в базу.
Результат: после «кривых» номеров создаётся документ с правильным номером.

6. Несложная доработка позволяет сделать периодическую префиксацию.
Для этого создаём периодический регистр сведений «ПрефиксыОрганизаций» (ресурс — префикс) и вносим небольшое изменение в код.
Вместо:
Префикс = СокрЛП(Источник.Организация.Префикс);
Пишем:
СтруктураОтбора = Новый Структура(«Организация»,Источник.Организация);
Префиксы = РегистрыСведений.ПрефиксыОрганизаций.СрезПоследних(Источник.Дата,СтруктураОтбора);
Если Префиксы.Количество()>0 Тогда
Префикс = Префиксы[0].Префикс;
Иначе
Префикс = СокрЛП(Источник.Организация.Префикс);
КонецЕсли;
Причины купить
Достоинства
Сравнение версий







Добрый день, вопрос по поводу счет-фактуры на аванс. А разве не было разъяснения, что нумерация у счет-факутр на аванс и просто у счет-фактур -должна быть сквозная?
Еще вопрос, более серьезный! 🙂
Для некоторых документов «нумератор» -общий — похоже ваша обработка этого не учитывает. Например, бухгалтер «влипил» номер 334 без нулей у одного документа, а номер 00000335 -уже есть у другого, добавляя нули к 335 — получим проблему.
С уважением Сибирь!
Запрос.Текст = СтрЗаменить(Запрос.Текст,»РеализацияТоваровУслуг»,ВидДокумента);
Мне кажется совершенно лишняя строка, если вы и так делаете только для Счет-фактур выданных
Что за непонятный код:
Пока СтрДлина(Префикс4) Префикс4 = Префикс4 + «0»;
КонецЦикла;
(1) сибирь, если нужно сделать сквозную нумерацию, данный кусок кода
Если Источник.ВидСчетаФактуры = Перечисления.ВидСчетаФактурыВыставленного.НаАванс Тогда
Префикс = «А»+Префикс;
КонецЕсли;
КонецЕсли;
просто убираем. У нас пока используется нумерация с префиксом «А»
(2) ig0rec, Это сделано с учётом возможности использования запроса для различных видов документов
(3) Gazulo, префиксы бывают различной , (как правило от 1 символа до 4). Выполняется дополнение до 4-х символов, чтобы конструкция запроса «ПОДСТРОКА(Документ.Номер, 1, 4) = &Префикс» правильно отрабатывала.
(5) в таких ситуациях обычно использую следующую конструкцию (красивее выглядит, удобнее читается)
Запрос.Текст=»ВЫБРАТЬ ПЕРВЫЕ 1
| ПОДСТРОКА(Документ.Номер, 5, 10) КАК Номер
|ИЗ
| Документ.» + ВидДокумента + » КАК Документ
|ГДЕ
| ПОДСТРОКА(Документ.Номер, 1, 4) = &Префикс
| И Документ.Дата МЕЖДУ НАЧАЛОПЕРИОДА(&Дата, ГОД) И КОНЕЦПЕРИОДА(&Дата, ГОД)
| И НЕ ПОДСТРОКА(Документ.Номер, 5, 10) ПОДОБНО «»%[#k8SjZc9Dxk0-9]%»»
|
|УПОРЯДОЧИТЬ ПО
| Номер УБЫВ»;
АДСКИЙ ЗАПРОС! При достаточном количестве документов будет долго и с напрягом выполняться. Лучше заморочиться с кэшированием искомого номера документа.
(8) sCHTASS, на практике при не очень большом количестве документов одного вида (до 10т в год) работает достаточно быстро. В инных случаях конечно необходима оптимизация.
Спасибо большое! То что надо. Как раз в КА нужно с нумерацией помухлевать 🙂
den_bo, пожалуйста посмотрите внимательно свой цикл в (3). Я не соображу как его требуется дополнить.
плюс за смелость публикации. Уверен, что многие с такой проблемой нумерации сталкиваются и каждый по-своему эту проблему решает. Я тоже на эти грабли становился.
(3) Gazulo, Пока СтрДлина(Префикс4)<4 цикл
Префикс4 = Префикс4 + «0»;
КонецЦикла;
Для случаев когда префикс для организации меньше 3-х символов ( для добавленного А — меньше 4-х, соответственно).
(13) registration123, Да уж…а получение значения переменной «Префикс4» превратиться в «вечное ожидание» (если полагаться на код, представленный автором, ведь если начальное значение MIN(СтрДлина(Префикс4))=1 ([хотя бы), то конструкция ПОКА СтрДлина(Префикс4) Цикл
Префикс4 = Префикс4 + «0»; КонецЦикла организует «вечный цикл»)…))) Статья хорошая, автору +.
Интересная техника нумерации. Почти такую же делал. Надо тоже опубликовать. Маленький вопрос только. Я на всякий случай в привилегированный модуль все выносил. Мало ли что при проверках вылезет.