|
v7: ИНН/КПП Как задать проверку только первых 10 или 12 цифр в поле? | ☑ | ||
---|---|---|---|---|
0
GoshaGT
29.04.15
✎
15:51
|
В 1С 77 есть проверка правильности поля ИНН.
Сейчас стоит задача в этом поле указывать ИНН/КПП. Хочу это реализовать расширением поля до 20 знаков, но при этом хочу сохранить алгоритм проверки ИНН. Как это можно сделать? Выдержка из 1С Функция ТестИНН() Перем Поз; // счетчик цикла Если ПустаяСтрока(ИНН) = 1 Тогда //Предупреждение("Не указан номер ИНН."); Возврат 0; Иначе Если ВидКонтрагента = Перечисление.ВидыКонтрагентов.Организация Тогда Если (СтрДлина(СокрЛП(ИНН)) = 10) ИЛИ (СтрДлина(СокрЛП(ИНН)) > 11) Тогда Иначе //Предупреждение("Укажите КПП через /."); //////поменял 29 апреля Возврат 0; КонецЕсли; ИначеЕсли ВидКонтрагента = Перечисление.ВидыКонтрагентов.ЧастноеЛицо Тогда Если (СтрДлина(СокрЛП(ИНН)) <> 12) Тогда Возврат 0; Иначе Возврат 1; КонецЕсли; КонецЕсли; КонецЕсли; Если ВидКонтрагента = Перечисление.ВидыКонтрагентов.Организация Тогда Если (СтрДлина(СокрЛП(ИНН)) = 10) Тогда Вес="240359468"; // 10 ДлинаИНН = 9; РазрядКонтроля = 10; ИначеЕсли (СтрДлина(СокрЛП(ИНН)) = 12) Тогда Вес="7240359468"; // 12 Вес2="37240359468"; // 12 ДлинаИНН = 10; // РазрядКонтроля = 11; КонецЕсли; КонецЕсли; КонтрСумма=0; КонтрСумма2=0; Для Поз=1 По ДлинаИНН Цикл Множ= Число(Сред(Вес, Поз, 1)); Если Множ = 0 Тогда Множ = 10; КонецЕсли; Произв=Число(Сред(ИНН, Поз, 1))*Множ; КонтрСумма=КонтрСумма+Произв; Если (СтрДлина(СокрЛП(ИНН)) = 12) Тогда Множ2= Число(Сред(Вес2, Поз, 1)); Если Множ2 = 0 Тогда Множ2 = 10; КонецЕсли; Произв=Число(Сред(ИНН, Поз, 1))*Множ2; КонтрСумма2=КонтрСумма2+Произв; КонецЕсли; КонецЦикла; Проверка=КонтрСумма-Цел(КонтрСумма/11)*11; // модуль 11 Проверка=Проверка-Цел(Проверка/10)*10; // модуль 10 Если ВидКонтрагента = Перечисление.ВидыКонтрагентов.Организация Тогда Если (СтрДлина(СокрЛП(ИНН)) = 10) Тогда Если Проверка=Число(Сред(ИНН, РазрядКонтроля, 1)) Тогда Возврат 1; КонецЕсли; ИначеЕсли (СтрДлина(СокрЛП(ИНН)) = 12) Тогда Множ2= Число(Сред(Вес2, 11, 1)); // вычисл 11 цифру Произв=Число(Сред(ИНН, 11, 1))*Множ2; КонтрСумма2=КонтрСумма2+Произв; Проверка2=КонтрСумма2-Цел(КонтрСумма2/11)*11; // модуль 11 Проверка2=Проверка2-Цел(Проверка2/10)*10; // модуль 10 Если Проверка=Число(Сред(ИНН, РазрядКонтроля, 1)) Тогда Если Проверка2=Число(Сред(ИНН, РазрядКонтроля+1, 1)) Тогда Возврат 1; КонецЕсли; КонецЕсли; КонецЕсли; ИначеЕсли ВидКонтрагента = Перечисление.ВидыКонтрагентов.ЧастноеЛицо Тогда КонецЕсли; Возврат 0; КонецФункции |
|||
1
Builder
29.04.15
✎
15:52
|
1. Найти разделитель - "/"
2. получить строку до разделителя 3. сделать проверку. |
|||
2
GoshaGT
29.04.15
✎
16:01
|
А как это написать в тексте кода?
|
|||
3
Новый участник
29.04.15
✎
16:16
|
(2) Положи перед собой 300 рублей.
Скажи "Я - жадный и грамотный специалист. Я сделаю это и никому не отдам деньги за эту задачу!" Через час, не решив, приходи сюда с деньгами :) |
|||
4
aka AMIGO
29.04.15
✎
16:20
|
(2) так и пиши, как посоветовал (1)
можно чуток подробней, как вариант: 1. перед вызовом функции ТестИНН() находишь разделитель "/" 2. Если он есть - запоминаешь КПП, вырезаешь ИНН 3. проверяешь ИНН 4. если в 1. найден разделитель, конкатенируешь ИНН с запомненным ранее КПП |
|||
5
aka AMIGO
29.04.15
✎
16:21
|
(3) если положить 500, то сэкономится больше :)
|
|||
6
Fedor-1971
29.04.15
✎
16:49
|
(5) за 1000 ещё лучше работаться будет, только остаётся вопрос: В которой части пользователь указал ИНН, а в какой КПП, в смылсе до "/" или после?
Всех под линейку не поровняешь и всегда найдётся мастер-ломастер который попутает коды и придёт с претензией (хорошо если к программеру, а если к начальству). Лучше добавь поле в справочник "КПП" и отдай в откуп пользователям, пусть там хоть буквы пишут. |
|||
7
aka AMIGO
29.04.15
✎
16:53
|
(6) место ИНН или КПП - по длине после расщепления.
КПП = 9 знаков ИНН = 10 или 12 Если и здесь кто-то умудрился ошибиться - это не прогеру |
|||
8
Fedor-1971
29.04.15
✎
17:01
|
(7) Это понятно, но визгливых бухов "оно делает не то что нужно МНЕ!!" ещё пруд пруди и задуматься над вводимыми данными даже мысли не возникает.
Кроме того ИНН используется в печатных формах, придётся их все перестроить, что не есть гуд. В этом плане отдельное поле козырней, хотя у ТС могут быть свои причины совмещения двух кодов в одном поле. |
|||
9
NikVars
29.04.15
✎
17:01
|
300, 500, 1000, ... Озвучьте окончательную сумму! Пжлста!
|
|||
10
NikVars
29.04.15
✎
17:02
|
(0) Ты про какую 1С 7.7 речь ведешь, Автор?!
|
|||
11
Fedor-1971
29.04.15
✎
17:02
|
(9) 10 минут дела в варианте с новым полем, а окончательная будет зависеть от ТС.
|
|||
12
NikVars
29.04.15
✎
17:03
|
(0) И что такое проверка "правильности" ИНН?
|
|||
13
Fedor-1971
29.04.15
✎
17:05
|
(12) последняя цифра ИНН - контрольная, т.е. если где-то ошибся или тебе прислали ИНН "от балды" контрольная цифра не сойдётся.
|
|||
14
IVT_2009
29.04.15
✎
17:10
|
Вот так:
Функция проверкаИНН(ИНН) Экспорт Перем ДлинаКода, ДлинаПроверки; //2 4 10 //3 5 9 //4 6 8 //%11 если стрДлина(инн) <> 10 тогда возврат "ошибка"; конецЕсли; сумм = число(сред(инн,1,1))*2+число(сред(инн,2,1))*4+число(сред(инн,3,1))*10+ число(сред(инн,4,1))*3+число(сред(инн,5,1))*5+число(сред(инн,6,1))*9+ число(сред(инн,7,1))*4+число(сред(инн,8,1))*6+число(сред(инн,9,1))*8; возврат ?(?(сумм%11 = 10,0,сумм%11) = число(сред(инн,10,1)),"ок","ошибка") КонецФункции |
|||
15
NikVars
29.04.15
✎
17:26
|
(13) Такая проверка щас не катит. Юзай сервис проверки контрагентов от налоговой. Примеры смотри в типовых конфигурациях в декларации по НДС.
|
|||
16
NikVars
29.04.15
✎
17:27
|
http://catalog.mista.ru/public/57996/
Генератор ИНН и КПП |
|||
17
GoshaGT
30.04.15
✎
10:02
|
(10) У нас ТиС дописанная переписанная.
|
|||
18
GoshaGT
30.04.15
✎
10:06
|
Большое спасибо! Направление дали, буду разбираться.
Если что....кто там за 300 рублей пообещался?)) |
|||
19
Dmitry77
30.04.15
✎
10:12
|
Посмотреть как это сделано в типовой уже предлагали?
|
|||
20
DGorgoN
30.04.15
✎
10:13
|
(19) У него есть как сделано в типовой. Я лично разделил ИНН и КПП в своё время и вообще перестал парится. Стандартное поле заполняю просто после изменения оных.
|
|||
21
DGorgoN
30.04.15
✎
10:14
|
+(20) Сделал против тупых куриц которые вместо слеша ставят дргие символы. А те два поля тупо только числовые.
|
|||
22
Новый участник
30.04.15
✎
10:16
|
По уму разные данные надо хранить в разных полях. Но можно сделать и в одном, дописав экспортную процедуру разделения.
После 17 часов готов помочь, личка открыта. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |