Большинство хороших программистов делают свою работу не потому, что ожидают оплаты или признания, а потому что получают удовольствие от программирования (Linus Torvalds).
Страницы
пятница, 17 января 2014 г.
Убрать лидирующие нули из номера документа
Убрать лидирующие нули из номера документа может нам понадобиться в том случае, если мы, к примеру, формируем печатную форму и номер нужно привести к нормальному виду, не показывая лидирующие нули и префикс документа. Для этого можно воспользоваться готовой процедурой, которая преобразовывает номер к нужному нам виду. Содержится она в общем модуле ОбщегоНазначения:
// Процедура предназначена для преобразования номера документа.
//
// Параметры:
// Документ — (ДокументСсылка), документ, чей номер надо получить для печати.
//
// Возвращаемое значение.
// Строка — номер документа для печати
//
Функция ПолучитьНомерНаПечать ( Документ , МассивПрефиксов = Неопределено, ПечатьПрефиксовРИБ = Истина) Экспорт
Если Документ = Неопределено Тогда
Возврат 0 ;
КонецЕсли;
ПечатьПрефиксовРИБ = ОбщегоНазначения . ПолучитьЗначениеПеременной ( «ПечатьПрефиксаРИБ» ) И ПечатьПрефиксовРИБ ;
Номер = СокрЛП ( Документ . Номер );
Если ТипЗнч ( Документ ) <> Тип ( «ВыборкаИзРезультатаЗапроса» )
И ТипЗнч ( Документ ) <> Тип ( «Структура» ) Тогда
МетаданныеДокумента = Документ . Метаданные ();
Если МетаданныеДокумента . Реквизиты . Найти ( «НомерВходящегоДокумента» ) <> Неопределено Тогда
Если ЗначениеЗаполнено ( Документ . НомерВходящегоДокумента ) Тогда
Номер = СокрЛП ( Документ . НомерВходящегоДокумента );
КонецЕсли;
КонецЕсли;
Если ПечатьПрефиксовРИБ Тогда
МассивПрефиксовРИБ = ПолучитьМассивПрефиксовРИБ ();
КонецЕсли;
Если МассивПрефиксов = Неопределено Тогда
Если ТипЗнч ( Документ ) = Тип ( «ВыборкаИзРезультатаЗапроса» )
ИЛИ ТипЗнч ( Документ ) = Тип ( «Структура» ) Тогда
Организация = Документ . Организация ;
Если МетаданныеДокумента . Реквизиты . Найти ( «Организация» ) <> Неопределено Тогда
Организация = Документ . Организация ;
Если МетаданныеДокумента . Имя = «Доверенность» Тогда
ПрефиксДоверенности = «Д» ;
КонецЕсли;
Если ПечатьПрефиксовРИБ Тогда
// если печатаем префиксы РИБ в документах — не добавляем их в массив удаляемых префиксов
МассивПрефиксовДляОбхода = СформироватьМассивПрефиксовПоОрганизации ( Организация );
Иначе
МассивПрефиксовДляОбхода = СформироватьМассивПрефиксовДляРИБИОрганизации ( Организация );
КонецЕсли;
Если ПечатьПрефиксовРИБ Тогда
// если печатаем префиксы РИБ в документах — не добавляем их в массив удаляемых префиксов
Для Каждого ПрефиксИзМассива Из МассивПрефиксов Цикл
Если МассивПрефиксовРИБ . Найти ( ПрефиксИзМассива ) = Неопределено
И МассивПрефиксовДляОбхода . Найти ( ПрефиксИзМассива ) = Неопределено Тогда
МассивПрефиксовДляОбхода . Добавить ( ПрефиксИзМассива );
КонецЕсли;
КонецЦикла;
Иначе
МассивПрефиксовДляОбхода = МассивПрефиксов ;
КонецЕсли;
ПрефиксРИБ = «» ;
Если ПечатьПрефиксовРИБ Тогда
// определим, какие префиксы РИБ следует выводить на печать и удалим эти префиксы из номера
Для Каждого ПрефиксРИБИзМассива Из МассивПрефиксовРИБ Цикл
Если Найти ( Номер , ПрефиксРИБИзМассива ) = 1 Тогда
Номер = Сред ( Номер , СтрДлина ( ПрефиксРИБИзМассива ) + 1 );
ПрефиксРИБ = ПрефиксРИБ + ПрефиксРИБИзМассива ;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Если ПрефиксДоверенности <> «» Тогда
МассивПрефиксовДляОбхода . Добавить ( ПрефиксДоверенности );
КонецЕсли;
Если НЕ МетаданныеДокумента = Неопределено Тогда
Если МетаданныеДокумента . Имя = «НалоговаяНакладная»
ИЛИ МетаданныеДокумента . Имя = «Приложение2КНалоговойНакладной» Тогда
ТекМесяц = ‘20000101’ ;
Для Инд = 1 По 12 Цикл
МассивПрефиксовДляОбхода . Добавить ( «Н» + ПолучитьМесячныйПрефиксНалоговыхДокументов ( ТекМесяц ));
МассивПрефиксовДляОбхода . Добавить ( «П» + ПолучитьМесячныйПрефиксНалоговыхДокументов ( ТекМесяц ));
ТекМесяц = ДобавитьМесяц ( ТекМесяц , 1 );
КонецЦикла;
ТекМесяц = ‘20000101’ ;
Для Инд = 1 По 12 Цикл
МассивПрефиксовДляОбхода . Добавить ( ПолучитьМесячныйПрефиксНалоговыхДокументов ( ТекМесяц ));
ТекМесяц = ДобавитьМесяц ( ТекМесяц , 1 );
КонецЦикла;
МассивПрефиксовДляОбхода . Добавить ( «Н» );
МассивПрефиксовДляОбхода . Добавить ( «П» );
МассивПрефиксовДляОбхода . Добавить ( «U» );
МассивПрефиксовДляОбхода . Добавить ( «V» );
МассивПрефиксовДляОбхода . Добавить ( «W» );
Для Каждого ТекущийПрефикс ИЗ МассивПрефиксовДляОбхода Цикл
// удаление префикса из номера документа
Если Найти ( Номер , ТекущийПрефикс )= 1 Тогда
Номер = Сред ( Номер , СтрДлина ( ТекущийПрефикс )+ 1 );
КонецЕсли;
// так же, может остаться «минус» впереди
Если Лев ( Номер , 1 ) = «-» Тогда
Номер = Сред ( Номер , 2 );
КонецЕсли;
// удаление ведущих нулей
Пока Лев ( Номер , 1 )= «0» Цикл
Номер = Сред ( Номер , 2 );
КонецЦикла;
КонецЦикла;
УдалитьПрефиксОбособленногоПодразделенияИзНомера ( Документ , МетаданныеДокумента , Номер );
Если ПечатьПрефиксовРИБ И ПрефиксРИБ <> «» Тогда
Номер = ПрефиксРИБ + Номер ;
КонецЕсли;



Функция удаления лидирующих нулей обходит символы строки с лева на право, до тех пор пока не встретится символ отличный от нуля. Как только встречается символ не равный нулю, берется часть строки начиная с этого символа и до конца строки. Если входящая строка «000016», функция вернет «16».
Для того чтобы добавить сообщение, необходимо Войти или Зарегистрироваться
Допустим необходимо, чтобы из числа 3 получалось 00003, из 356 получалось 00356 и так далее.
Для этого можно использовать функцию Формат().
Здесь в форматной строке указано три параметра:
- ЧЦ=5 — всего будет отображаться пять знаков (целой и дробной части)
- ЧВН= — будут выводиться лидирующие нули
- ЧГ=0 — группировка разрядов использоваться не будет
Для составления форматной строки можно использовать конструктор форматной строки.
Подробнее о функции Формат() можно почитать в синтакс-помощнике: