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