barcodelogo

В данном посте я познакомлю вас с подходом организации штрих-кодирования документов конфигурации без масштабной переработки типового решения.
Итак у нас есть типовая конфигурация “Управление торговым предприятием”, в которой уже реализован механизм хранения штрихкодов. Пройдёмся по изменениям в метаданных:

  • Для контроля необходимости печати штрихкодов на документах будем использовать константу с типом Булево “ПечатьШтрихкодовВДокументах”. Проверка значения этой константы позволит включать/выключать наш механизм в случае необходимости.
  • В регистре сведений Штрихкоды у измерения “Владелец” расширим составной тип значением “ДокументСсылка”. Это нам даст возможность для любого документа конфигурации хранить штрихкод документа.
  • Добавим общий макет ШтрихкодШапка. С таким внешним видом:
    CommonMockUp
  • Добавим регистр сведений “НастройкиПечатиШтрихкодов”, в котором для типа документа будем хранить необходимость вывода штрихкода и отступы слева и справа на печатной форме.
  • Теперь у нас в конфигурации есть шапка штрихкода, настройки для какого типа документа в каком месте выводить штрихкод. Соединим это всё воедино изменением типовых методов печати.

    Чтобы не менять печать у всех документов мы можем воспользоваться методом НапечататьДокумент() общего модуля “УниверсальныеМеханизмы”. В данном методе мы будем проверять необходимость печати штрихкода. После этого получать настройки для печатаемого типа документа и в случае необходимости печати будем получать значение штрихкода. Во время получения значения штрихкода мы запускаем его генерацию в случае неудачного поиска. Такой подход позволяет нам избавится от внесения изменений в методы модуля объекта и не надо добавлять подписку на событие.
    После того как табличный документ с штрихкодом сгенерирован его надо присоединить к выводимому на печать документу с помощью метода ДобавитьШапкуШтрихкода() (используем в процедуре этот подход.)

    Добавленный в процедуру код:

    
    Если Константы.ПечатьШтрихкодовВДокументах.Получить() и Ссылка <> Неопределено Тогда
    	Запрос = новый Запрос;
    	Запрос.Текст = "ВЫБРАТЬ
    	               |	НастройкиПечатиШтрихкодов.ТипДокумента,
    	               |	НастройкиПечатиШтрихкодов.СВерху,
    	               |	НастройкиПечатиШтрихкодов.СЛева,
    	               |	НастройкиПечатиШтрихкодов.Использование
    	               |ИЗ
    	               |	РегистрСведений.НастройкиПечатиШтрихкодов КАК НастройкиПечатиШтрихкодов
    	               |ГДЕ
    	               |	ТИПЗНАЧЕНИЯ(НастройкиПечатиШтрихкодов.ТипДокумента) = &ТипДокумента";
    	Запрос.УстановитьПараметр("ТипДокумента",ТипЗнч(Ссылка));
    	Выборка = Запрос.Выполнить().Выбрать();
    		
    	Если Выборка.Следующий() Тогда
    		Использование = Выборка.Использование;
    		СЛева = Выборка.СЛева;
    		СВерху = Выборка.СВерху;
    	Иначе
    		Использование = Ложь;     
    	КонецЕсли;
    		
    	Если Использование тогда 
    		НовТабл = новый ТабличныйДокумент;
    		Макет = ПолучитьОбщийМакет("ШтрихкодШапка");
    		ОбластьМакета = Макет.ПолучитьОбласть("Заголовок");
    			
    		Структура = ПолучитьШтрихкод(Ссылка);
    		Если Структура.Количество() <> 0 Тогда
    			ТипКода = ПолучитьЗначениеТипаШтрихкодаДляЭУ(Структура.ТипШтрихкода);
    			Если РаботаСТорговымОборудованием.ПроверитьШтрихКод(?(ПустаяСтрока(Структура.ПредставлениеШтрихкода),
    					Структура.Штрихкод, Структура.ПредставлениеШтрихкода),Структура.ТипШтрихкода) Тогда
    				ОбластьМакета.Рисунки.Штрихкод.Объект.ТипКода   = ТипКода;
    				ОбластьМакета.Рисунки.Штрихкод.Объект.Сообщение = ?(ПустаяСтрока(Структура.ПредставлениеШтрихкода),
    					Структура.Штрихкод, Структура.ПредставлениеШтрихкода);
    		КонецЕсли;
    			ОбластьМакета.Рисунки.Штрихкод.ВыводитьнаПечать = Истина;
    		Иначе
    			ОбластьМакета.Рисунки.Штрихкод.ВыводитьнаПечать = Ложь;
    		КонецЕсли;	
    			
    		ОбластьМакета.Рисунки.Штрихкод.Верх = ОбластьМакета.Рисунки.Штрихкод.Верх+ СВерху;
    		ОбластьМакета.Рисунки.Штрихкод.Лево = ОбластьМакета.Рисунки.Штрихкод.Лево+ СЛева;
    			
    		НовТабл.Вывести(ОбластьМакета);
    		НовТабл.ПовторятьПриПечатиСтроки = ОбластьМакета.области.Заголовок;
    		ДобавитьШапкуШтрихкода(НовТабл, ПечДокумент, );
    		ПечДокумент = НовТабл;
    	КонецЕсли;
    КонецЕсли;