Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
22 ноя 2024, 15:18

Нужна помощь по печати ценников!

Автор Ансар, 17 июн 2017, 11:26

0 Пользователей и 1 гость просматривают эту тему.

Ансар

Доброго дня, очень нужна помощь по печати ценников, у меня 7.7 ТИС 9,2 печатаю с внешней обработки, так как стандартная не выводит штрих-коды (очень нужны), но с этой обработки печатает с накладной по одной этикетке на все количество товара, а не по наименованию. Помогите исправить, чтобы печатал один ценник на наименование!

Перем ПечФирма;
//******************************************************************************
Функция ПолучитьЦену(Номенклатура,ДатаЦены)
Цена=0;
СпрЦ=СоздатьОбъект("Справочник.Цены");
СпрЦ.ИспользоватьВладельца(Номенклатура);
ТипЦен=Константа.РозничныйТипЦен;
Если ПустоеЗначение(ТипЦен)=0 Тогда
Если СпрЦ.НайтиПоРеквизиту("ТипЦен",ТипЦен,0)=1 Тогда
Цена=СпрЦ.Цена.Получить(ДатаЦены);
Если Цена=0 Тогда
Цена=СпрЦ.Цена.Получить(РабочаяДата());
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если Цена=0 Тогда
Сообщить("Не удалось получить розничную цену товара '"+
Номенклатура.Код+" : "+СокрЛП(Номенклатура.Наименование)+"'","!!!");
КонецЕсли;
Возврат Цена;
КонецФункции
//******************************************************************************
Функция ПолучитьКоличествоТоваров()
Всего=Таб.КоличествоСтрок();
Метки=СоздатьОБъект("ТаблицаЗначений");
Таб.Выгрузить(Метки,,,"Метка,Количество");
Отмечено=0;
Ценников=0;
Метки.ВыбратьСтроки();
Пока Метки.ПолучитьСтроку()=1 Цикл
Если Метки.Метка=2 Тогда
Отмечено=Отмечено+1;
Ценников=Ценников+Метки.Количество;
КонецЕсли;
КонецЦикла;
Возврат "В списке всего товаров: "+Строка(Всего)
+"; отмечено для печати товаров: "+Строка(Отмечено)
+"; будет напечатано ценников: "+Строка(Ценников);
КонецФункции
//******************************************************************************

Функция ДобавитьСлева( Стр1, Длн, Стр2 )

Стр0 = Стр1;

Пока СтрДлина( Стр0 ) <= Длн
Цикл
Стр0 = Стр2 + Стр0;
КонецЦикла;

Стр0 = Прав( Стр0, Длн );

Возврат Стр0;

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

Функция NumberToUpperChar( Num )
UpperCharSet = "ABCDEFGHIJ";
Num = Число(Прав(Num,1));
Стр = Сред(UpperCharSet, Num + 1, 1);
Возврат Стр;
КонецФункции

/////////////////////////////////////////////////////////////////////

Функция NumberToLowerChar( Num )
LowerCharSet = "abcdefghij";
Num = Число(Прав(Num,1));
Стр = Сред(LowerCharSet, Num + 1, 1);
Возврат Стр;
КонецФункции

//////////////////////////////////////////////////

//////////////////////////////////////////////////
// Генерация строки, печатаемой как код EAN13

Функция EAN13CodeGenerate(код)

// Проверки
Если ТипЗначения(код) <> 1
Тогда
Сообщить("Код для EAN13 должен числовым.");
Возврат "";
КонецЕсли;
   
//Если СтрДлина(код) > 12
//Тогда
// Сообщить("Код для EAN13 должен быть длинной не более 12 символов.");
// Возврат "";
//КонецЕсли;               

// Дополнение лидирующими пробелами
код = ДобавитьСлева(Строка(код),13,"0");

// Добавление кода четности - для кода, дополненого слева "0"
//код = код + Строка(ParityCheck("0"+Код));

//Разбор строки
ПервыйФлаг = Число(Сред(код,1,1));
левстр     = Сред(код,2,6);
правстр    = Сред(код,8,6);

правкод = "";
Для Поз = 1 По 6
Цикл
правкод = правкод + NumberToLowerChar(Сред(правстр,Поз,1));
КонецЦикла;

    //  Формирование левой части кода зависит от значениа ПервыйФлаг
Если      ПервыйФлаг = 0
Тогда
//    0           A  A  A  A  A
левкод = "#!" + Лев(левстр,1)
+ Сред(левстр,2,1)
+ Сред(левстр,3,1)
+ Сред(левстр,4,1)
+ Сред(левстр,5,1)
+ Сред(левстр,6,1);
ИначеЕсли ПервыйФлаг = 1
Тогда
//    1           A  A  B  A  B  B
левкод = "$!"
+ Лев(левстр,1)
+ Сред(левстр,2,1)
+ NumberToUpperChar(Сред(левстр,3,1))
+ Сред(левстр,4,1)
+ NumberToUpperChar(Сред(левстр,5,1))
+ NumberToUpperChar(Сред(левстр,6,1));
ИначеЕсли ПервыйФлаг = 2
Тогда
//    2           A  A  B  B  A  B
левкод = "%!"
+ Лев(левстр,1)
+ Сред(левстр,2,1)
+ NumberToUpperChar(Сред(левстр,3,1))
+ NumberToUpperChar(Сред(левстр,4,1))
+ Сред(левстр,5,1)
+ NumberToUpperChar(Сред(левстр,6,1));
ИначеЕсли ПервыйФлаг = 3
Тогда
//    3           A  A  B  B  B  A
левкод = "&!"
+ Лев(левстр,1)
+ Сред(левстр,2,1)
+ NumberToUpperChar(Сред(левстр,3,1))
+ NumberToUpperChar(Сред(левстр,4,1))
+ NumberToUpperChar(Сред(левстр,5,1))
+ Сред(левстр,6,1);
ИначеЕсли ПервыйФлаг = 4
Тогда
//    4           A  B  A  A  B  B
левкод = "'!"
+ Лев(левстр,1)
+ NumberToUpperChar(Сред(левстр,2,1))
+ Сред(левстр,3,1)
+ Сред(левстр,4,1)
+ NumberToUpperChar(Сред(левстр,5,1))
+ NumberToUpperChar(Сред(левстр,6,1));
ИначеЕсли ПервыйФлаг = 5
Тогда
//    5           A  B  B  A  A  B
левкод = "(!"
+ Лев(левстр,1)
+ NumberToUpperChar(Сред(левстр,2,1))
+ NumberToUpperChar(Сред(левстр,3,1))
+ Сред(левстр,4,1)
+ Сред(левстр,5,1)
+ NumberToUpperChar(Сред(левстр,6,1));
ИначеЕсли ПервыйФлаг = 6
Тогда
//    6           A  B  B  B  A  A
левкод = ")!"
+ Лев(левстр,1)
+ NumberToUpperChar(Сред(левстр,2,1))
+ NumberToUpperChar(Сред(левстр,3,1))
+ NumberToUpperChar(Сред(левстр,4,1))
+ Сред(левстр,5,1)
+ Сред(левстр,6,1);
ИначеЕсли ПервыйФлаг = 7
Тогда
//    7           A  B  A  B  A  B
левкод = "*!"
+ Лев(левстр,1)
+ NumberToUpperChar(Сред(левстр,2,1))
+ Сред(левстр,3,1)
+ NumberToUpperChar(Сред(левстр,4,1))
+ Сред(левстр,5,1)
+ NumberToUpperChar(Сред(левстр,6,1));
ИначеЕсли ПервыйФлаг = 8
Тогда
//    8           A  B  A  B  B  A
левкод = "+!"
+ Лев(левстр,1)
+ NumberToUpperChar(Сред(левстр,2,1))
+ Сред(левстр,3,1)
+ NumberToUpperChar(Сред(левстр,4,1))
+ NumberToUpperChar(Сред(левстр,5,1))
+ Сред(левстр,6,1);
ИначеЕсли ПервыйФлаг = 9
Тогда
//    9           A  B  B  A  B  A
левкод = ",!"
+ Лев(левстр,1)
+ NumberToUpperChar(Сред(левстр,2,1))
+ NumberToUpperChar(Сред(левстр,3,1))
+ Сред(левстр,4,1)
+ NumberToUpperChar(Сред(левстр,5,1))
+ Сред(левстр,6,1);
КонецЕсли;
   
// Получение строки - результата
кодстр = левкод + "-" + правкод + "!";

Возврат кодстр;

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

Процедура ПоКнопкеПечать()
НомерЦенника=0;
Представление="";
СтрПарам=Форматы.ПолучитьЗначение(Форматы.ТекущаяСтрока(),Представление);
//Сообщить(СтрПарам);
//Сообщить(Представление);
СписПарам=СоздатьОбъект("СписокЗначений");
СписПарам.ИзСтрокиСРазделителями(СтрПарам);
ИсхТабл=СписПарам.ПолучитьЗначение(1);
Ориентация=СписПарам.ПолучитьЗначение(2);
ВСтроке=СписПарам.ПолучитьЗначение(3);
НаСтранице=СписПарам.ПолучитьЗначение(4);

Ценники=СоздатьОбъект("Таблица");
Ценники.ИсходнаяТаблица(ИсхТабл);
Таб.ВыбратьСтроки();
Пока Таб.ПолучитьСтроку()=1 Цикл
Если Таб.Метка=1 Тогда
Продолжить;
КонецЕсли;
Номенклатура=Таб.Номенклатура;
Количество=Таб.Количество;
ПечРозн=СокрЛП(Формат(Таб.Цена,"Ч015.2, "))+" руб.";
ПечФирма=СокрЛП(глПользователь.ОсновнаяФирма.Наименование);
ПечНаименование=СокрЛП(?(ПустоеЗначение(Номенклатура.ПолнНаименование)=0,Номенклатура.ПолнНаименование,Номенклатура.Наименование));
ПечЕдиница="за 1 "+СокрЛП(Номенклатура.БазоваяЕдиница.ОКЕИ.Наименование);
ПечКодАрт="Код: "+Номенклатура.Код+?(ПустаяСтрока(Номенклатура.Артикул)=0,"  Арт.: "+СокрЛП(Номенклатура.Артикул),"");
ПечАрт=" "+СокрЛП(Номенклатура.Артикул);
ПечШтрихКод=СокрЛП(Номенклатура.БазоваяЕдиница.Штрихкод);
ПечШК=EAN13CodeGenerate(Число(Номенклатура.БазоваяЕдиница.ШтрихКод));
Для Инд=1 По Количество Цикл

Если (НомерЦенника)/НаСтранице=Цел((НомерЦенника)/НаСтранице) Тогда
Ценники.НоваяСтраница();
КонецЕсли;
Если Цел(НомерЦенника/ВСтроке)=(НомерЦенника)/ВСтроке Тогда
Ценники.ВывестиСекцию("Товар|Ценник");
Иначе
Ценники.ПрисоединитьСекцию("Товар|Ценник");
КонецЕсли;
НомерЦенника=НомерЦенника+1;

КонецЦикла;
КонецЦикла;
// Ценники.ПараметрыСтраницы(Ориентация,,,6,6,6,6);
Ценники.ПараметрыСтраницы(Ориентация,,,0,0,0,0);
Ценники.Показать("Ценники - "+Представление);
КонецПроцедуры // ПоКнопкеПечать()разрывстроки
//******************************************************************************
Процедура СнятьВсеМетки()
Таб.ВыбратьСтроки();
Пока Таб.ПолучитьСтроку()=1 Цикл
Таб.Метка=1;
КонецЦикла;
КонецПроцедуры
//******************************************************************************
Процедура УстановитьВсеМетки()
Таб.ВыбратьСтроки();
Пока Таб.ПолучитьСтроку()=1 Цикл
Таб.Метка=2;
КонецЦикла;
КонецПроцедуры
//******************************************************************************
Процедура ОбратитьМетки()
Таб.ВыбратьСтроки();
Пока Таб.ПолучитьСтроку()=1 Цикл
Таб.Метка=?(Таб.Метка=2,1,2);
КонецЦикла;
КонецПроцедуры
//******************************************************************************
Процедура УдалитьСтроку()
КС=Таб.КоличествоСтрок();
Если КС>0 Тогда
ТС=Таб.ТекущаяСтрока();
Таб.УдалитьСтроку(ТС);
Если ТС=КС Тогда
Таб.ТекущаяСтрока(Таб.КоличествоСтрок());
Иначе
Таб.ТекущаяСтрока(ТС);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
//******************************************************************************

//******************************************************************************
Функция Колво()
Количество=0;
ВвестиЧисло(Количество,"Количество",2,0,180);
Если Количество<0 Тогда
Количество=0;
КонецЕсли;
Возврат Количество;
КонецФункции
//******************************************************************************
Процедура ЩелчокПоТаблице()
Если Таб.КоличествоСтрок()=0 Тогда
Возврат;
КонецЕсли;
ТС=Таб.ТекущаяСтрока();
ТК=Таб.ТекущаяКолонка();
Если ТК="Метка" Тогда
Таб.Метка=?(Таб.Метка=1,2,1);
ИначеЕсли ТК="Количество" Тогда
Количество=Колво();
Если Количество>0 Тогда
Таб.Количество=Количество;
КонецЕсли;
ИначеЕсли ТК="Цена" Тогда
Цена=Таб.Цена;
Если ВвестиЧисло(Цена,"укажите цену",15,2,300)<>1 Тогда
    Возврат;
КонецЕсли;
Если Цена<=0 Тогда
    Возврат;
КонецЕсли;
Таб.Цена=Цена;
КонецЕсли;
КонецПроцедуры
//******************************************************************************
Процедура Подбор()
Перем Фрм;
Перем Тек;
Если Таб.КоличествоСтрок()>0 Тогда
Тек=Таб.Номенклатура;
КонецЕсли;
ОткрытьПодбор("Справочник.Номенклатура","ДляВыбора",Фрм,1,Тек);
Фрм.ВыборГруппы(0);
КонецПроцедуры
//******************************************************************************
Процедура ПодборИзДокумента()
// получим виды документов с номенклатурой
Виды=СоздатьОбъект("СписокЗначений");
    Для Инд=1 По Метаданные.Документ() Цикл
Если Метаданные.Документ(Инд).РеквизитТабличнойЧасти()>0 Тогда// только документы с табличной частью
Идентификатор=Метаданные.Документ(Инд).Идентификатор;
Синоним=Метаданные.Документ(Инд).Синоним;
Если глЕстьРеквизитМнЧ("Номенклатура",Идентификатор)=1 Тогда// если в ТЧ документа есть Номенклатура
Док=СоздатьОбъект("Документ."+Идентификатор);
Если Док.ВыбратьДокументы()=1 Тогда// незачем пополнять список документами, которых нет в базе
Виды.ДобавитьЗначение(Идентификатор,Синоним);
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Вид="";
Поз=0;
Если Виды.ВыбратьЗначение(Вид,,Поз,300,1)<>1 Тогда
Возврат;
КонецЕсли;
Конт="";
ОткрытьПодбор("Документ."+Вид,"Журнал.ЖурналОбщий.ФормаСписка",Конт,1);
КонецПроцедуры
//******************************************************************************
Процедура ОбработкаПодбора(Значение)
Тип=ТипЗначенияСтр(Значение);
Вид=Значение.Вид();
Если Найти(Тип+"."+Вид,"Справочник.Номенклатура")>0 Тогда
// подбор товара из Номенклатуры.
// если не установлена галка "Запрашивать количество", добавляется по 1 шт.,
// иначе добавляется введенное количество (целое двузначное число).
// если подобранный товар уже есть в списке, введенное количество
// добавляется к уже существующему количеству
Количество=0;
Если ЗапрашиватьКоличество=0 Тогда
Количество=1;
Иначе
Количество=Колво();
КонецЕсли;
Если Количество=0 Тогда
Возврат;
КонецЕсли;
Стр=0;
Если Таб.НайтиЗначение(Значение,Стр,"Номенклатура")=0 Тогда
Таб.НоваяСтрока();
Таб.Метка=2;// 1 - не установлена, 2 - установлена
Таб.Код=Значение.Код;
Таб.ШтрихКод=Значение.БазоваяЕдиница.Штрихкод;
Таб.Артикул=Значение.Артикул;
Таб.Номенклатура=Значение;
Таб.Количество=Количество;
Таб.Цена=ПолучитьЦену(Значение,РабочаяДата());
Таб.ТекущаяСтрока(Таб.КоличествоСтрок());
Иначе
Таб.УстановитьЗначение(Стр,"Количество",Таб.ПолучитьЗначение(Стр,"Количество")+Количество);
Таб.ТекущаяСтрока(Стр);
КонецЕсли;
ИначеЕсли
Найти(Тип+"."+Вид,"Документ.")>0 Тогда// подбор не из Номенклатуры. из документов, например
Значение.ВыбратьСтроки();
Пока Значение.ПолучитьСтроку()=1 Цикл
Ном=Значение.Номенклатура;
Стр=0;
Если Таб.НайтиЗначение(Ном,Стр,"Номенклатура")=0 Тогда
Таб.НоваяСтрока();
Таб.Метка=2;
Таб.Код=Ном.Код;
Таб.ШтрихКод=Ном.БазоваяЕдиница.Штрихкод;
Таб.Артикул=Ном.Артикул;
Таб.Номенклатура=Ном;
Таб.Количество=Значение.Количество;
Таб.Цена=ПолучитьЦену(Ном,Значение.ДатаДок);
Таб.ТекущаяСтрока(Таб.КоличествоСтрок());
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
//******************************************************************************
// Предопределенная процедура
//
Процедура ПриОткрытии()
Таб.НоваяКолонка("Метка","Число",1,0,"",2);
Таб.НоваяКолонка("Код","Строка",8,,,7);
Таб.НоваяКолонка("ШтрихКод","Строка",13,,"Штрих Код",10);
Таб.НоваяКолонка("Артикул","Строка",25,,"Арт",10);
Таб.Новаяколонка("Номенклатура","Справочник.Номенклатура",,,,25);
Таб.НоваяКолонка("Цена","Число",8,2,,6);
Таб.НоваяКолонка("Количество","Число",2,0,"К-во",1.5);
Таб.ВыводитьПиктограммы("Метка",1);

ПараметрыФормата=СоздатьОбъект("СписокЗначений");
Форматы.УдалитьВсе();

ПараметрыФормата.УдалитьВсе();
ПараметрыФормата.ДобавитьЗначение("Основной шаблон");// имя шаблона таблицы ценника
ПараметрыФормата.ДобавитьЗначение("1");// ориентация: 1 - портрет, 2 - ландшафт
ПараметрыФормата.ДобавитьЗначение("4");// ценников в строке
ПараметрыФормата.ДобавитьЗначение("12");// ценников на странице
Параметры=ПараметрыФормата.ВСтрокуСРазделителями();
Форматы.ДобавитьЗначение(Параметры,"5 х 5 см");

КонецПроцедуры // ПриОткрытии()
//******************************************************************************
//******************************************************************************

дфтын

Да, воткните уже перед выводом на печать Таб.Свернуть
и будет счастье


Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск