Возникла проблема, что в базу попадают некорректные номера ГТД. Частично выявились грехи поставщиков, частично операторы вносили с ошибками. Пришлось подробно разобраться, т.к. на просторах интернета ничего подходящего не нашел. И родился данный код, для автоматической проверки. Во вложении обработка для анализа корректности данных в программе.
&НаСервере
Функция ВыполнитьПроверкуГТДНаСервере(СтрокаГТД)
Ответ = новый Структура("Успех,Текст");
ОбрабатываемаяСтрокаГТД1 = "";
если ТипЗнч(СтрокаГТД) = Тип("СправочникСсылка.НомераГТД") тогда
ОбрабатываемаяСтрокаГТД1 = СтрокаГТД.Код;
иначеесли ТипЗнч(СтрокаГТД) = Тип("СправочникОбъект.НомераГТД") тогда
ОбрабатываемаяСтрокаГТД1 = СтрокаГТД.Код;
иначеесли ТипЗнч(СтрокаГТД) = Тип("Строка") тогда
ОбрабатываемаяСтрокаГТД1 = СтрокаГТД;
конецесли;
//////первый блок (код таможенного подразделения) (4) ТипЗнч
Проверка10 = Найти(ОбрабатываемаяСтрокаГТД1,"/");
Если Проверка10 = 0 тогда /// не нашли слэш
Ответ.Успех = Ложь;
Ответ.Текст = "10: Нет слэшей в ГТД";
возврат Ответ;
КонецЕсли;
ПорядковыйНомерСлэша1 = Проверка10;
КодТаможенногоПодразделения = Лев(ОбрабатываемаяСтрокаГТД1,ПорядковыйНомерСлэша1-1);
// номера таможенных подразделений есть в интернете, например: http://ved.customs.ru/index2.php?option=com_listnsi&view=sinnsi&url_id=V_KTAM
Проверка11 = 0;
попытка
Проверка11 = Число(КодТаможенногоПодразделения);
исключение
/// не число
Ответ.Успех = Ложь;
Ответ.Текст = "11: Код таможенного подразделения не числовой";
возврат Ответ;
конецпопытки;
Проверка12 = ?(Проверка11 >= 10000000 ИЛИ Проверка11 <= 100000 ,ложь,истина);
// если растаможка в РФ то 8 знаков, если в странах таможенного союза, то 5 знаков
если Проверка12 тогда
Ответ.Успех = Ложь;
Ответ.Текст = "12: Код таможенного подразделения не попадает в диапазон допустимых значений";
возврат Ответ;
конецесли;
Проверка13 = СтрДлина(СокрЛП(КодТаможенногоПодразделения));
если не (Проверка13 = 8 или Проверка13 = 5) тогда
// не соответствует длина
Ответ.Успех = Ложь;
Ответ.Текст = "13: Длина кода таможенного подразделения отличается от 8 и 5";
возврат Ответ;
конецесли;
//////второй блок (дата выдачи) (5)
ОбрабатываемаяСтрокаГТД2 = Прав(ОбрабатываемаяСтрокаГТД1,СтрДлина(ОбрабатываемаяСтрокаГТД1) - ПорядковыйНомерСлэша1);
Проверка20 = Найти(ОбрабатываемаяСтрокаГТД2,"/");
Если Проверка20 = 0 тогда /// не нашли слэш
Ответ.Успех = Ложь;
Ответ.Текст = "20: Нет второго слэша в ГТД";
возврат Ответ;
КонецЕсли;
ПорядковыйНомерСлэша2 = Проверка20;
ДатаПринятияГТД = СокрЛП(Лев(ОбрабатываемаяСтрокаГТД2,ПорядковыйНомерСлэша2-1));
Проверка21 = 0;
попытка
Проверка21 = Число(ДатаПринятияГТД);
исключение
/// не число
Ответ.Успех = Ложь;
Ответ.Текст = "21: Дата содежит нецифровые символы";
возврат Ответ;
конецпопытки;
Проверка22 = СтрДлина(СокрЛП(ДатаПринятияГТД));
если Проверка22 <> 6 тогда
// не соответствует длина
Ответ.Успех = Ложь;
Ответ.Текст = "22: Неверный формат даты";
возврат Ответ;
конецесли;
ДатаДД = Лев(ДатаПринятияГТД,2);
ДатаММ = Сред(ДатаПринятияГТД,3,2);
ДатаГГ = Прав(ДатаПринятияГТД,2);
Попытка
Проверка23 = Число(ДатаДД);
если Проверка23 = 0 или Проверка23 > 31 тогда
Ответ.Успех = Ложь;
Ответ.Текст = "23: Неверный формат дня даты ГТД";
возврат Ответ;
конецесли;
Проверка24 = Число(ДатаММ);
если Проверка24 = 0 или Проверка24 > 12 тогда
Ответ.Успех = Ложь;
Ответ.Текст = "24: Неверный формат месяца даты ГТД";
возврат Ответ;
конецесли;
исключение
Ответ.Успех = Ложь;
Ответ.Текст = "25: Ошибка распознования даты ГТД";
возврат Ответ;
конецпопытки;
//////третий блок (порядковый номер ГТД) (6)
ОбрабатываемаяСтрокаГТД3 = Прав(ОбрабатываемаяСтрокаГТД2,СтрДлина(ОбрабатываемаяСтрокаГТД2)-ПорядковыйНомерСлэша2);
// если есть слеш, то выдергиваем номер гтд и отдельно номер товара
ОбрабатываемаяСтрокаГТД4 = ""; //номер товара
ПорядковыйНомерСлэша3 = 0;
НомерГТД = "";
Проверка30 = Найти(ОбрабатываемаяСтрокаГТД3,"/");
Если Проверка30 <> 0 тогда /// нашли слэш, значит будет еще номер товара
ПорядковыйНомерСлэша3 = Проверка30;
ОбрабатываемаяСтрокаГТД4 = СокрЛП(Прав(ОбрабатываемаяСтрокаГТД3,СтрДлина(ОбрабатываемаяСтрокаГТД3)-ПорядковыйНомерСлэша3));
НомерГТД = Лев(ОбрабатываемаяСтрокаГТД3,ПорядковыйНомерСлэша3-1);
Иначе
НомерГТД = СокрЛП(ОбрабатываемаяСтрокаГТД3)
КонецЕсли;
Проверка31 = СтрДлина(НомерГТД);
Если Проверка31 <> 7 тогда
Ответ.Успех = Ложь;
Ответ.Текст = "31: Неверная длина номера ГТД (не 7)";
возврат Ответ;
конецесли;
// проверяем наличие "п" (предварительная), а после нее цифры
Проверка32 = Лев(НомерГТД,1);
ПрипискаП = "";
если Проверка32 = "П" или Проверка32 = "п" тогда // признак того, что ГТД предварительная
НомерГТД = Прав(НомерГТД, СтрДлина(НомерГТД)-1);
ПрипискаП = ". Наличие предварительного номера учтено";
конецесли;
Проверка33 = 0;
попытка
Проверка33 = Число(НомерГТД);
исключение
/// не число
Ответ.Успех = Ложь;
Ответ.Текст = "33: Номер ГТД содержит нецифровые символы" + ПрипискаП;
возврат Ответ;
конецпопытки;
// если номер товара не пустой, тогда проверяем, что он числовой
если ОбрабатываемаяСтрокаГТД4 <> "" тогда
Проверка34 = 0;
попытка
Проверка34 = Число(ОбрабатываемаяСтрокаГТД4);
исключение
/// не число
Ответ.Успех = Ложь;
Ответ.Текст = "34: Номер товара содержит нецифровые символы";
возврат Ответ;
конецпопытки;
Проверка35 = Проверка34;
Если Проверка35 = 0 или Проверка34 > 1000 тогда
// по формату не более 1000
Ответ.Успех = Ложь;
Ответ.Текст = "35: Номер товара превышает допустимое значение(1000)";
возврат Ответ;
конецесли;
конецесли;
Ответ.Успех = Истина;
Ответ.Текст = "99: Проверка ГТД пройдена успешно";
возврат Ответ;
КонецФункции
Вложенная обработка позволяет:
- Проверить одну ГТД
- Проверить все ГТД в соответствующем справочнике (есть отсечка по глубине проверки). По результату проверки ГТД выводится список встреченных ошибок и их количество.
- Почистить справочник Страны от дублей
- Почистить справочник ГТД от дублей и некорректных номеров.