Имя: Пароль:
1C
1C 7.7
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 часов готов помочь, личка открыта.
Закон Брукера: Даже маленькая практика стоит большой теории.