8.х обработка заполнения реквизитов номенклатуры

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем atm779, 24 май 2010.

  1. TopicStarter Overlay
    atm779
    Offline

    atm779 Опытный в 1С

    Регистрация:
    19 авг 2009
    Сообщения:
    133
    Симпатии:
    0
    Баллы:
    26
    Помогите пожалуйста с обработкой. Пишу обработку, которая пробежит по всему справочнику Номенклатуры и автоматически присвоит штрих-код каждой позиции номенклатуры. Не могу найтики, как программно генерировать и присваивать ШК EAN13.

    Код:
    текНом = Справочники.Номенклатура.НайтиПоКоду("00000000309"	);
    текНомОб = текНом.ПолучитьОбъект();
    
    
    Дальше хочется написать чтото вроде:
    Код:
    новШк = Справочники.Штрихкоды.СоздатьНовый();
    текНомОб.ДобавитьНовыйШк(новШк);
    текНомОб.Записать();
    
    
    (простите за мое художественное сочинение)

    Не нашел, где в 1С храняться ШК и как ими манипулировать.

    Еще хочется знать, можно ли заставить 1С при создании новой Номенклатуры(не весовой) автоматически присваиваивать ШК.
  2. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Эм.. чет не совсем понял.. Штрих-код номенклатуре ведь присваивается не просто так, а организацией (Юнискан что-ли). Где должен быть зарегистрирован префикс вашего предприятия, это и будет начальными цифрами штрих-кода. Далее идет уже порядковый номер позиции, последнее число - контрольная цифра.
  3. TopicStarter Overlay
    atm779
    Offline

    atm779 Опытный в 1С

    Регистрация:
    19 авг 2009
    Сообщения:
    133
    Симпатии:
    0
    Баллы:
    26
    В 1С УТ на карточке товара есть вкладка Штрикходы, на которой есть кнопка "Новый штрихкод". Хочется выполнять эти действаия автоматически.

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

    В нашей ситуации ШК - это ключ, по которому сопоставляется товар с ценой. Он нужен лишь чтобы быстро выбивать чеки на кассе.
  4. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Внутренее штрих-кодирование согласен, понятно. У вас при нажатии на эту кнопку вызывается процедура "НовыйШтрихкод()", просмотрите ее, и с небольшими изменениями поместите скажем в процедуру "ПослеЗаписи()" формы документа. А в чем конкретно проблема?
  5. Stack_G
    Offline

    Stack_G Опытный в 1С

    Регистрация:
    10 дек 2007
    Сообщения:
    786
    Симпатии:
    2
    Баллы:
    26
    Хранятся в регистре сведений "Штрихкоды", с ним и работаем, в карточке товара лишь отражаются ШК из этого регистра для текушего элемента Номенклатуры.
  6. TopicStarter Overlay
    atm779
    Offline

    atm779 Опытный в 1С

    Регистрация:
    19 авг 2009
    Сообщения:
    133
    Симпатии:
    0
    Баллы:
    26
    Всем спасибо за помощь.
    Вот такая обработка получилась. Может пригодится кому.

    Код:
     
    Функция владелецИмеетШк(обс)
    Запрос = Новый Запрос("
    |ВЫБРАТЬ ПЕРВЫЕ 1
    |    РегШтрихкоды.Владелец КАК Владелец,
    |    РегШтрихкоды.ШтрихКод КАК Штрихкод
    |ИЗ
    |    РегистрСведений.Штрихкоды КАК РегШтрихкоды
    |ГДЕ
    |    РегШтрихкоды.Владелец = &Владелец
    |");
    Запрос.УстановитьПараметр("Владелец", обс);
    РезультатЗапроса = Запрос.Выполнить();
    Если РезультатЗапроса.Пустой() Тогда
    Возврат Ложь;
    Иначе
    Возврат Истина;
    КонецЕсли;
    
    КонецФункции
    
    Процедура ПрисвоитьШкДляОб(обс)	
    об = обс.ПолучитьОбъект();
    Если владелецИмеетШк(обс) Тогда
    Сообщить(об.Наименование+" уже имеет шк ");
    Возврат;
    КонецЕсли;
    новШк = РегистрыСведений.Штрихкоды.СоздатьМенеджерЗаписи();
    новШк.Владелец         = обс;
    новШк.ЕдиницаИзмерения = об.ЕдиницаХраненияОстатков;
    новШк.ТипШтрихкода     = ПланыВидовХарактеристик.ТипыШтрихкодов.EAN13;
    новШк.Качество         = Справочники.Качество.Новый;
    новШк.Штрихкод         = РаботаСТорговымОборудованием.СформироватьШтрихКод();
    Попытка
    новШк.Записать();
    Сообщить("для "+об.ПолноеНаименование()+" присвоен шк "+новШк.Штрихкод)
    Исключение
    КонецПопытки;
    КонецПроцедуры
    
    Процедура КнопкаВыполнитьНажатие(Кнопка)
    
    //текНомКод = "00000000117";
    //текНом = Справочники.Номенклатура.НайтиПоКоду(текНомКод);
    //текНомОб = текНом.ПолучитьОбъект();
    //ПрисвоитьШкДляОб(текНомОб);
    
    текНом = Справочники.Номенклатура.Выбрать();
    Пока текНом.Следующий() Цикл
    тно = текНом.ПолучитьОбъект();
    ПрисвоитьШкДляОб(тно.Ссылка);
    КонецЦикла;
    
    
    
    КонецПроцедуры
    
    
    
  7. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Пару комментариев, на работу не должно влиять, но все-таки, лучше переписать так:
    Код:
    Функция владелецИмеетШк(обс)
    Запрос = Новый Запрос("
    |ВЫБРАТЬ ПЕРВЫЕ 1
    |    РегШтрихкоды.ШтрихКод КАК Штрихкод
    |ИЗ
    |    РегистрСведений.Штрихкоды КАК РегШтрихкоды
    |ГДЕ
    |    РегШтрихкоды.Владелец = &Владелец
    |    И РегШтрихкоды.ТипШтрихкода = ЗНАЧЕНИЕ(ПланыВидовХарактеристик.ТипыШтрихкодов.EAN13)
    |    И (НЕ РегШтрихкоды.ШтрихКод ЕСТЬ NULL)
    |");
    Запрос.УстановитьПараметр("Владелец", обс);
    РезультатЗапроса = Запрос.Выполнить();
    Возврат НЕ РезультатЗапроса.Пустой();
    КонецФункции
    
    
    Писал прям здесь, надо бы проверить в конструкторе, но смысл думаю понятен: у вас может быть запись в регистре сведений, но надо еще и проверять чтобы тип штрихкода был нужный вам + чтобы он был заполнен.

    и добавить часть кода сюда:
    Код:
    	Попытка
    новШк.Записать();
    Сообщить("для "+об.ПолноеНаименование()+" присвоен шк "+новШк.Штрихкод)
    Исключение
    Сообщить(ОписаниеОшибки(), СтатусСообщения.Важное);
    КонецПопытки;
    
    
  8. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    О, и еще. До конца не досмотрел.
    вот это тоже перепишите:
    Код:
    Процедура КнопкаВыполнитьНажатие(Кнопка)
    текНом = Справочники.Номенклатура.Выбрать();
    Пока текНом.Следующий() Цикл
    ПрисвоитьШкДляОб(текНом);
    КонецЦикла;
    КонецПроцедуры
    
    
    Зачем вы сначала получаете объект из ссылки, потом сразу же снова ссылку на него?
  9. Burunduce
    Offline

    Burunduce

    Регистрация:
    27 сен 2012
    Сообщения:
    2
    Симпатии:
    0
    Баллы:
    1
    День добрый!
    Простите, если мои вопросы окажутся не по адресу:
    1. Можно ли описанную обработку использовать на платформе 8.2 в УТ11?
    2. Как ее подключить (достаточно ссылки, где почитать)?
  10. Dmitriy_76
    Offline

    Dmitriy_76 Опытный в 1С Команда форума

    Регистрация:
    26 мар 2011
    Сообщения:
    2.175
    Симпатии:
    13
    Баллы:
    29
    1) нет. она на 10.3. придется переписывать.
    2)Подключить во внешние обработки (только надо ли, она будет всего 1 раз использоваться, можно просто открыть через пункт открыть файл...).
  11. Burunduce
    Offline

    Burunduce

    Регистрация:
    27 сен 2012
    Сообщения:
    2
    Симпатии:
    0
    Баллы:
    1
    Спасибо... Переписывать я, видимо, пока не готов :(
  12. Silent45
    Offline

    Silent45

    Регистрация:
    13 фев 2013
    Сообщения:
    1
    Симпатии:
    0
    Баллы:
    1
    Может кому пригодится (сам пару дней в инете искал пример, т.к. не знаю синтаксис языка 1С, а результат(присвоить штрихкоды) нужен быстро)... синтаксис переделал под 8.2, спасибо автору поста.

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    //////////// Присвоение штрихкода
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////


    &НаСервере
    Функция владелецИмеетШк(обс)
    об = обс.ПолучитьОбъект();
    Запрос = Новый Запрос("
    |ВЫБРАТЬ ПЕРВЫЕ 1
    | РегШтрихкоды.ШтрихКод КАК Штрихкод
    |ИЗ
    | РегистрСведений.Штрихкоды КАК РегШтрихкоды
    |ГДЕ
    | РегШтрихкоды.Владелец = &Владелец
    // | И РегШтрихкоды.ТипШтрихкода = ЗНАЧЕНИЕ(ПланыВидовХарактеристик.ТипыШтрихкодов.EAN13)
    | И (НЕ РегШтрихкоды.ШтрихКод ЕСТЬ NULL)
    |");
    Запрос.УстановитьПараметр("Владелец",об.Ссылка);
    РезультатЗапроса = Запрос.Выполнить();
    Возврат НЕ РезультатЗапроса.Пустой();
    КонецФункции

    &НаСервереБезКонтекста
    Функция СформироватьШтрихкодEAN13()
    Возврат ПодключаемоеОборудованиеРТ.СформироватьШтрихкод();
    КонецФункции

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

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

    &НаСервере
    Процедура ВыбратьНоменклатуруИзСправочника()
    текНом = Справочники.Номенклатура.Выбрать();
    Пока текНом.Следующий() Цикл
    ПрисвоитьШкДляОб(текНом);
    КонецЦикла;
    КонецПроцедуры

    &НаКлиенте
    Процедура ПрисвоитьВыполнить(Кнопка)
    ВыбратьНоменклатуруИзСправочника();
    КонецПроцедуры
  13. admir
    Offline

    admir

    Регистрация:
    28 апр 2013
    Сообщения:
    1
    Симпатии:
    0
    Баллы:
    1
    Подскажите как запустить это все ?
    Я нуб еще в 1с.
    Создаю кнопку в форме, в модуле присваиваю кнопке действие ПрисвоитьВыполнить(Кнопка)

    при загрузке в клиенте этого файла выскакивает

    Код:
    {Форма.Форма.Форма(231,18)}: Процедура или функция с указанным именем не определена (СформироватьШтрихкодEAN13)
    новШк.Штрихкод = <<?>>СформироватьШтрихкодEAN13();
    
  14. Tiger86
    Offline

    Tiger86 Модераторы Команда форума Модератор

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    в посте перед вашим есть в коде данная функция. Посмотрите есть ли она у вас

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