Перейти к содержимому

Фотография

Проверка корректности РНН


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 18

#1
PrOl

PrOl

    Управляющий

  • Модератор
  • 8 568 сообщений
Заделитесь алгоритмом (желательно на Delphi).
  • 0

#2
FIREFOX

FIREFOX
  • Свой человек
  • 958 сообщений

Заделитесь алгоритмом (желательно на Delphi).


Есть, но только на встроенном языке 1С.. ;)
  • 0

#3
PrOl

PrOl

    Управляющий

  • Модератор
  • 8 568 сообщений
Не проблема. Высылай.
  • 0

#4
FIREFOX

FIREFOX
  • Свой человек
  • 958 сообщений
Зчем же высылать.. Пусть другие тоже пользуют..

// ** глВалидностьРНН: Проверка РНН на корректность __________________________
//
// Параметры: Значение - значение проверяемого РНН
// Вызывается:
// Описание:
// Проверяется на корректность значение РНН
// Возвращаемое значение: 1 - значение корректно, 0 - иначе.
//
Функция глВалидностьРНН(Значение) Экспорт
Статус = 0;
//Проверка на длину РНН
Если СтрДлина(СокрЛП(Значение))<12 Тогда
Предупреждение("Количество знаков в РНН меньше 12!");
// проверка на одиниковость всех цифр
ИначеЕсли СтрЧислоВхождений(Значение, Лев(Значение,1))=12 Тогда
Предупреждение("Цифра " + Лев(Значение,1) + " повторяется 12 раз!");
// проверяем РНН на корректность
Иначе
// копируем первые 11 символов
ПодстрокаРНН11 = Лев(Значение,11);
// контрольная сумма РНН
КонтрольнаяСумма = Прав(Значение,1);
Для СчетчикЦикла1 = 1 По 10 Цикл
СуммаПроизведений = 0;
Вес = СчетчикЦикла1 - 1;
// Накапливаем сумму произведений
Для СчетчикЦикла2 = 1 По 11 Цикл
Вес = Вес + 1;
Если Вес = 11 Тогда
Вес = 1; //сбросили вес на единицу
КонецЕсли;
СуммаПроизведений = СуммаПроизведений + Вес * Число(Сред(ПодстрокаРНН11,СчетчикЦикла2,1));
КонецЦикла; //Для СчетчикЦикла2 = 1 По 11 Цикл

//Рассчитываем коэфиициент для проверка РНН
Коэффициент = СуммаПроизведений-Цел((СуммаПроизведений)/11)*11;

Если Коэффициент < 10 Тогда
Если Коэффициент = Число(КонтрольнаяСумма) Тогда // Проверка равенства полученного коэффициента Контрольной сумме
Статус = 1;
Прервать;
КонецЕсли;
КонецЕсли;//Если Коэффициент < 10 Тогда

КонецЦикла; //Для СчетчикЦикла1 = 1 По 10 Цикл
КонецЕсли;

Если Статус = 0 тогда
Предупреждение("Введенный РНН не корректен!");
Иначе
Предупреждение("Введенный РНН корректен!");
КонецЕсли;

Возврат Статус;
КонецФункции // глВалидностьРНН
  • 0

#5
PrOl

PrOl

    Управляющий

  • Модератор
  • 8 568 сообщений
Нда... ну и язык ;).
Получается:
function Check_RNN(rnn: string):boolean;
var
  i, j, k, s, t: integer;
begin
  for i:=1 to 10 do
    begin
      s:=0;
      t:=i-1;
      for j:=1 to 11 do
        begin
          inc(t);
          if t=11 then
            t:=1;
          s:=s+t*StrToInt(rnn[j]);
        end;
      k:=s mod 11;
      if k<10 then
        Break;
    end;
  Result:=(k=StrToInt(rnn[12]));
end;
Пасиб, вроде работает.
  • 0

#6
FIREFOX

FIREFOX
  • Свой человек
  • 958 сообщений
Да и не за что.. :rolleyes: У меня к тебе тоже вопрос, коли ты в Дельфях пишеш.. Есть проблемка, описание ее в двух словах можно посмотреть в теме Написание и разбор внешних компонени для 1С.. Если есть опыт или дельный совет напиши что нить..
Заранее спасибо.. ;)
  • 0

#7
PrOl

PrOl

    Управляющий

  • Модератор
  • 8 568 сообщений
Это ж надо еще и 1С ставить и там смотреть, а я в ней, мягко говоря, не специалист. Да и времени уходит на такие вещи очень много, а мне его и так не хватает. Сорри.

Сообщение отредактировал PrOl: 15.03.2004, 09:11:55

  • 0

#8
}I{EHbKA

}I{EHbKA
  • В доску свой
  • 2 658 сообщений
Prol
там необходимо только вскрыть длл-ку и поделица ее внутренностями.
  • 0

#9
ZeD

ZeD
  • Свой человек
  • 572 сообщений
В свете введения нового налогового кодекса и требования в нем предоставлять в НК счета фактуры выставленные остро встает вопрос корректности РНН клиентов, хотелось бы узнать какие методы проверки вообще существуют?
Вышеуказанную функцию, я переделал для проверки РНН в Excel.

Function CheckRNN(RNN As String) As String
Dim SubStrRNN11, ControlSum As String
Dim i, j, Status As Integer
Dim SumProizv, Ves, Koef As Long
RNN = CStr(Trim(RNN))
Status = 0
'Проверка на длину РНН

If Len(Trim(RNN)) = 12 Then
' копируем первые 11 символов
SubStrRNN11 = Left(RNN, 11)
' контрольная сумма РНН
ControlSum = Right(RNN, 1)
For i = 1 To 10
	SumProizv = 0
	Ves = i - 1
	' Накапливаем сумму произведений
	For j = 1 To 11
		Ves = Ves + 1
			If Ves = 11 Then
			Ves = 1 'сбросили Ves на единицу
			End If
		SumProizv = SumProizv + Ves * CLng(Mid(SubStrRNN11, j, 1))
	Next j 'for j = 1 to 11

'Рассчитываем коэфиициент for проверка РНН
Koef = SumProizv - Fix((SumProizv) / 11) * 11

If Koef < 10 Then
If Koef = CLng(ControlSum) Then ' Проверка равенства полученного коэффициента Контрольной сумме
Status = 1
Exit For
End If
End If 'if Koef < 10 then

Next i 'for i = 1 to 10
End If

	If Status = 0 Then
	CheckRNN = "!ERROR"
	Else
	CheckRNN = "!OK"
	End If

End Function

Изначально не совсем корректно заменил одно значение, но сейчас все Ок.

Сообщение отредактировал ZeD: 13.01.2009, 11:37:15

  • 0

#10
T. Anre

T. Anre

    Data Miner

  • В доску свой
  • 2 327 сообщений
ПРОВЕРКА РНН НА КОРРЕКТНОСТЬ
java script: проверка РНН
  • 0

#11
lupus007

lupus007

    он же Адвокат Дьявола

  • Забанен
  • 794 сообщений
Нда, отеты в тему чрез 4 года :)

Господа, а почему не указывается в алгоритме проверка 5-го знака РНН ?
То есть завсимость 5-го знака (0 или не 0) от категории лица: юридическое или физическое ?

#12
Lisa Alisa

Lisa Alisa
  • Завсегдатай
  • 102 сообщений
как все сложно...:-)
  • 0

#13
Вини

Вини
  • В доску свой
  • 2 542 сообщений
А кто заделица алгоритмом СИК-а? Ток не DLL-кой, а именно алгоритмом
  • 0

#14
drptz

drptz
  • Свой человек
  • 766 сообщений

А кто заделица алгоритмом СИК-а? Ток не DLL-кой, а именно алгоритмом


http://vse.kz/index....&...p=2753873
  • 0

#15
TemirMax

TemirMax
  • Частый гость
  • 73 сообщений
Вопрос: может ли РНН дублироваться? к примеру К.Х и физ лицо?
  • 0

#16
рюмка

рюмка
  • В доску свой
  • 3 995 сообщений
скажите, кто нибудь под дебагером смотрел, что будет Result:=(k=StrToInt(rnn[12])); в резалте?)
  • 0

#17
vladimir55

vladimir55
  • Постоялец
  • 401 сообщений
Если k = StrToInt(rnn[12]), result будет равен 1 ($00000001), иначе будет равен 0 ($00000000). В терминах паскаля result будет равен булевому значению true в случае равенства и false в случае неравенства.
По умолчанию, если правильно помню, под значение типа Boolean выделяется память в двойное слово (4 байта) - для 32 битных систем. Для 64 битных возможно 64 бита и выделяется - 4 слова или 8 байт, тогда в дебагере можно увидеть значения $0000000000000001 и $0000000000000000.
  • 1

#18
Зул

Зул
  • Свой человек
  • 620 сообщений

Если k = StrToInt(rnn[12]), result будет равен 1 ($00000001), иначе будет равен 0 ($00000000). В терминах паскаля result будет равен булевому значению true в случае равенства и false в случае неравенства.
По умолчанию, если правильно помню, под значение типа Boolean выделяется память в двойное слово (4 байта) - для 32 битных систем. Для 64 битных возможно 64 бита и выделяется - 4 слова или 8 байт, тогда в дебагере можно увидеть значения $0000000000000001 и $0000000000000000.

true гарантированно разве равно единице? AFAIK это любое не нулевое значение.

Кстати, привет Рюмка. Давно тебя не видел, чмоки, обнимашки и все такое.
  • 0

#19
parrker

parrker
  • Гость
  • 5 сообщений

Нда... ну и язык :-/.
Получается:

function Check_RNN(rnn: string):boolean;
var
 i, j, k, s, t: integer;
begin
 for i:=1 to 10 do
   begin
     s:=0;
     t:=i-1;
     for j:=1 to 11 do
       begin
         inc(t);
         if t=11 then
           t:=1;
         s:=s+t*StrToInt(rnn[j]);
       end;
     k:=s mod 11;
     if k<10 then
       Break;
   end;
 Result:=(k=StrToInt(rnn[12]));
end;
Пасиб, вроде работает.

Рахмет просто огромный за то, что перевели на понятный язык.
  • 0


Количество пользователей, читающих эту тему: 1

пользователей: 0, неизвестных прохожих: 1, скрытых пользователей: 0

Размещение рекламы на сайте     Предложения о сотрудничестве     Служба поддержки пользователей

© 2011-2022 vse.kz. При любом использовании материалов Форума ссылка на vse.kz обязательна.