Как настроить автоматическую генерацию и печать штрихкодов для номенклатуры в 1С:Бухгалтерия 3.0?

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия Управленческий учет Торговля и дистрибуция
← На главную

Внедрение штрихкодирования — важный шаг для автоматизации складского учета. Основная задача — сделать так, чтобы для каждой новой позиции материалов или инструментов в 1С:Бухгалтерия 3.0 автоматически создавался уникальный штрихкод. В дальнейшем эти штрихкоды можно будет распечатать на этикетках, наклеить на товары и использовать сканер для быстрого заполнения документов прихода и расхода. Рассмотрим по шагам, как реализовать такую систему с нуля, от написания кода до практических советов по организации процесса на складе.

Шаг 1. Определяемся с концепцией и форматом штрихкода

Прежде чем писать код, необходимо принять несколько ключевых решений, которые лягут в основу всей системы.

Формат штрихкода. Наиболее распространенным и универсальным стандартом является EAN-13. Он поддерживается большинством сканеров и программного обеспечения. Для внутренних нужд компании (когда товар не предназначен для розничной продажи в других сетях) принято использовать штрихкоды, начинающиеся с цифры "2". Этот префикс зарезервирован для локального использования и гарантирует, что ваши внутренние штрихкоды не пересекутся с кодами других производителей.

Важный момент: не стоит закладывать в префикс или сам штрихкод дополнительную смысловую нагрузку, например, код склада, группу товаров или поставщика. Штрихкод — это, в первую очередь, уникальный идентификатор номенклатурной позиции. Вся остальная информация должна храниться в соответствующих реквизитах справочника Номенклатура в базе данных. Такой подход упрощает систему и избавляет от необходимости перемаркировки товаров при их перемещении.

Способ генерации. Существует два основных подхода:

  1. Ручная генерация. Добавить на форму элемента номенклатуры кнопку "Сформировать ШК". Пользователь нажимает ее при необходимости. Этот способ менее надежен, так как зависит от человеческого фактора — можно просто забыть нажать кнопку.
  2. Автоматическая генерация. Штрихкод создается автоматически в момент записи нового элемента номенклатуры. Этот вариант предпочтительнее, так как исключает ошибки и гарантирует, что каждая новая позиция сразу получит свой уникальный идентификатор.

Мы остановимся на втором, более надежном, автоматическом подходе.

Шаг 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; ЧЦ=" + КоличествоЗнаков);
КонецФункции

// Функция проверки уникальности штрихкода в регистре
Функция ПроверкаНовогоШтрихкода(Штрихкод)
	Запрос = Новый Запрос;
	Запрос.УстановитьПараметр("Штрихкод", Штрихкод);
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	Штрихкоды.Штрихкод
		|ИЗ
		|	РегистрСведений.Штрихкоды КАК Штрихкоды
		|ГДЕ
		|	Штрихкоды.Штрихкод = &Штрихкод";
	Возврат Запрос.Выполнить().Пустой();
КонецФункции

После добавления этого кода в расширение конфигурации, каждая новая номенклатурная позиция при первой записи будет автоматически получать уникальный внутренний штрихкод.

Шаг 3. Генерация штрихкодов для существующей номенклатуры

Автоматика будет работать для новых товаров, но что делать с теми, которые уже есть в базе? Для них нужно создать и запустить разовую обработку. Она должна перебрать все элементы справочника Номенклатура, проверить наличие внутреннего штрихкода и, если его нет, сгенерировать и записать новый.


// Примерный код для обработки

Процедура ВыполнитьГенерацию()
	ВыборкаНоменклатуры = Справочники.Номенклатура.Выбрать();
	Пока ВыборкаНоменклатуры.Следующий() Цикл
		// Проверяем, что это не группа и не услуга
		Если НЕ ВыборкаНоменклатуры.ЭтоГруппа И ВыборкаНоменклатуры.ВидНоменклатуры.ТипНоменклатуры <> Перечисления.ТипыНоменклатуры.Услуга Тогда
			// Используем уже написанную нами функцию проверки
			Если НЕ Справочники.Номенклатура.ЕстьВнутреннийШтрихКод(ВыборкаНоменклатуры.Ссылка) Тогда
				// И функцию создания
				Справочники.Номенклатура.СоздатьВнутреннийШтрихКод(ВыборкаНоменклатуры.Ссылка);
				Сообщить("Для номенклатуры '" + ВыборкаНоменклатуры.Наименование + "' создан штрихкод.");
			КонецЕсли;
		КонецЕсли;
	КонецЦикла;
	Сообщить("Генерация штрихкодов для существующей номенклатуры завершена.");
КонецПроцедуры

Шаг 4. Печать этикеток и выбор оборудования

Сгенерировать штрихкоды — это только половина дела. Их нужно распечатать и наклеить. Для печати в большинстве типовых конфигураций 1С есть стандартная обработка "Печать этикеток и ценников". Ее можно использовать для создания макетов и вывода их на печать.

Ключевым моментом является выбор способа печати, так как от него зависит долговечность этикеток.

  1. Прямая термопечать. Используется специальная термобумага, которая темнеет при нагреве.
    • Плюсы: дешевизна оборудования, не нужны расходные материалы (кроме самих этикеток).
    • Минусы: этикетки выцветают со временем, чувствительны к солнечному свету и теплу.
    • Когда использовать: для товаров с быстрой оборачиваемостью, когда этикетка не должна храниться месяцами.
  2. Термотрансферная печать. Используется специальная красящая лента (риббон), с которой краска переносится на обычную бумажную или синтетическую этикетку.
    • Плюсы: очень стойкое изображение, не боится влаги, истирания, солнечного света.
    • Минусы: оборудование и расходники (риббоны) дороже.
    • Когда использовать: для товаров длительного хранения, для работы в сложных условиях (склад, производство).
  3. Печать на обычном лазерном принтере. Используются листы А4 с самоклеящимися этикетками.
    • Плюсы: не нужно покупать специальный принтер.
    • Минусы: подходит только для очень малых объемов. При массовой печати возникают проблемы с точным позиционированием, что приводит к "уползанию" штрихкода за пределы наклейки.

Для серьезной складской работы рекомендуется использовать термотрансферный принтер.

Шаг 5. Организация складских процессов

Внедрение штрихкодирования — это не только техническая, но и организационная задача. Процесс наклеивания этикеток — самый трудоемкий этап. Продумайте, когда и кто будет это делать (например, при оприходовании товара на склад).

Использование в документах. После того как товары промаркированы, можно использовать обычный USB-сканер штрихкодов в режиме эмуляции клавиатуры. При заполнении табличной части документа (например, Перемещение товаров или Реализация товаров и услуг) достаточно установить курсор в колонку "Номенклатура" и отсканировать штрихкод. 1С автоматически найдет товар и добавит его в документ.

Дальнейшее развитие. Для повышения эффективности можно внедрить адресное хранение, когда штрихкодами маркируются не только товары, но и места их хранения (ячейки, полки, стеллажи). Использование терминалов сбора данных (ТСД) с такой системой позволяет практически полностью исключить ошибки при сборке заказов. Сотрудник получает на ТСД задание, подходит к нужной ячейке, сканирует ее штрихкод, затем штрихкод товара, вводит количество — и так по всему заказу. Это значительно ускоряет работу и повышает точность учета.

← На главную