Альтернативный нумератор 1С

11.10.12

Разработка - Механизмы платформы 1С

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

1. Создаём общий модуль, например "Процедуры разработчика"

2. Устанавливаем в свойствах модуля необходимые признаки "Клиент (обычный)","Сервер" и "Внешнее приложение"

 

3. Вносим в созданный общий модуль следующий код:

  Процедура УстановитьНомерДокумента(Источник, СтандартнаяОбработка, Префикс) Экспорт
 
           СтандартнаяОбработка = Ложь;
           
           Префикс = СокрЛП(Источник.Организация.Префикс);
           ВидДокумента = Источник.Метаданные().Имя;
            Если ВидДокумента = "СчетФактураВыданный" Тогда
                Если Источник.ВидСчетаФактуры = Перечисления.ВидСчетаФактурыВыставленного.НаАванс Тогда
                    Префикс = "А"+Префикс;
                КонецЕсли;    
            КонецЕсли;    

            Префикс4 = Префикс;

            
            НомерЧисло = 1;
            
            Запрос = Новый Запрос;
            Запрос.Текст="ВЫБРАТЬ ПЕРВЫЕ 1
                         |    ПОДСТРОКА(Документ.Номер, 5, 10) КАК Номер
                         |ИЗ
                         |    Документ.РеализацияТоваровУслуг КАК Документ
                         |ГДЕ
                         |    ПОДСТРОКА(Документ.Номер, 1, 4) = &Префикс
                         |    И Документ.Дата МЕЖДУ НАЧАЛОПЕРИОДА(&Дата, ГОД) И КОНЕЦПЕРИОДА(&Дата, ГОД)
                         |    И НЕ ПОДСТРОКА(Документ.Номер, 5, 10) ПОДОБНО ""%[^0-9]%""
                         |
                         |УПОРЯДОЧИТЬ ПО
                         |    Номер УБЫВ";
                        
            Запрос.Текст = СтрЗаменить(Запрос.Текст,"РеализацияТоваровУслуг",ВидДокумента);
            
            Пока СтрДлина(Префикс4)

                    Префикс4 = Префикс4 + "0";
            КонецЦикла;                
                        
            Запрос.УстановитьПараметр("Префикс",Префикс4);
            Запрос.УстановитьПараметр("Дата",Источник.Дата);
            Выборка = Запрос.Выполнить().Выбрать();
            
            Если Выборка.Следующий() Тогда
                Попытка
                 НомерЧисло = Число(Выборка.Номер)+1;
                 Источник.Номер = Префикс+Формат(НомерЧисло,"ЧЦ="+Строка(СтрДлина(Источник.Номер)-СтрДлина(Префикс))+"; ЧВН=; ЧГ=");    
                Исключение
                КонецПопытки;
            Иначе    
                 НомерЧисло = 1;
                 Источник.Номер = Префикс+Формат(НомерЧисло,"ЧЦ="+Строка(СтрДлина(Источник.Номер)-СтрДлина(Префикс))+"; ЧВН=; ЧГ=");    
            КОнецЕсли;

       
 
КонецПроцедуры   

 

4. Добавляем новую подписку на событие, даём имя, в поле "Источник" выбираем необходимые документы, в поле "Событие" выбираем "ПриУстановкеНовогоНомера", в поле "Обработчик" выбираем созданную нами процедуру.

 

5. Сохраняем всё это в базу.

Результат: после "кривых" номеров создаётся документ с правильным номером.

6. Несложная доработка позволяет сделать периодическую префиксацию.

Для этого создаём периодический регистр сведений "ПрефиксыОрганизаций" (ресурс - префикс) и вносим небольшое изменение в код.

      Вместо:

             Префикс = СокрЛП(Источник.Организация.Префикс);

      Пишем:

            СтруктураОтбора = Новый Структура("Организация",Источник.Организация);
            Префиксы = РегистрыСведений.ПрефиксыОрганизаций.СрезПоследних(Источник.Дата,СтруктураОтбора);
            Если Префиксы.Количество()>0 Тогда
             Префикс = Префиксы[0].Префикс;    
            Иначе    
             Префикс = СокрЛП(Источник.Организация.Префикс);
            КонецЕсли;
 

См. также

Поинтегрируем: сервисы интеграции – новый стандарт или просто коннектор?

Обмен между базами 1C Администрирование СУБД Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

В платформе 8.3.17 появился замечательный механизм «Сервисы интеграции». Многие считают, что это просто коннектор 1С:Шины. Так ли это?

11.03.2024    4512    dsdred    53    

71

Как готовить и есть массивы

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

Все мы используем массивы в своем коде. Это один из первых объектов, который дают ученикам при прохождении обучения программированию. Но умеем ли мы ими пользоваться? В этой статье я хочу показать все методы массива, а также некоторые фишки в работе с массивами.

24.01.2024    5289    YA_418728146    25    

63

Планы обмена VS История данных

Обмен между базами 1C Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Вы все еще регистрируете изменения только на Планах обмена и Регистрах сведений?

11.12.2023    6408    dsdred    36    

111

1С-ная магия

Механизмы платформы 1С Бесплатно (free)

Язык программирования 1С содержит много нюансов и особенностей, которые могут приводить к неожиданным для разработчика результатам. Сталкиваясь с ними, программист начинает лучше понимать логику платформы, а значит, быстрее выявлять ошибки и видеть потенциальные узкие места своего кода там, где позже можно было бы ещё долго медитировать с отладчиком в поисках источника проблемы. Мы рассмотрим разные примеры поведения кода 1С. Разберём результаты выполнения и ответим на вопросы «Почему?», «Как же так?» и «Зачем нам это знать?». 

06.10.2023    18473    SeiOkami    46    

118

Дефрагментация и реиндексация после перехода на платформу 8.3.22

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

Начиная с версии платформы 8.3.22 1С снимает стандартные блокировки БД на уровне страниц. Делаем рабочий скрипт, как раньше.

14.09.2023    12087    human_new    27    

74

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    8819    YA_418728146    6    

141

Внешние компоненты Native API на языке Rust - Просто!

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

Внешние компоненты для 1С можно разработывать очень просто, пользуясь всеми преимуществами языка Rust - от безопасности и кроссплатформенности до удобного менеджера библиотек.

20.08.2023    6279    sebekerga    54    

94

Все скопируем и вставим! (Буфер обмена в 1С 8.3.24)

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

Рассмотрим новую возможность 8.3.24 и как её можно эффективно использовать

27.06.2023    15984    SeiOkami    31    

103
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. сибирь 14 03.10.12 07:47 Сейчас в теме
Добрый день, вопрос по поводу счет-фактуры на аванс. А разве не было разъяснения, что нумерация у счет-факутр на аванс и просто у счет-фактур -должна быть сквозная?
Еще вопрос, более серьезный! :)
Для некоторых документов "нумератор" -общий - похоже ваша обработка этого не учитывает. Например, бухгалтер "влипил" номер 334 без нулей у одного документа, а номер 00000335 -уже есть у другого, добавляя нули к 335 - получим проблему.
С уважением Сибирь!
4. den_bo 78 03.10.12 14:21 Сейчас в теме
(1) сибирь, если нужно сделать сквозную нумерацию, данный кусок кода

Если ВидДокумента = "СчетФактураВыданный" Тогда
Если Источник.ВидСчетаФактуры = Перечисления.ВидСчетаФактурыВыставленного.НаАванс Тогда
Префикс = "А"+Префикс;
КонецЕсли;
КонецЕсли;


просто убираем. У нас пока используется нумерация с префиксом "А"
2. ig0rec 03.10.12 08:17 Сейчас в теме
Запрос.Текст = СтрЗаменить(Запрос.Текст,"РеализацияТоваровУслуг",ВидДокумента);
Мне кажется совершенно лишняя строка, если вы и так делаете только для Счет-фактур выданных
5. den_bo 78 03.10.12 14:22 Сейчас в теме
(2) ig0rec, Это сделано с учётом возможности использования запроса для различных видов документов
7. ig0rec 03.10.12 16:37 Сейчас в теме
(5) в таких ситуациях обычно использую следующую конструкцию (красивее выглядит, удобнее читается)
Запрос.Текст="ВЫБРАТЬ ПЕРВЫЕ 1
| ПОДСТРОКА(Документ.Номер, 5, 10) КАК Номер
|ИЗ
| Документ." + ВидДокумента + " КАК Документ
|ГДЕ
| ПОДСТРОКА(Документ.Номер, 1, 4) = &Префикс
| И Документ.Дата МЕЖДУ НАЧАЛОПЕРИОДА(&Дата, ГОД) И КОНЕЦПЕРИОДА(&Дата, ГОД)
| И НЕ ПОДСТРОКА(Документ.Номер, 5, 10) ПОДОБНО ""%[^0-9]%""
|
|УПОРЯДОЧИТЬ ПО
| Номер УБЫВ";
3. Gazulo 25 03.10.12 11:08 Сейчас в теме
Что за непонятный код:
Пока СтрДлина(Префикс4) Префикс4 = Префикс4 + "0";
КонецЦикла;
6. den_bo 78 03.10.12 14:27 Сейчас в теме
(3) Gazulo, префиксы бывают различной , (как правило от 1 символа до 4). Выполняется дополнение до 4-х символов, чтобы конструкция запроса "ПОДСТРОКА(Документ.Номер, 1, 4) = &Префикс" правильно отрабатывала.
11. _Dmitry_ 11.10.12 14:46 Сейчас в теме
den_bo, пожалуйста посмотрите внимательно свой цикл в (3). Я не соображу как его требуется дополнить.
13. registration123 2 23.05.13 16:23 Сейчас в теме
(3) Gazulo, Пока СтрДлина(Префикс4)<4 цикл
Префикс4 = Префикс4 + "0";
КонецЦикла;
Для случаев когда префикс для организации меньше 3-х символов ( для добавленного А - меньше 4-х, соответственно).
soulsteps; +1 Ответить
14. soulsteps 73 29.03.14 11:50 Сейчас в теме
(13) registration123, Да уж...а получение значения переменной "Префикс4" превратиться в "вечное ожидание" (если полагаться на код, представленный автором, ведь если начальное значение MIN(СтрДлина(Префикс4))=1 ([хотя бы), то конструкция ПОКА СтрДлина(Префикс4) Цикл
Префикс4 = Префикс4 + "0"; КонецЦикла организует "вечный цикл")...))) Статья хорошая, автору +.
8. sCHTASS 49 03.10.12 16:39 Сейчас в теме
АДСКИЙ ЗАПРОС! При достаточном количестве документов будет долго и с напрягом выполняться. Лучше заморочиться с кэшированием искомого номера документа.
9. den_bo 78 03.10.12 17:45 Сейчас в теме
(8) sCHTASS, на практике при не очень большом количестве документов одного вида (до 10т в год) работает достаточно быстро. В инных случаях конечно необходима оптимизация.
10. musatov1c.ru 6 05.10.12 18:23 Сейчас в теме
Спасибо большое! То что надо. Как раз в КА нужно с нумерацией помухлевать :)
12. proger1c81 17.10.12 03:12 Сейчас в теме
плюс за смелость публикации. Уверен, что многие с такой проблемой нумерации сталкиваются и каждый по-своему эту проблему решает. Я тоже на эти грабли становился.
15. jobkostya1c_ERP 100 21.03.15 10:17 Сейчас в теме
Интересная техника нумерации. Почти такую же делал. Надо тоже опубликовать. Маленький вопрос только. Я на всякий случай в привилегированный модуль все выносил. Мало ли что при проверках вылезет.
Оставьте свое сообщение