При автоматизации пивного магазина возникла необходимость печати этикеток с определенным заказчиком объемом пива, например 1,5 л, 2 литра и т.д.. Этикетка должна быть со штрихкодом, чтобы кассир мог быстро внести товар в чек сканером штрихкода.
Оказалось, что такого функционала в Далионе нет. Есть возможность набрать штрихкод вручную, но контрольный символ нужно генерировать на сторонних сайтах, что не вполне удобно, пользователи путаются. Решил проблему написанием обработки. Для тех кто в теме прилагаю текст модулей. Спасибо разработчикам Далиона, за алгоритм расчета контрольного символа. Все остальные могут скачать готовый вариант для EAN 13.
Процедура ГенерироватьШКНажатие(Элемент)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Код КАК Артикул
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.Ссылка = &Номенклатура";
Запрос.УстановитьПараметр("Номенклатура", Номенклатура);
ТЗ = Запрос.Выполнить().Выгрузить();
Артикул = ТЗ[0].Артикул;
Артикул = ДобитьСтрокуНулями(Артикул,5);
Количество = ВесОбъемИзЧисла(ОбъемВес);
Количество = ДобитьСтрокуНулями(Количество,5);
Префикс = Справочники.ФорматыШтрихКодов.ВключаетКоличество.ПрефиксШК;
ШК = Префикс+Артикул+Количество;
ШК = Префикс+Артикул+Количество+КонтрольныйСимволEAN1(ШК,13);
КонецПроцедуры
Процедура ДобавитьШККНоменклатуреНажатие(Элемент)
ТекЗапись = РегистрыСведений.Штрихкоды.СоздатьМенеджерЗаписи();
ЕдиницаИзмеренияДляШтрихКода = Номенклатура.БазоваяЕдиницаИзмерения;
ТекЗапись.Номенклатура = Номенклатура;
ТекЗапись.НеИспользуется = Ложь;
ТекЗапись.ТипШтрихКода = ПланыВидовХарактеристик.ТипыШтрихкодов.EAN13;
ТекЗапись.ЕдиницаИзмерения = ЕдиницаИзмеренияДляШтрихКода;
ТекЗапись.ШтрихКод = ШК;
ТекЗапись.Записать(Истина);
КонецПроцедуры
// Добить строку до нужной длины нулями
Функция ДобитьСтрокуНулями(Строка,ДлинаСтр)
Инд = ДлинаСтр - СтрДлина(Строка);
Пока Инд <> 0 Цикл
Строка = "0"+Строка;
Инд = Инд - 1;
КонецЦикла;
Возврат Строка
КонецФункции
// Функция вычисляет контрольный символ кода EAN
//
// Параметры:
// ШтрихКод - штрих-код (без контрольной цифры)
// Тип - тип штрих-кода: 13 - EAN13, 8 - EAN8
//
// Возвращаемое значение:
// Контрольный символ штрих-кода
//
Функция КонтрольныйСимволEAN1(ШтрихКод, Тип)
Четн = 0;
Нечетн = 0;
КоличествоИтераций = ?(Тип = 13, 6, 4);
Для Индекс = 1 По КоличествоИтераций Цикл
Если (Тип = 8) и (Индекс = КоличествоИтераций) Тогда
Иначе
Четн = Четн + Сред(ШтрихКод, 2 * Индекс, 1);
КонецЕсли;
Нечетн = Нечетн + Сред(ШтрихКод, 2 * Индекс - 1, 1);
КонецЦикла;
Если Тип = 13 Тогда
Четн = Четн * 3;
Иначе
Нечетн = Нечетн * 3;
КонецЕсли;
КонтЦифра = 10 - (Четн + Нечетн) % 10;
Возврат ?(КонтЦифра = 10, "0", Строка(КонтЦифра));
КонецФункции // КонтрольныйСимволEAN()
Функция ВесОбъемИзЧисла(Число)
Инд = СтрНайти(Число,",");
Если Инд > 0 Тогда
Стр = Сред(Число,Инд+1);
Если СтрДлина(Стр) = 2 Тогда //0,53
Стр = СтрЗаменить(Число,",","");
Стр = Стр + "0";
ИначеЕсли СтрДлина(Стр) = 1 Тогда //0,5
Стр = СтрЗаменить(Число,",","");
Стр = Стр + "00";
ИначеЕсли СтрДлина(Стр) = 3 Тогда //0,555
Стр = СтрЗаменить(Число,",","");
КонецЕсли;
Иначе // запятая не найдено, значит у нас целое число 1,000
СтрЧисло = Строка(Число);
Стр = СтрЧисло + "000";
КонецЕсли;
Возврат Стр
КонецФункции // ВесОбъемИзЧисла()
Проверялось на ДАЛИОН: Управление магазином. ПРО, ред. 2.0 (2.0.37.02).
Обработка на обычных формах.