Задача: необходимо организовать в 1С поиск документа по штрихкоду. Зачем это нужно? Например, после того, как расходная накладная вернулась от покупателя необходимо в реестре (как это обычно делают в Excel) отметить что оригинала документа вернулся с подписями и печатями и есть в наличии. Или другая ситуация. Покупатель вернулся со счетом на оплату и просит его откорректировать. Чтобы ускорить поиск можно отсканировать документ и программа сама найдет его и откроет. Можно по разному применять данную технологию но главная задача неизменная - поиск документа сканером штрихкодов.

Исходные данные:

- Конфигурация: УТП (обычные формы).
- Сканер штрихкодов: Motorola (Zebra) LS 2208
- Место поиска: журнал документов Реализация товаров

Задачи, которые нужно решить:

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

2. Доработать журнал документов, чтобы в нем можно было производить поиск по штрихкоду.

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

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

5. Установить на компьютер утилиту печати штрихкодов (1С Печать штрихкодов) и 32-битный клиент платформы 1С. С 64-битным клиентом эта утилита не работает.

ШТРИХКОД НА ДОКУМЕНТЕ

Для вывода штрихкода на документе нужно разместить в макете печатной формы объект с типом Картинка. Если хотите это сделать вручную можно найти как это сделать. Если проще, то можно скопировать данный объект с макета где этот объект уже размещен, например, макета печати этикеток. В результате должен получится макет:

Код сопровождающий печать штрихкода на документе:

Шаблон кода

//Вспомогательная функция для печати штрихкодов:

Функция ПолучитьЗначениеТипаШтрихкодаДляЭУ(ТипКода)
Перем Значение;

Если ТипКода = ПланыВидовХарактеристик.ТипыШтрихкодов.EAN8 Тогда
Значение = 0;
ИначеЕсли ТипКода = ПланыВидовХарактеристик.ТипыШтрихкодов.EAN13 Тогда
Значение = 1;
ИначеЕсли ТипКода = ПланыВидовХарактеристик.ТипыШтрихкодов.EAN128 Тогда
Значение = 2;
ИначеЕсли ТипКода = ПланыВидовХарактеристик.ТипыШтрихкодов.Code39 Тогда
Значение = 3;
ИначеЕсли ТипКода = ПланыВидовХарактеристик.ТипыШтрихкодов.Code128 Тогда
Значение = 4;
Иначе
Значение = -1;
КонецЕсли;

Возврат Значение;
КонецФункции // ПолучитьЗначениеТипаШтрихкодаДляЭУ()

Скриншот кода

Основной код, отвечающий за вывод штрихкода в печатную форму:

Шаблон кода

//штрихкод
ТипКода = ПолучитьЗначениеТипаШтрихкодаДляЭУ(ПланыВидовХарактеристик.ТипыШтрихкодов.Code39);
Если ТипКода = -1 Тогда
ОбщегоНазначения.СообщитьОбОшибке("Для штрихкода формата """ + ПланыВидовХарактеристик.ТипыШтрихкодов.EAN13
+ """ не существует соответствующего типа в ЭУ ""1С:Печать штрихкодов"".
| Позиция будет пропущена");
КонецЕсли;

ОбластьМакета.Рисунки.Штрихкод.Объект.ТипКода = ТипКода;
ОбластьМакета.Рисунки.Штрихкод.Объект.ТекстКода = Шапка.Штрихкод;
ОбластьМакета.Рисунки.Штрихкод.Объект.Сообщение= Шапка.Штрихкод;

Скриншот кода


 

ДОРАБОТКА ЖУРНАЛА ДОКУМЕНТОВ

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

Шаблон кода

Процедура ДействияФормыПоискПоШтрихКоду(Кнопка)
Результат = РаботаСТорговымОборудованием.ВвестиШтрихкод();

Если Не ПустаяСтрока(Результат) Тогда
ПолучитьСерверТО().ОбработатьВведенныйШтрихкод(Результат, ЭтаФорма);
КонецЕсли;

КонецПроцедуры

Скнишот кода

 

Этот код отправляет к основному коду поиска, который ищет в журнале реквизит «штрихкод» значение которого соответствует отсканированному.

Шаблон кода

Функция СШКНеизвестныйКод(Штрихкод, ТипКода, СШК) Экспорт

НайтиЗаказПоШтрихкоду(Штрихкод);
Возврат Истина;

КонецФункции

Скриншот кода

Шаблон кода

Процедура НайтиЗаказПоШтрихкоду(ТекШтрихкод)

Запрос = Новый Запрос;
Запрос.Текст =

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

Запрос.УстановитьПараметр("Штрихкод", ТекШтрихкод);
Результат = Запрос.Выполнить();

Если Результат.Пустой() Тогда
Сообщить("Накладная со штрихкодом " + ТекШтрихкод + " не найдена");
Возврат;
Иначе
Выборка = Результат.Выбрать();
Выборка.Следующий();
СсылкаНаДокумент = Выборка.Ссылка;
//СсылкаНаДокумент.ПолучитьФорму().Открыть(); // расскомментировать строку если нужно открыть документ после сканирования
//а все что ниже закомментировать
Форма = СсылкаНаДокумент.ПолучитьФорму("ФормаДокумента");
Форма.ЕстьОригинал = Истина;
Форма.Открыть();
Форма.Записать();
Форма.Закрыть();
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("ЕстьОригинал", Истина);

КонецЕсли;

КонецПроцедуры

Скриншот кода

ДОРАБОТКА ДОКУМЕНТА РЕАЛИЗАЦИЯ ТОВАРОВ

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

ГЕНЕРАЦИЯ ШТРИХКОДА

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

Шаблон кода

Функция ПоследнийНомерВЖурнале()

Запрос = Новый Запрос;

ДатаНачала = НачалоГода(ТекущаяДата());
ДатаОкончания = КонецГода(ТекущаяДата());

Запрос.УстановитьПараметр("Организация", Организация);
Запрос.УстановитьПараметр("ДатаНачала", ДатаНачала);
Запрос.УстановитьПараметр("ДатаОкончания", ДатаОкончания);

Запрос.Текст =
"ВЫБРАТЬ Первые 1
| РеализацияТоваровУслуг.Ссылка,
| МАКСИМУМ(РеализацияТоваровУслуг.Номер) КАК Номер,
| РеализацияТоваровУслуг.Организация,
| РеализацияТоваровУслуг.Дата
|ИЗ
| Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
|ГДЕ
| РеализацияТоваровУслуг.Организация = &Организация
| И РеализацияТоваровУслуг.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания
|
|СГРУППИРОВАТЬ ПО
| РеализацияТоваровУслуг.Ссылка,
| РеализацияТоваровУслуг.Организация,
| РеализацияТоваровУслуг.Дата
|
|УПОРЯДОЧИТЬ ПО
| Номер УБЫВ";

РезультатЗапроса = Запрос.Выполнить();

ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();

Пока ВыборкаДетальныеЗаписи.Следующий() Цикл

НомерДокументаДляШК = ВыборкаДетальныеЗаписи.Номер;

КонецЦикла;

Если Организация = Справочники.Организации.НайтиПоКоду("000000002") Тогда
КодОрганизации = "1";
Иначе
КодОрганизации = "2";
КонецЕсли;

НомерБезПрефикса = НомерДокументаДляШК;
Пока Найти(НомерБезПрефикса,"0") <> 1 Цикл
НомерБезПрефикса = Сред(НомерБезПрефикса,2);
КонецЦикла;

НомерБезНулей = НомерБезПрефикса;
Пока Найти(НомерБезНулей,"0") = 1 Цикл
НомерБезНулей = Сред(НомерБезНулей,2); //удаляет нули
КонецЦикла;

ОбработанныйНомер = Число(НомерБезНулей)+1;
ГодШК = Год(ТекущаяДата());
Год = Прав(ГодШК,2);
Штрихкод = КодОрганизации + Год + "000"+(ОбработанныйНомер);

Возврат Штрихкод ;

КонецФункции

В модуль объекта Расходная накладная в процедуру ПередЗаписью необходимо поместить код:

Шаблон кода

Если НЕ ЭтоНовый() Тогда

Если Организация = Справочники.Организации.НайтиПоКоду("000000002") Тогда
КодОрганизации = "1";
Иначе
КодОрганизации = "2";
КонецЕсли;

НомерБезПрефикса = Номер;;
Пока Найти(НомерБезПрефикса,"0") <> 1 Цикл
НомерБезПрефикса = Сред(НомерБезПрефикса,2);
КонецЦикла;

НомерБезНулей = НомерБезПрефикса;
Пока Найти(НомерБезНулей,"0") = 1 Цикл
НомерБезНулей = Сред(НомерБезНулей,2); //удаляет нули
КонецЦикла;

ОбработанныйНомер = НомерБезНулей;
ГодШК = Год(ТекущаяДата());
Год = Прав(ГодШК,2);
Штрихкод = КодОрганизации + Год + "000"+(ОбработанныйНомер);

Иначе

Если ПустаяСтрока(Штрихкод) Тогда
Штрихкод = ПоследнийНомерВЖурнале();
КонецЕсли;

КонецЕсли;