Имя: Пароль:
1C
1С v8
Убрать Лидирующие нули при записи.
0 Ghost1830
 
24.08.20
15:26
Добрый день. УПП 1.3. РАУЗ.
Тема уже не новая и в разных формулировках была,но подходящего ответа не нашла. Записываем номер документа в формате: Префикс+ДДмм+"."+ Порядковый номер. Например, КГ2408.001. Как убрать незначащие нули после "."?
Вот обе процедуры:
Процедура ДобавитьПрефиксОрганизации_1(ДокументОбъект, Префикс) Экспорт
    
    // Если в документе нет реквизита "Организация" или для организации не задан префикс,
    // то используем пустой префикс, иначе используем префикс организации.
    Префикс = "0";
    Если ДокументОбъект.Метаданные().Реквизиты.Найти("Организация") <> Неопределено Тогда
        ПрефиксОрганизации = ПолучитьЗначениеРеквизита(ДокументОбъект.Организация, "Префикс");
        Если ЗначениеЗаполнено(ПрефиксОрганизации)  Тогда

            ДатаГод = Формат(ДокументОбъект.Дата, "ДФ=ддММ");
                    ПрефиксДата = Строка(ДатаГод);
            Префикс = ПрефиксОрганизации + ПрефиксДата + ".";

        Иначе
            Префикс = ПрефиксОрганизации;
        КонецЕсли;
    КонецЕсли;
    
КонецПроцедуры


// процедура формирования номера документа
Процедура ПриУстановкеНовогоНомераДляДокументов_1(Источник, СтандартнаяОбработка, Префикс) Экспорт

    ДобавитьПрефиксОрганизации_1(Источник, Префикс);
    ДобавитьПрефиксУзла(Префикс);

КонецПроцедуры
1 Philix
 
24.08.20
15:44
(0) Мэтр, таким макаром Вы убиваете встроенный нумератор, так как он будет нормально работать только с лидирующими нулями и после присвоения номера 9 в пределах текущей даты, он сломается.
По сути: Вам нужно разобрать дату документа на отдельные числа (не строки, а числа), и каждое число отдельно форматировать так, как считаете нужным.
2 spiller26
 
24.08.20
15:57
(0) Формировать номер самому, у вас не хватает поиска последнего номера и присвоения после ".".
3 spiller26
 
24.08.20
16:12
(0) Я делал свою нумерацию для СФ на аванс (бухи заказали). Думаю разберётесь. Принцип нумерации после "А", у вас ".".

Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
    Если ЭтоНовый() и ВидСчетаФактуры = Перечисления.ВидСчетаФактурыВыставленного.НаАванс Тогда
        Номер = абтПолучитьНомерСчетаФактурыНаАванс();
        ПредставлениеНомера = Номер;
    КонецЕсли;
КонецПроцедуры


Функция абтПолучитьНомерСчетаФактурыНаАванс()
    
    НовыйНомерСФА="";
    
    НомерРеализации = "";
    ДатаРеализации = НачалоГода(Дата);
    НомерСФА = "";
    ДатаСФА = НачалоГода(Дата);
    
    НумерацияСчетФактурСтандарт = Истина;
    Попытка
        НумерацияСчетФактурСтандартCRM = Константы.abtНумерацияСчетФактурСтандартCRM.Получить();
    Исключение
        НумерацияСчетФактурСтандартCRM = Ложь;
    КонецПопытки;    
    
    //найти последнюю реализацию
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ ПЕРВЫЕ 1
    |    РеализацияТоваровУслуг.Номер КАК НомерРеализации,
    |    РеализацияТоваровУслуг.Дата КАК ДатаРеализации
    |ИЗ
    |    Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
    |ГДЕ
    |    РеализацияТоваровУслуг.Дата <= &Дата
    |   //ПрефиксацияCRM
    |    И РеализацияТоваровУслуг.ВидОперации = ЗНАЧЕНИЕ(Перечисление.ВидыОперацийРеализацияТоваров.Товары)
    |    И РеализацияТоваровУслуг.Дата >= НАЧАЛОПЕРИОДА(&Дата, ГОД)
    |
    |УПОРЯДОЧИТЬ ПО
    |    РеализацияТоваровУслуг.Дата УБЫВ,
    |    НомерРеализации УБЫВ";    
    Запрос.УстановитьПараметр("Дата", КонецДня(Дата));
    Если НумерацияСчетФактурСтандартCRM Тогда
        Запрос.Текст = СтрЗаменить(Запрос.Текст, "//ПрефиксацияCRM", "И РеализацияТоваровУслуг.Номер ПОДОБНО ""%/%""");
    КонецЕсли;
    РезультатЗапроса = Запрос.Выполнить();
    Если РезультатЗапроса.Пустой() Тогда
        НовыйНомерСФА = "1А1"; //начало года и первая СФ на аванс
    Иначе
        ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
        Если ВыборкаДетальныеЗаписи.Следующий() Тогда
            ДатаРеализации = НачалоДня(ВыборкаДетальныеЗаписи.ДатаРеализации);
            НомерРеализации = ВыборкаДетальныеЗаписи.НомерРеализации;
        КонецЕсли;    
    КонецЕсли;    
    
    //найти последние номера СФ на аванс
    Максимал = 0;
    ПрефиксСФА = "";
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    СчетФактураВыданный.Номер КАК Номер,
    |    НАЧАЛОПЕРИОДА(СчетФактураВыданный.Дата, ДЕНЬ) КАК Дата
    |ПОМЕСТИТЬ ВтСфАванс
    |ИЗ
    |    Документ.СчетФактураВыданный КАК СчетФактураВыданный
    |ГДЕ
    |    СчетФактураВыданный.ВидСчетаФактуры = ЗНАЧЕНИЕ(Перечисление.ВидСчетаФактурыВыставленного.НаАванс)
    |    И СчетФактураВыданный.Номер ПОДОБНО ""%А%""
    |    И СчетФактураВыданный.Дата МЕЖДУ НАЧАЛОПЕРИОДА(&ДатаНачала, ДЕНЬ) И &Дата
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |    МАКСИМУМ(ВтСфАванс.Дата) КАК Дата
    |ПОМЕСТИТЬ ВтМакс
    |ИЗ
    |    ВтСфАванс КАК ВтСфАванс
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |    ВтСфАванс.Номер КАК НомерСФА,
    |    ВтСфАванс.Дата КАК ДатаСФА
    |ИЗ
    |    ВтМакс КАК ВтМакс
    |        ЛЕВОЕ СОЕДИНЕНИЕ ВтСфАванс КАК ВтСфАванс
    |        ПО ВтМакс.Дата = ВтСфАванс.Дата
    |
    |УПОРЯДОЧИТЬ ПО
    |    НомерСФА";
    Запрос.УстановитьПараметр("ДатаНачала", НачалоДня(ДатаРеализации));
    Запрос.УстановитьПараметр("Дата",       КонецДня(Дата));
    ВыборкаДетальныеЗаписи = Запрос.Выполнить().Выбрать();
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл  
        Если ВыборкаДетальныеЗаписи.НомерСФА = Null Тогда
            //нет СФ на аванс
            Максимал = 0;
            ПрефиксСФА = "1А";
        Иначе
            Поз = СтрНайти(ВыборкаДетальныеЗаписи.НомерСФА,  "А" , НаправлениеПоиска.СНачала, 1, 1);
            Порядковый = Число(Прав(ВыборкаДетальныеЗаписи.НомерСФА, СтрДлина(ВыборкаДетальныеЗаписи.НомерСФА)- Поз));
            Если Порядковый > Максимал Тогда
                Максимал = Порядковый;
                ДатаСФА = ВыборкаДетальныеЗаписи.ДатаСФА;
            КонецЕсли;
            ТекПрефиксСФА = СокрЛП(Лев(ВыборкаДетальныеЗаписи.НомерСФА, Поз));
            Если ПрефиксСФА <> ТекПрефиксСФА Тогда  
                ПрефиксСФА = ТекПрефиксСФА;
                Максимал = Порядковый;
                ДатаСФА = ВыборкаДетальныеЗаписи.ДатаСФА;
            КонецЕсли;    
        КонецЕсли;
    КонецЦикла;
    НомерСФА = (ПрефиксСФА+Строка(Максимал)); //номер последней СФ на Аванс
    
    Если ДатаСФА <= ДатаРеализации Тогда
        Если НЕ НомерРеализации = "" Тогда
            //префикс берем из реализации
            Если НумерацияСчетФактурСтандартCRM Тогда
                Поз = СтрНайти(НомерРеализации,  "/" , НаправлениеПоиска.СНачала, 1, 1);
                Префикс = Лев(НомерРеализации, Поз-1);
            Иначе
                Префикс = ПрефиксацияОбъектовКлиентСервер.НомерНаПечать(НомерРеализации, Истина, Ложь);    
                Префикс = СтрЗаменить(Префикс, " ","");                
            КонецЕсли;    
            
            //сверяем номер последней реализации и номер последней сфа
            ПозА = СтрНайти(НомерСФА,  "А" , НаправлениеПоиска.СНачала, 1, 1);
            ПрефиксСФАПроверочный = Лев(НомерСФА, ПозА-1);
            Если Префикс > ПрефиксСФАПроверочный Тогда
                Максимал = 0;    
                ПрефиксСФА = Строка(Префикс)+"А";    
            КонецЕсли;
        КонецЕсли;
    КонецЕсли;    
        
    Максимал = Максимал + 1;
    
    НовыйНомерСФА = абтПроверитьСуществованияНомер(ПрефиксСФА, Максимал, Дата);
    
    Возврат СокрЛП(НовыйНомерСФА);
        
КонецФункции

Функция абтПроверитьСуществованияНомер(ПрефиксСФА, Максимал, ДатаГода)
    
    СуществуетСФА = Истина;
    
    Пока СуществуетСФА Цикл
        
        НомерСФА = ПрефиксСФА+Строка(Максимал);
            
        Запрос = Новый Запрос;
        Запрос.Текст =
        "ВЫБРАТЬ
        |    СчетФактураВыданный.Номер КАК НомерСФ
        |ИЗ
        |    Документ.СчетФактураВыданный КАК СчетФактураВыданный
        |ГДЕ
        |    СчетФактураВыданный.ВидСчетаФактуры = ЗНАЧЕНИЕ(Перечисление.ВидСчетаФактурыВыставленного.НаАванс)
        |    И СчетФактураВыданный.Дата МЕЖДУ НАЧАЛОПЕРИОДА(&ДатаГода, ГОД) И КОНЕЦПЕРИОДА(&ДатаГода, ГОД)
        |    И СчетФактураВыданный.Номер = &Номер";
        Запрос.УстановитьПараметр("Номер", НомерСФА);
        Запрос.УстановитьПараметр("ДатаГода", ДатаГода);
        ТаблицаНомеровСФА = Запрос.Выполнить().Выгрузить();
        Если ТаблицаНомеровСФА.Количество() = 0 Тогда
            СуществуетСФА = Ложь;
        Иначе
            СуществуетСФА = Истина;
            Максимал = Максимал + 1;
        КонецЕсли;    
    КонецЦикла;
    
    Возврат НомерСФА;
    
КонецФункции