Добрый день, уважаемые гуру своего дела, и примкнувшие!
Уже непозволительно много времени потратил на попытки вставить штрихкод на печатную форму, поэтому взываю к помощи. В документ штрихкод поставить получается (код приложил), но на печатную форму не могу осилить.
Т.е. сейчас есть макет, на котором добавлена область "Штрихкод" в которой расположена Картинка. В Модуле менеджера созданный конструктором код, который, естественно не дает никаких намеков на то, что там откуда-то может появиться штрихкод. Я по-разному пытался пристроить в Модуль менеджера тот код, что дал мне возможность показать штрихкод в документе, но всё тщетно.
В моём понимании: в Модуле менеджера я в каком-то виде должен обыграть тот код, что в Процедуре ВывестиШтрихКодНаСервере()? И соответственно где разместить Функцию ПолучитьКартинкуШтрихкода(), которая должна мне нарисовать сам штрихкод?
Буду благодарен за любую помощь, и готов предоставить необходимую информацию. Спасибо!
(1) какой тип ШК? Если EAN8 или EAN13, можно вывести шрифтом EAN, предварительно применив кодировку
Если СтрДлина(Строка.Штрихкод)=13 Тогда
Область.Параметры.Штрихкод=КодируемШтрихКод(Строка.Штрихкод);
ИначеЕсли СтрДлина(Строка.Штрихкод)=8 Тогда
Область.Параметры.Штрихкод=КодируемШтрихКод8(Строка.Штрихкод);
Иначе
Область.Параметры.Штрихкод="";
КонецЕсли;
&НаСервереБезКонтекста
Функция КодируемШтрихКод(Парам)
Если СтрДлина(Парам)<>13 Тогда
Возврат "1234567890123";
КонецЕсли;
ПечШтрих="";
Код=Парам;
Ф = Новый Массив(11);
Ф[1]="000000"; //0
Ф[2]="001011"; //1
Ф[3]="001101"; //2
Ф[4]="001110"; //3
Ф[5]="010011"; //4
Ф[6]="011001"; //5
Ф[7]="011100"; //6
Ф[8]="010101"; //7
Ф[9]="010110"; //8
Ф[10]="011010"; //9
Маска=""+Лев(СокрЛП(Код),1)+Ф[Число(Лев(СокрЛП(Код),1))+1]+"222222";
Дл=СтрДлина(Код);
Для ИИ=1 По Дл Цикл
Если ИИ=1 Тогда
Стр1=""+Лев(СокрЛП(Код),1);
Иначе //ИИ от 2 до 13
СимволМаски=Сред(Маска,ИИ,1);
Если СимволМаски="0" Тогда
Стр1=Символ(65+Сред(Код,ИИ,1));
ИначеЕсли СимволМаски="1" Тогда
Стр1=Символ(75+Сред(Код,ИИ,1));
ИначеЕсли СимволМаски="2" Тогда
Стр1=Символ(97+Сред(Код,ИИ,1));
КонецЕсли;
КонецЕсли;
ПечШтрих=ПечШтрих+Стр1;
Если ИИ=7 Тогда
ПечШтрих=ПечШтрих+"*";
ИначеЕсли ИИ=13 Тогда
ПечШтрих=ПечШтрих+"+";
КонецЕсли;
КонецЦикла;
Возврат ПечШтрих;
КонецФункции
&НаСервереБезКонтекста
Функция КодируемШтрихКод8(Парам)
Если СтрДлина(Парам)<>8 Тогда
Возврат "12345678";
КонецЕсли;
ПечШтрих=":";
Для ИИ=1 По 4 Цикл
ПечШтрих=ПечШтрих+Символ(65+Сред(Парам,ИИ,1));
КонецЦикла;
ПечШтрих=ПечШтрих+"*";
Для ИИ=5 По 8 Цикл
ПечШтрих=ПечШтрих+Символ(97+Сред(Парам,ИИ,1));
КонецЦикла;
ПечШтрих=ПечШтрих+"+";
Возврат ПечШтрих;
КонецФункции
(2) так я оно и пытаюсь. А 1Ска меня всё больше ошибками одаряет, или молчаливо, но и без заветной картинки, открывает мою форму. Но спасибо за ответы!
// Формирование изображения штрихкода.
//
// Параметры:
// ПараметрыШтрихкода - см. ГенерацияШтрихкода.ПараметрыГенерацииШтрихкода.
//
// Возвращаемое значение:
// Структура:
// Результат - Булево - результат генерации штрихкода.
// ДвоичныеДанные - ДвоичныеДанные - двоичные данные изображения штрихкода.
// Картинка - Картинка - картинка с сформированным штрихкодом или НЕОПРЕДЕЛЕНО.
//
Функция ИзображениеШтрихкода(ПараметрыШтрихкода) Экспорт
Эх, генерацию-то я осилил. В документ обычный в ТабДок отправил. А вот договориться, чтобы шк вставал вместо разовой картинки на макет не могу. Никак не докумекаю. Но спасибо за небольшой ликбез! Сегодня дел поднавалили других, а завтра буду опять заниматься, вдруг гляну, а тут и правда вот оно! И так бывает :)
1. А что, в УТ разве нет механизма штрих-кодирования документов? В ЕРП есть.
2. Ну должна же быть где-то в БСП функция, которая вставляет ШК в макет. Помнится мне, что это было что-то на уровне одной строки кода для слабоумных пациентов кащенки. Типа "УправлениеЧемТоТам.ВставитьШКВмакет(АргументыИФакты);"
(8) 1. Вообще, по мануалам, есть. Я поискал, не нашел, почесал репу. Проверил, что у меня правда УТ. Поискал еще раз, ну нет и всё! И сам той же логикой пошел к Вашему пункту 2, думая: "ну фигня, сейчас сами может и не быстренько, но без мучений. Не тут-то было. Но я как бы из тех, что только к граниту примкнул, могу какую-то банальность просто упускать. Благо уже добрые люди наводки дают, буду пробовать применять
Всем спасибо! Я, в общем, доколупал свою идею. Всё разместил непосредственно в модуле формы, создал кнопку под печать, всунул кусок про формирование штрихкода в создание печатной формы, и сам штрихкод тут же, в модуле формы формируется. Картинка со штрихкодом в ОбластьЗаголовок размещена, имя картинки "ШтрихкодК". Модуль менеджера и стандартные конструктора печати 1С задушили меня ошибками. Код размещу, может кому на будущее пригодится.
&НаКлиенте
Процедура ПечатьЗадания(Команда)
ФормаПечати = ПечатьЗаданияНаСервере();
ФормаПечати.Показать();
КонецПроцедуры
&НаСервере
Функция ПечатьЗаданияНаСервере()
ТаблДок = Новый ТабличныйДокумент;
ТекОбъект = РеквизитФормыВЗначение("Объект");
Макет = ТекОбъект.ПолучитьМакет("ПроизводственноеЗадание");
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПроизводственноеЗаданиеГАС.Дата КАК Дата,
| ПроизводственноеЗаданиеГАС.ДатаВыполнения КАК ДатаВыполнения,
| ПроизводственноеЗаданиеГАС.Номер КАК Номер,
| ПроизводственноеЗаданиеГАС.Подразделение КАК Подразделение,
| ПроизводственноеЗаданиеГАС.Сотрудник КАК Сотрудник,
| ПроизводственноеЗаданиеГАС.ТехнологияПроведенияРабот КАК ТехнологияПроведенияРабот,
| ПроизводственноеЗаданиеГАС.Штрихкод КАК Штрихкод,
| ПроизводственноеЗаданиеГАС.ВыданоВРаботу.(
| ОперацияВРаботу КАК ОперацияВРаботу,
| ИзделиеВРаботу КАК ИзделиеВРаботу,
| КоличествоВРаботу КАК КоличествоВРаботу,
| ОборудованиеВРаботу КАК ОборудованиеВРаботу,
| ШтампВРаботу КАК ШтампВРаботу,
| МестоПолученияВРаботу КАК МестоПолученияВРаботу,
| МестоСкладированияВРаботу КАК МестоСкладированияВРаботу
| ) КАК ВыданоВРаботу,
| ПроизводственноеЗаданиеГАС.ПолучитьНаСкладе.(
| НомерСтроки КАК НомерСтроки,
| НаименованиеКПолучению КАК НаименованиеКПолучению,
| Количество КАК Количество
| ) КАК ПолучитьНаСкладе,
| ПроизводственноеЗаданиеГАС.Оснастка.(
| НомерСтроки КАК НомерСтроки,
| НаименованиеОснастки КАК НаименованиеОснастки
| ) КАК Оснастка
|ИЗ
| Документ.ПроизводственноеЗаданиеГАС КАК ПроизводственноеЗаданиеГАС
|ГДЕ
| ПроизводственноеЗаданиеГАС.Номер = &Номер";
Запрос.Параметры.Вставить("Номер", Объект.Номер);
Выборка = Запрос.Выполнить().Выбрать();
ОбластьЗаголовок = Макет.ПолучитьОбласть("Заголовок");
Шапка = Макет.ПолучитьОбласть("Шапка");
ОбластьВыданоВРаботуШапка = Макет.ПолучитьОбласть("ВыданоВРаботуШапка");
ОбластьВыданоВРаботу = Макет.ПолучитьОбласть("ВыданоВРаботу");
ОбластьПолучитьНаСкладеШапка = Макет.ПолучитьОбласть("ПолучитьНаСкладеШапка");
ОбластьПолучитьНаСкладе = Макет.ПолучитьОбласть("ПолучитьНаСкладе");
ОбластьОснасткаШапка = Макет.ПолучитьОбласть("ОснасткаШапка");
ОбластьОснастка = Макет.ПолучитьОбласть("Оснастка");
Подвал = Макет.ПолучитьОбласть("Подвал");
ТаблДок.Очистить();
ВставлятьРазделительСтраниц = Ложь;
Пока Выборка.Следующий() Цикл
Если ВставлятьРазделительСтраниц Тогда
ТаблДок.ВывестиГоризонтальныйРазделительСтраниц();
КонецЕсли;
ШтрихкодК = ПолучитьКартинкуШтрихкода(Объект.Штрихкод);
Если ШтрихкодК <> Неопределено Тогда
ОбластьЗаголовок.Рисунки.ШтрихкодК.Картинка = ШтрихкодК;
КонецЕсли;
ТаблДок.Вывести(ОбластьЗаголовок);
Шапка.Параметры.Заполнить(Выборка);
Шапка.Параметры.ДатаВыполнения = Формат(Выборка.ДатаВыполнения, "ДФ=dd.MM.yyyy");
ТаблДок.Вывести(Шапка, Выборка.Уровень());
ТаблДок.Вывести(ОбластьВыданоВРаботуШапка);
ВыборкаВыданоВРаботу = Выборка.ВыданоВРаботу.Выбрать();
Пока ВыборкаВыданоВРаботу.Следующий() Цикл
ОбластьВыданоВРаботу.Параметры.Заполнить(ВыборкаВыданоВРаботу);
ТаблДок.Вывести(ОбластьВыданоВРаботу, ВыборкаВыданоВРаботу.Уровень());
КонецЦикла;
ТаблДок.Вывести(ОбластьПолучитьНаСкладеШапка);
ВыборкаПолучитьНаСкладе = Выборка.ПолучитьНаСкладе.Выбрать();
Пока ВыборкаПолучитьНаСкладе.Следующий() Цикл
ОбластьПолучитьНаСкладе.Параметры.Заполнить(ВыборкаПолучитьНаСкладе);
ТаблДок.Вывести(ОбластьПолучитьНаСкладе, ВыборкаПолучитьНаСкладе.Уровень());
КонецЦикла;
ТаблДок.Вывести(ОбластьОснасткаШапка);
ВыборкаОснастка = Выборка.Оснастка.Выбрать();
Пока ВыборкаОснастка.Следующий() Цикл
ОбластьОснастка.Параметры.Заполнить(ВыборкаОснастка);
ТаблДок.Вывести(ОбластьОснастка, ВыборкаОснастка.Уровень());
КонецЦикла;
Подвал.Параметры.Заполнить(Выборка);
ТаблДок.Вывести(Подвал);
ВставлятьРазделительСтраниц = Истина;
КонецЦикла;
Возврат ТаблДок;
КонецФункции
&НаСервере
Функция ПолучитьКартинкуШтрихкода(Штрихкод)
ИнформацияОСистеме = Новый СистемнаяИнформация;
ПодключитьВнешнююКомпоненту("ОбщийМакет.КомпонентаПечатиШтрихкодов", "КартинкаШтрихкода", ТипВнешнейКомпоненты.Native);
Компонент = Новый ("AddIn.КартинкаШтрихкода.Barcode");
Если Не Компонент.ГрафикаУстановлена Тогда
Возврат Неопределено;
КонецЕсли;
Если Компонент.НайтиШрифт("Times New Roman") = Истина Тогда
Компонент.Шрифт = "Times New Roman";
Иначе
Для Сч = 0 По Компонент.КоличествоШрифтов -1 Цикл
ТекущийШрифт = Компонент.ШрифтПоИдексу(Сч);
Если ТекущийШрифт <> Неопределено Тогда
Компонент.Шрифт = ТекущийШрифт;
Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Компонент.РазмерШрифта = 15;
Компонент.Ширина = 100;
Компонент.Высота = 90;
Компонент.ТипКода = 1; // EAN-13
Компонент.ВидимостьКС = Ложь;
Компонент.ЗначениеКода = Штрихкод;
Если Компонент.Ширина < Компонент.МинимальнаяШиринаКода Тогда
Компонент.Ширина = Компонент.МинимальнаяШиринаКода + 10;
КонецЕсли;
ДвоичныеДанныеКартинки = Компонент.ПолучитьШтрихкод();
Если НЕ ДвоичныеДанныеКартинки= Неопределено Тогда
Возврат Новый Картинка (ДвоичныеДанныеКартинки);
КонецЕсли;
Возврат Неопределено;
КонецФункции;