gifts2017

Восстанавливаем штрих-код (7.7)

Опубликовал Александр Рытов (Арчибальд) в раздел Программирование - Универсальные функции

Если сканер плохо читает...

Не секрет, что сканеры «в разрыв клавиатуры» иной раз «проглатывают» первый символ при чтении штрих-кода. Простая функция поможет штрих-код восстановить (см. рисунок):

	 Функция ВосстановитьEAN13(пКод)
    Если СтрДлина(пКод) = 13 Тогда
        Возврат пКод;
    ИначеЕсли СтрДлина(пКод) < 12 Тогда
        Возврат "";
    Иначе
        Для й = 1 по 10 Цикл
            ШтрКод = Строка(й - 1) + Лев(пКод,11); //Исправлено
            Четн = 0;
            Нечетн = 0;
            Для Индекс = 1 По 6 Цикл
                Четн = Четн + Сред(ШтрКод, 2 * Индекс, 1);
                Нечетн = Нечетн + Сред(ШтрКод, 2 * Индекс - 1, 1);
            КонецЦикла;
            Четн = Четн * 3;
            КонтЦифра = 10 - (Четн + Нечетн) % 10;
            КонтКод = ?(КонтЦифра = 10, "0", Строка(КонтЦифра));
            Если Прав(пКод,1) = КонтКод Тогда
                Возврат ШтрКод + КонтКод;
            КонецЕсли;
        КонецЦикла;
        Возврат "";
    КонецЕсли;
КонецФункции //ВосстановитьEAN13

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Василий Казьмин (awk) 25.01.10 11:08
За алгоритм - плюс, за форматирование кода - минус. Пока не переписал в виде:
Функция ВосстановитьEAN13(пКод)
	ДлинаКода = СтрДлина(пКод);
	Если ДлинаКода = 13 Тогда
		Возврат пКод;
	ИначеЕсли ДлинаКода < 12 Тогда
		Возврат "";
	Иначе
		ДесятьПервых = Лев(пКод,10);
		Для й = 0 по 9 Цикл
			ШтрКод = Строка(й) + ДесятьПервых;
			СуммаЧетныхЧиселВКоде = 0;
			СуммаНечетныхЧиселВКоде = 0;
			Для Индекс = 1 По 6 Цикл
				СуммаЧетныхЧиселВКоде = СуммаЧетныхЧиселВКоде + Сред(ШтрКод, 2 * Индекс, 1);
				СуммаНечетныхЧиселВКоде = СуммаНечетныхЧиселВКоде + Сред(ШтрКод, 2 * Индекс - 1, 1);
			КонецЦикла;
			КонтрольнаяСумма = 10 - (СуммаЧетныхЧиселВКоде * 3 + СуммаНечетныхЧиселВКоде) % 10;
			КонтрольнаяСумма = ?(КонтрольнаяСумма = 10, "0", Строка(КонтрольнаяСумма));
			Если Прав(пКод,1) = КонтрольнаяСумма Тогда
				Возврат ШтрКод + КонтрольнаяСумма;
			КонецЕсли;
		КонецЦикла;
	КонецЕсли;
	Возврат "";
КонецФункции //ВосстановитьEAN13
...Показать Скрыть

алгоритм не понял...
Арчибальд; Istur; +2 Ответить 1
2. Василий Казьмин (awk) 25.01.10 11:35
(0) А вот так будет ещё и быстрее работать, за счет уменьшения количества операций:
Функция ВосстановитьEAN13(пКод)
   ДлинаКода = СтрДлина(пКод);
   Если ДлинаКода = 13 Тогда
      Возврат пКод;
   ИначеЕсли ДлинаКода < 12 Тогда
      Возврат "";
   Иначе
      ДесятьПервых = Лев(пКод,10);
      СуммаЧетныхЧиселВКоде = 0;
      СуммаНечетныхЧиселВКоде = 0;
      Для Индекс = 1 По 6 Цикл
      	СуммаЧетныхЧиселВКоде = СуммаЧетныхЧиселВКоде + Сред(ШтрКод, 2 * Индекс - 1, 1);
      	СуммаНечетныхЧиселВКоде = СуммаНечетныхЧиселВКоде + Сред(ШтрКод, 2 * Индекс, 1);
      КонецЦикла;
      // Подбор
      Для й = 0 по 9 Цикл
         КонтрольнаяСумма = 10 - (СуммаЧетныхЧиселВКоде * 3 + СуммаНечетныхЧиселВКоде + й) % 10;
         КонтрольнаяСумма = ?(КонтрольнаяСумма = 10, "0", Строка(КонтрольнаяСумма));
         Если Прав(пКод,1) = КонтрольнаяСумма Тогда
            Возврат Строка(й) + ДесятьПервых + КонтрольнаяСумма;
         КонецЕсли;
      КонецЦикла;
   КонецЕсли;
   Возврат "";
КонецФункции //ВосстановитьEAN13
...Показать Скрыть
Арчибальд; +1 Ответить
3. Александр Рытов (Арчибальд) 25.01.10 11:50
(1) Вот этот кусочек
   Четн = 0;
   Нечетн = 0;
   Для Индекс = 1 По 6 Цикл
    Четн = Четн + Сред(ШтрКод, 2 * Индекс, 1);
    Нечетн = Нечетн + Сред(ШтрКод, 2 * Индекс - 1, 1);
   КонецЦикла;
   Четн = Четн * 3;
   КонтЦифра = 10 - (Четн + Нечетн) % 10;
...Показать Скрыть

Взят прямо из стандартной конфы копипастом :|
4. Василий Казьмин (awk) 25.01.10 12:00
(3) Не боги горшки обжигают... Странно, но раньше в этой поговорке я видел другой смысл... :) Я просто был удивлен, что такой специалист, пишет такой код. Вы меня успокоили. А по поводу стандартных конфигураций... У меня иногда волосы встают дыбом - когда вижу их код... А особенно когда вижу комменты... Функция была прокомментирована в стандартной бухгалтерии 8. Списание партий по методу ФИФО. Как она списывала, я так и не понял (ни ФИФО, ни ЛИФО, ни по среднему там и рядом не лежало, а то бы не полез)... Просто переписал... Код функции сократился вдвое...
5. Александр Рытов (Арчибальд) 25.01.10 12:08
(4) Но ДесятьПервых - это таки Одинадцать :o
А боги не обжигают горшки потому, что боятся лажануться :D
6. Василий Казьмин (awk) 25.01.10 12:33
(5) Ух.. да... Вот и польза читабельности кода...
7. Василий Казьмин (awk) 25.01.10 12:53
(0) По моему статья с комментариями - получилась наглядным пособием "Для чего читабельность нужна...". Хоть оформляй как отдельную тему... А то новички (по себе знаю) форматирование кода отрицают. Типа мол я же читаю свой код... И чем менее понятно напишут, тем круче себя считают...
Поручик; artbear; +2 Ответить
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа