7.7 Штрихкод в ценнике ТиС

Тема в разделе "Общие вопросы "1С:Предприятие 7.7"", создана пользователем Vertex, 4 фев 2014.

  1. TopicStarter Overlay
    Vertex
    Offline

    Vertex Опытный в 1С

    Регистрация:
    14 июн 2011
    Сообщения:
    468
    Симпатии:
    4
    Баллы:
    29
    Доброго времени.
    Нужно сделать штрихкод в печатной форме ценника.
    Объект компоненты barcode я скопировал из обработки печать этикеток и вставил в печатную форму ценника, оттрасировал модуль печати этикеток, ничего сложного...., нужные строки переписал в обработку печати ценника.
    Но 1с посылает меня:
    Хотя я и переменную объявил.
    Код:
    //******************************************************************************
    // ДобавитьЦенник(Таб, ПечФирма, ПечНаименование, ПечЕдиница, ПечРозн, Столбик, Ряд)
    //
    // Параметры:
    //  Таб			 - таблица, в которую выполняется вывод ценника
    //  ПечНаименование - наименование товара
    //  ПечЕдиница	  - единица измерения товара
    //  ПечРозн		 - цена товара
    //  Столбик		 - номер столбика.
    //  Ряд			 - номер ряда
    //
    // Возвращаемое значение:
    //  Нет.
    //
    // Описание:
    //  Добавляет ценник в таблицу.
    //
    Процедура ДобавитьЦенник(Таб, ПечФирма, ПечНаименование, ПечЕдиница, ПечРозн, Столбик, Ряд)
    
    Если Ряд = 0 Тогда
    Столбик = 0;
    Ряд = 1;
    Иначе
    Столбик = ?(Столбик = 0, 1, ?(Столбик = 1, 2, 0));
    Ряд  = ?(Столбик = 0, Ряд + 1, Ряд);
    КонецЕсли;
    Если Ряд > 3 Тогда
    Таб.НоваяСтраница();
    Ряд = 1;
    КонецЕсли;
    
    Если Столбик = 0 Тогда
    Таб.ВывестиСекцию("Товар|Ценник");
    //Столбик = Столбик + 1;
    Иначе
    Таб.ПрисоединитьСекцию("Товар|Ценник");
    КонецЕсли;
    КонецПроцедуры // ДобавитьЦенник()		 
    
    //******************************************************************************
    Функция ТолькоЦифры(Стр)
    Рез = 1;
    Для Сч = 1 По СтрДлина(Стр) Цикл
    Символ = Сред(Стр, Сч, 1);
    Если Найти("0123456789", Символ) = 0 Тогда
    Рез = 0;
    Прервать;
    КонецЕсли;
    КонецЦикла;
    
    Возврат Рез;
    
    КонецФункции // ТолькоЦифры()
    //******************************************************************************
    Функция ПроверитьШтрихкод(Штрихкод)
    
    Штрихкод = СокрЛП(Штрихкод);
    ДлинаКода = СтрДлина(Штрихкод);
    Рез = 0;
    
    Если ТолькоЦифры(Штрихкод) = 1 Тогда
    // штрихкод должен состоять из цифр
    
    Если (ДлинаКода = 13) Тогда
    Если глКонтрольныйСимволEAN(Лев(Штрихкод,12), 13) = Прав(Штрихкод, 1) Тогда
    Рез = 1;
    КонецЕсли;
    ИначеЕсли (ДлинаКода = 8) Тогда
    Если глКонтрольныйСимволEAN(Лев(Штрихкод,7), 8) = Прав(Штрихкод, 1) Тогда
    Рез = 1;
    КонецЕсли;
    КонецЕсли;
    КонецЕсли;
    
    Возврат Рез;
    
    КонецФункции // ПроверитьШтрихкод()
    
    //******************************************************************************
    // Сформировать(ТаблицаТоваров, ПечФирма)
    //
    // Параметры:
    //  ТаблицаТоваров - таблица значений, содержащая информацию о цене товара
    //  ПечФирма  - наименование фирмы, которое будет выводиться вверху ценника
    //
    // Возвращаемое значение:
    //  Нет.
    //
    // Описание:
    //  Формирует таблицу с ценниками.
    //
    Процедура Сформировать(ТаблицаТоваров,ПечФирма)
    //  Создание Таблицы для выходного отчета
    Таб = СоздатьОбъект("Таблица");
    Таб.ИсходнаяТаблица("Таблица");
    
    Столбик = 1;
    Ряд	 = 0;
    ТаблицаТоваров.ВыбратьСтроки();
    Пока ТаблицаТоваров.ПолучитьСтроку() = 1 Цикл  
    Если ПроверитьШтрихкод(ТаблицаТоваров.Товар.БазоваяЕдиница.ШтрихКод) = 0 Тогда
    Сообщить("У товара """ + ТаблицаТоваров.Товар + """ штрихкод не задан или имеет неверный формат!");
    Иначе
    ПечРозн    = глФРМ(ТаблицаТоваров.Цена, ТаблицаТоваров.Валюта);
    ПечНаименование = ТаблицаТоваров.Товар;
    ДобавитьЦенник(Таб, ПечФирма, ТаблицаТоваров.Товар, ТаблицаТоваров.Единица, ПечРозн, Столбик, Ряд);
    глОживить(1);
    КонецЕсли;
    КонецЦикла;
    
    //Вызов выходного отчета в окно просмотра и редактирования.
    Таб.Опции(0,0,0,0,"ПечатьЦенников","ПечатьЦенников");
    Таб.ТолькоПросмотр(1);
    Таб.Показать("Товарные ценники","");
    
    КонецПроцедуры
    //******************************************************************************
    // Предопределенная процедура
    //
    Процедура ПриОткрытии()
    
    СтатусВозврата(0);
    ДанныеДляПечати = Форма.Параметр;
    
    Если ТипЗначенияСтр(ДанныеДляПечати) <> "СписокЗначений" Тогда
    Возврат;
    КонецЕсли;
    
    ПечФирма	   = ДанныеДляПечати.Получить("Фирма");
    ТаблицаТоваров = ДанныеДляПечати.Получить("Таблица");
    
    ///*------------------*--------------------*-----------*------------*----------------*------------------*
    
    Попытка
    КомпонентABC = СоздатьОбъект("BARCODE.BarcodeCtrl.1");
    Исключение
    Предупреждение("Компонент ActiveBarcode не установлен на данном компьютере!" +
    РазделительСтрок +
    "Порядок установки компоненты ActiveBarcode описан в документации.");
    Возврат;
    КонецПопытки;
    Сформировать(ТаблицаТоваров, ПечФирма);	 
    КонецПроцедуры // ПриОткрытии()
  2. TopicStarter Overlay
    Vertex
    Offline

    Vertex Опытный в 1С

    Регистрация:
    14 июн 2011
    Сообщения:
    468
    Симпатии:
    4
    Баллы:
    29
    Этому объекту я присваиваю Таб.ТекущийОбъект.Text=СокрЛП(ТаблицаТоваров.Товар.БазоваяЕдиница.ШтрихКод)
    СокрЛП(ТаблицаТоваров.Товар.БазоваяЕдиница.ШтрихКод) - это точно правильно, в отладчики выдается штрих код.
  3. GlukAl
    Offline

    GlukAl Опытный в 1С

    Регистрация:
    4 окт 2012
    Сообщения:
    187
    Симпатии:
    7
    Баллы:
    29
    а где присваиваешь ??

    в процедуре ДобавитьЦенник() ТаблицаТоваров уже не доступна
    и при ВывестиСекцию из нее данных не возмет
  4. TopicStarter Overlay
    Vertex
    Offline

    Vertex Опытный в 1С

    Регистрация:
    14 июн 2011
    Сообщения:
    468
    Симпатии:
    4
    Баллы:
    29
    Присваивается в самой таблице, выделив объект. Всё так же как и в оригинале, только строку с входными данными изменил.
    В оригинале штрихкод получается из Таблицы значений (тип строка), а у меня он получается из единицы измерения (тип строка)
  5. GlukAl
    Offline

    GlukAl Опытный в 1С

    Регистрация:
    4 окт 2012
    Сообщения:
    187
    Симпатии:
    7
    Баллы:
    29
    а попробуй СокрЛП(ПечНаименование.БазоваяЕдиница.ШтрихКод)
  6. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    не взлетит... ПечНаименование это СТРОКА а не ссылка
  7. GlukAl
    Offline

    GlukAl Опытный в 1С

    Регистрация:
    4 окт 2012
    Сообщения:
    187
    Симпатии:
    7
    Баллы:
    29
    Код:
    Процедура ДобавитьЦенник(Таб, ПечФирма, ПечНаименование, ПечЕдиница, ПечРозн, Столбик, Ряд)
    //....
    Таб.ВывестиСекцию("Товар|Ценник");
    //.....
    КонецПроцедуры
    
    
    ДобавитьЦенник(Таб, ПечФирма, ТаблицаТоваров.Товар, ТаблицаТоваров.Единица, ПечРозн, Столбик, Ряд);


    надо СокрЛП(ТаблицаТоваров.Товар.БазоваяЕдиница.ШтрихКод)

    как раз третий параметр ПечНаименование получает ТаблицаТоваров.Товар - не похоже на строку

    а вот сама ТаблицаТоваров в процедуре ДобавитьЦенник уже не существует
  8. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Блин.. Ну вы похоже ТиС только по наслышке знаете...
    Вот ТИПОВАЯ процедура из ТиС...

    Код:
    Процедура ПечатьЭтикетки()
    
    Перем Парам;
    
    Если Выбран() = 0 Тогда
    Предупреждение("Печать можно выполнять только для записанных номенклатурных позиций", 60);
    Возврат;
    КонецЕсли;
    
    ТекЭлем = ТекущийЭлемент();
    
    Если ТекЭлем.Весовой = 0 Тогда
    Баркод = ТекЭлем.БазоваяЕдиница.Штрихкод;
    Табл = СоздатьОбъект("ТаблицаЗначений");
    Табл.НоваяКолонка("Товар", "Строка");
    Табл.НоваяКолонка("Штрихкод", "Строка");
    
    Табл.НоваяСтрока();
    Табл.Товар    = СокрЛП(ТекЭлем.Наименование);
    Табл.Штрихкод = Баркод;
    
    
    Парам = СоздатьОбъект("СписокЗначений");
    Парам.ДобавитьЗначение(Табл, "ТаблицаТоваров");
    
    ОткрытьФормуМодально("Обработка.ПечатьЭтикетки", Парам);
    Иначе
    // в штрихкоде храниться 5 правых цифр кода товара
    // перед печатью нужно сформировать
    
    // получаем вес товара
    Парам = СоздатьОбъект("СписокЗначений");
    Парам.ДобавитьЗначение(ТекЭлем , "Номенклатура");
    Парам.ДобавитьЗначение(ТекЭлем.БазоваяЕдиница , "Единица");
    
    ОткрытьФорму("Обработка.Этикетирование#", Парам);
    КонецЕсли;
    
    КонецПроцедуры // ПечатьЭтикетки()
    
    Передается не ссылка, а строка
  9. Хряк
    Offline

    Хряк Профессионал в 1С

    Регистрация:
    26 сен 2007
    Сообщения:
    1.447
    Симпатии:
    37
    Баллы:
    54
    ну, тады
    ПечЕдиница.Штрихкод
  10. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Типовую процедуру надо менять...
    Код:
    Табл.Товар	= ТекЭлем.ТекущийЭлемент();
    и всего делов........
  11. TopicStarter Overlay
    Vertex
    Offline

    Vertex Опытный в 1С

    Регистрация:
    14 июн 2011
    Сообщения:
    468
    Симпатии:
    4
    Баллы:
    29
    Эта процедура даже не вызывается, так как ценники я печатаю из документов поступления с помощью обработки.
  12. TopicStarter Overlay
    Vertex
    Offline

    Vertex Опытный в 1С

    Регистрация:
    14 июн 2011
    Сообщения:
    468
    Симпатии:
    4
    Баллы:
    29
    Таб.ТекущийОбъект.Text=СокрЛП(ТаблицаТоваров.Товар.БазоваяЕдиница.ШтрихКод) , но я же в данном случае работаю с объектом? Вернее со ссылкой на объект.
  13. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Об этом даже не упоминалось изначально.
    Не знаю....
    У вас код в процедуре ПриОткрытии
    Код:
    ТаблицаТоваров = ДанныеДляПечати.Получить("Таблица");
    Значит таблицу вы УЖЕ сформировали до этого...
    Показывайте как формируете
  14. TopicStarter Overlay
    Vertex
    Offline

    Vertex Опытный в 1С

    Регистрация:
    14 июн 2011
    Сообщения:
    468
    Симпатии:
    4
    Баллы:
    29
    Все проблема решилась.
    Только вот не понял почему так. В ТаблицеТоваров.Товар - передается агрегатный тип данных "Справочник" , реквизиты этого объекта все доступны. (Смотрел в отладчике). Но пока не сделал так:
    Код:
    Перем ТоварШК;
    Процедура Сформировать(ТаблицаТоваров,ПечФирма)
    .....
    ТоварШК.НайтиПоКоду(СокрЛП(ТаблицаТоваров.Товар.Код));
    ДобавитьЦенник(Таб, ПечФирма, ТаблицаТоваров.Товар, ТоварШК.ТекущийЭлемент(), ТаблицаТоваров.Единица, ПечРозн, Столбик, Ряд);
    .....
    КонецПроцедуры
    .....
    Процедура ПриОткрытии()
    .....
    ТоварШК = СоздатьОбъект("Справочник.Номенклатура");
    .....
    КонецПроцедуры
    Таб.ТекущийОбъект.Text=СокрЛП(ТоварШК.БазоваяЕдиница.ШтрихКод) - это то что получает объект внешней компоненты.
  15. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Не знаю что у вас там в макете... Теоретически ТоварШК это д.б. ЕДИНИЦА измерения... Возможно вы макет поменяли?

    + если ТаблицаТоваров.Товар это ссылка справочника. Должно работать так
    Код:
    ТоварШК.НайтиЭлемент(ТаблицаТоваров.Товар);
    
  16. TopicStarter Overlay
    Vertex
    Offline

    Vertex Опытный в 1С

    Регистрация:
    14 июн 2011
    Сообщения:
    468
    Симпатии:
    4
    Баллы:
    29
    НайтиЭлемент работает.
    А какой макет имеете ввиду? Не понял?
  17. TopicStarter Overlay
    Vertex
    Offline

    Vertex Опытный в 1С

    Регистрация:
    14 июн 2011
    Сообщения:
    468
    Симпатии:
    4
    Баллы:
    29
    Вот так тоже сработало.
    Короче верно GlukAl сказал
    p.s Тольно вот ещё что не понятно, я ведь создавал переменную
    ТаблицаТоваров
    для всего модуля.
  18. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    выложите саму обработку. Вы объявили переменную в начале модуля?
  19. TopicStarter Overlay
    Vertex
    Offline

    Vertex Опытный в 1С

    Регистрация:
    14 июн 2011
    Сообщения:
    468
    Симпатии:
    4
    Баллы:
    29
    Модуль обработки "ПечатьЦенников"

    Код:
    //******************************************************************************
    // ДобавитьЦенник(Таб, ПечФирма, ПечНаименование, ПечЕдиница, ПечРозн, Столбик, Ряд)
    //
    // Параметры:
    //  Таб			 - таблица, в которую выполняется вывод ценника
    //  ПечНаименование - наименование товара
    //  ПечЕдиница	  - единица измерения товара
    //  ПечРозн		 - цена товара
    //  Столбик		 - номер столбика.
    //  Ряд			 - номер ряда
    //
    // Возвращаемое значение:
    //  Нет.
    //
    // Описание:
    //  Добавляет ценник в таблицу.
    //
    Процедура ДобавитьЦенник(Таб, ПечФирма, ПечНаименование, ПечЕдиница, ПечРозн, Столбик, Ряд)
    
    Если Ряд = 0 Тогда
    Столбик = 0;
    Ряд = 1;
    Иначе
    Столбик = ?(Столбик = 0, 1, ?(Столбик = 1, 2, 0));
    Ряд  = ?(Столбик = 0, Ряд + 1, Ряд);
    КонецЕсли;
    Если Ряд > 3 Тогда
    Таб.НоваяСтраница();
    Ряд = 1;
    КонецЕсли;
    
    Если Столбик = 0 Тогда
    Таб.ВывестиСекцию("Товар|Ценник");
    //Столбик = Столбик + 1;
    Иначе
    Таб.ПрисоединитьСекцию("Товар|Ценник");
    КонецЕсли;
    КонецПроцедуры // ДобавитьЦенник()		 
    
    //******************************************************************************
    Функция ТолькоЦифры(Стр)
    Рез = 1;
    Для Сч = 1 По СтрДлина(Стр) Цикл
    Символ = Сред(Стр, Сч, 1);
    Если Найти("0123456789", Символ) = 0 Тогда
    Рез = 0;
    Прервать;
    КонецЕсли;
    КонецЦикла;
    
    Возврат Рез;
    
    КонецФункции // ТолькоЦифры()
    //******************************************************************************
    Функция ПроверитьШтрихкод(Штрихкод)
    
    Штрихкод = СокрЛП(Штрихкод);
    ДлинаКода = СтрДлина(Штрихкод);
    Рез = 0;
    
    Если ТолькоЦифры(Штрихкод) = 1 Тогда
    // штрихкод должен состоять из цифр
    
    Если (ДлинаКода = 13) Тогда
    Если глКонтрольныйСимволEAN(Лев(Штрихкод,12), 13) = Прав(Штрихкод, 1) Тогда
    Рез = 1;
    КонецЕсли;
    ИначеЕсли (ДлинаКода = 8) Тогда
    Если глКонтрольныйСимволEAN(Лев(Штрихкод,7), 8) = Прав(Штрихкод, 1) Тогда
    Рез = 1;
    КонецЕсли;
    КонецЕсли;
    КонецЕсли;
    
    Возврат Рез;
    
    КонецФункции // ПроверитьШтрихкод()
    
    //******************************************************************************
    // Сформировать(ТаблицаТоваров, ПечФирма)
    //
    // Параметры:
    //  ТаблицаТоваров - таблица значений, содержащая информацию о цене товара
    //  ПечФирма  - наименование фирмы, которое будет выводиться вверху ценника
    //
    // Возвращаемое значение:
    //  Нет.
    //
    // Описание:
    //  Формирует таблицу с ценниками.
    //
    Процедура Сформировать(ТаблицаТоваров,ПечФирма)
    //  Создание Таблицы для выходного отчета
    Таб = СоздатьОбъект("Таблица");
    Таб.ИсходнаяТаблица("Таблица");
    
    Столбик = 1;
    Ряд	 = 0;
    ТаблицаТоваров.ВыбратьСтроки();
    Пока ТаблицаТоваров.ПолучитьСтроку() = 1 Цикл  
    Если ПроверитьШтрихкод(ТаблицаТоваров.Товар.БазоваяЕдиница.ШтрихКод) = 0 Тогда
    Сообщить("У товара """ + ТаблицаТоваров.Товар + """ штрихкод не задан или имеет неверный формат!");
    Иначе
    ПечРозн    = глФРМ(ТаблицаТоваров.Цена, ТаблицаТоваров.Валюта);
    ПечНаименование = ТаблицаТоваров.Товар;
    ДобавитьЦенник(Таб, ПечФирма, ТаблицаТоваров.Товар, ТаблицаТоваров.Единица, ПечРозн, Столбик, Ряд);
    глОживить(1);
    КонецЕсли;
    КонецЦикла;
    
    //Вызов выходного отчета в окно просмотра и редактирования.
    Таб.Опции(0,0,0,0,"ПечатьЦенников","ПечатьЦенников");
    Таб.ТолькоПросмотр(1);
    Таб.Показать("Товарные ценники","");
    
    КонецПроцедуры
    //******************************************************************************
    // Предопределенная процедура
    //
    Процедура ПриОткрытии()
    
    СтатусВозврата(0);
    ДанныеДляПечати = Форма.Параметр;
    
    Если ТипЗначенияСтр(ДанныеДляПечати) <> "СписокЗначений" Тогда
    Возврат;
    КонецЕсли;
    
    ПечФирма	   = ДанныеДляПечати.Получить("Фирма");
    ТаблицаТоваров = ДанныеДляПечати.Получить("Таблица");
    
    ///*------------------*--------------------*-----------*------------*----------------*------------------*
    
    Попытка
    КомпонентABC = СоздатьОбъект("BARCODE.BarcodeCtrl.1");
    Исключение
    Предупреждение("Компонент ActiveBarcode не установлен на данном компьютере!" +
    РазделительСтрок +
    "Порядок установки компоненты ActiveBarcode описан в документации.");
    Возврат;
    КонецПопытки; 
    Сформировать(ТаблицаТоваров, ПечФирма);	 
    КонецПроцедуры // ПриОткрытии()

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

    Вложения:

  20. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Да. От типового механизма не осталось и следа...
    Небольшое дополнение: а вдруг у вас будут 2 одинаковые позиции ТМЦ? Будет лишний ценник! Добавьте свернуть по товару/цене ТЗ перед вызовом печати ценников

Поделиться этой страницей