[РЕШЕНО] Дополнительные реквизиты номенклатуры

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

  1. TopicStarter Overlay
    SkyNetYar
    Offline

    SkyNetYar Опытный в 1С

    Регистрация:
    11 ноя 2014
    Сообщения:
    146
    Симпатии:
    0
    Баллы:
    26
    Добрый день!
    УТ 11.1.10
    Пытаюсь обработкой добавить дополнительный реквизит Номенклатуры,но не выходит,получается только если дополнительное значение имеет строковый тип,а если элемент справочника то не получается..
    Замысел скопировать наименование номенклатуры в дополнительный реквизит Номенклатуры Номенклатура поставщика ,если его тип элемент справочника "дополнительное значение"
    Код:
    НаименованиеСвойства = "Номенклатура поставщика";
    НаименованиеРеквизита = "Наименование";
    
    СсылкаНаНабор = Справочники.НаборыДополнительныхРеквизитовИСведений.Справочник_Номенклатура_Общие;
    
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
                   |    НаборыДополнительныхРеквизитов.Свойство
                   |ИЗ
                   |    Справочник.НаборыДополнительныхРеквизитовИСведений.ДополнительныеРеквизиты КАК НаборыДополнительныхРеквизитов
                   |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения КАК ДополнительныеРеквизитыИСведения
                   |        ПО НаборыДополнительныхРеквизитов.Свойство = ДополнительныеРеквизитыИСведения.Ссылка
                   |ГДЕ
                   |    ДополнительныеРеквизитыИСведения.Наименование ПОДОБНО &НаименованиеСвойства
                   |    И НаборыДополнительныхРеквизитов.Ссылка = &СсылкаНаНабор";
    Запрос.УстановитьПараметр("НаименованиеСвойства", НаименованиеСвойства + "%");
    Запрос.УстановитьПараметр("СсылкаНаНабор", СсылкаНаНабор);
    
    Выборка = Запрос.Выполнить().Выбрать();
    Если Выборка.Следующий() Тогда
        Свойство = Выборка.Свойство;
        НайденнаяСтрока = Объект.ДополнительныеРеквизиты.Найти(Свойство, "Свойство");
        //НаименованиеСвойства.ПолучитьОбъект();
        Если НайденнаяСтрока = Неопределено Тогда
            НайденнаяСтрока = Объект.ДополнительныеРеквизиты.Добавить();
        КонецЕсли;    
        НайденнаяСтрока.Свойство = Свойство;
        НайденнаяСтрока.Значение = Объект[НаименованиеРеквизита];
        Объект.Записать();
    КонецЕсли;
    Знаю что нужно сперва получить объект,но что то недопераю как...
    Подскажите пожалуйста.
  2. nickpugachev
    Offline

    nickpugachev Профессионал в 1С Команда форума

    Регистрация:
    28 май 2012
    Сообщения:
    3.266
    Симпатии:
    131
    Баллы:
    104
    Вопрос номер раз: нафига велосипед изобретать, если есть целый справочник для номенклатуры поставщиков?
    Вопрос номер два: какую ошибку выдает? если не выдает ошибку, то тип значения, записываемого в доп. реквизит совпадает с типом этого реквизита? если совпадает - посмотрите отладчиком что вы туда записать пытаетесь.
  3. TopicStarter Overlay
    SkyNetYar
    Offline

    SkyNetYar Опытный в 1С

    Регистрация:
    11 ноя 2014
    Сообщения:
    146
    Симпатии:
    0
    Баллы:
    26
    Номенклатура поставщика нам не подходит,она привязывается к поставщику и цены надо устанавливать отдельно..
    Эта обработка нужна для того что бы выполнить Импорт из EXEL с нужным мне типом,но я уже решил доп реквизит оставить текстовым полем..
    Выше приведенный код не целый,до этого еще производится отбор который тут не приведен.

    Можете ли Вы мне помочь изменить поиск в этом коде,сейчас товар ищется по Номенклатурв.Наименование а мне нужно по Доп.реквизиту номенклатуры "Номенклатура поставщика"
    Код:
    &НаСервере
    Функция ПолучитьНоменклатуру( мЗначения, фСоздаватьНовые = Истина )
       
        Запрос = Новый Запрос;
       
        Если мЗначения.Свойство("ШтрихКод") Тогда
            Запрос.Текст = Запрос.Текст + "
            |ВЫБРАТЬ
            |    1 КАК ПорядокВывода,
            |    Штрихкоды.Номенклатура КАК Ссылка,
            |    Штрихкоды.Номенклатура.Артикул как Артикул
            |ИЗ
            |    РегистрСведений.ШтрихкодыНоменклатуры КАК Штрихкоды
            |ГДЕ
            |    Штрихкоды.Штрихкод = &Штрихкод
            |    И Штрихкоды.Номенклатура Ссылка Справочник.Номенклатура
            |
            |ОБЪЕДИНИТЬ ВСЕ
            |";
            Запрос.УстановитьПараметр("ШтрихКод", мЗначения.ШтрихКод);
        КонецЕсли;   
       
        Если мЗначения.Свойство("Артикул") Тогда
            мЗначения.Артикул = Формат(мЗначения.Артикул, "ЧГ=0");
            Запрос.Текст = Запрос.Текст + "
            |ВЫБРАТЬ
            |    2 КАК ПорядокВывода,
            |    Номенклатура.Ссылка,
            |    Номенклатура.Артикул
            |ИЗ
            |    Справочник.Номенклатура КАК Номенклатура
            |ГДЕ
            |    Номенклатура.Наименование = &НаименованиеТочно
            |    И Номенклатура.Артикул = &Артикул
            |    И Номенклатура.ЭтоГруппа = Ложь
            |
            |ОБЪЕДИНИТЬ ВСЕ
            |
            |ВЫБРАТЬ
            |    3,
            |    Номенклатура.Ссылка,
            |    Номенклатура.Артикул
            |ИЗ
            |    Справочник.Номенклатура КАК Номенклатура
            |ГДЕ
            |    Номенклатура.Артикул = &Артикул
            |    И Номенклатура.ЭтоГруппа = Ложь
            |
            |ОБЪЕДИНИТЬ ВСЕ
            |";
            Запрос.УстановитьПараметр("Артикул", мЗначения.Артикул);
        КонецЕсли;   
       
        Запрос.Текст = Запрос.Текст + "
        |ВЫБРАТЬ
        |    4,
        |    Номенклатура.Ссылка,
        |    Номенклатура.Артикул
        |ИЗ
        |    Справочник.Номенклатура КАК Номенклатура
        |ГДЕ
        |    Номенклатура.Наименование = &НаименованиеТочно
        |    И Номенклатура.ЭтоГруппа = Ложь";
        //|
        //|ОБЪЕДИНИТЬ ВСЕ
        //|
        //|ВЫБРАТЬ
        //|    5,
        //|    НоменклатураПоставщиков.Номенклатура,
        //|    НоменклатураПоставщиков.Номенклатура.Артикул
        //|ИЗ
        //|    Справочник.НоменклатураПоставщиков КАК НоменклатураПоставщиков
        //|ГДЕ
        //|    Номенклатура.Наименование = &НаименованиеТочно
        //|    И Номенклатура.ЭтоГруппа = Ложь";
        //////////////////////////////////////////////////////////////////////   
        Запрос.УстановитьПараметр("НаименованиеТочно", мЗначения.Наименование);
        Запрос.УстановитьПараметр("НаименованиеПодобно", Строка(мЗначения.Наименование)+"%");
        Запрос.УстановитьПараметр("НаименованиеПриблизительно", "%"+Строка(мЗначения.Наименование)+"%");
    
        Результат = Запрос.Выполнить().Выбрать();
       
        Если Результат.Следующий() Тогда
           
            //ШтрихКод может другой передаваться - его записываем в карточку
            Если мЗначения.Свойство("ШтрихКод") Тогда
                Если мЗначения.ШтрихКод <> "" Тогда
                    Набор = РегистрыСведений.ШтрихкодыНоменклатуры.СоздатьНаборЗаписей();
                    Набор.Отбор.Штрихкод.Установить(мЗначения.ШтрихКод);
                    //
                    НовыйШК = Набор.Добавить();
                    НовыйШК.Штрихкод = мЗначения.ШтрихКод;
                    НовыйШК.Номенклатура = Результат.Ссылка;
                    НовыйШК.ТипШтрихкода = ПланыВидовХарактеристик.ТипыШтрихкодов.EAN13;
                    Набор.Записать();
                КонецЕсли;   
            КонецЕсли;   
           
            Для Каждого Свойство из мЗначения Цикл
                //Доп реквизиты
                //Сообщить(мДопРеквизиты.НайтиПоЗначению(Свойство.Ключ)<> Неопределено);
                СтрокиДоп = мДопРеквизиты.НайтиСтроки(Новый Структура("ПредставлениеБезНедСимволов",Свойство.Ключ));
           
    
                Если СтрокиДоп.Количество() > 0 Тогда
                   
                    СтрокаДопРеквизита = СтрокиДоп.Получить(0);
                   
                    Отбор = Новый Структура;
                    Отбор.Вставить("Свойство", СтрокаДопРеквизита.Ссылка);
                    РеквизитОбъекта = Результат.Ссылка.ДополнительныеРеквизиты.НайтиСтроки(Отбор);
                   
                       
                Если Перезаписывать = Истина Тогда    //Если флажок то перезаписываем доп значения без условий. //+
                    НоменклатураОбъект = Результат.Ссылка.ПолучитьОбъект();  //+
                    ДобавитьРеквизит(НоменклатураОбъект, СтрокаДопРеквизита.Ссылка, Свойство.Значение); //+
                   НоменклатураОбъект.Записать();                           //+
                Иначе    
                    Если РеквизитОбъекта.Количество() = 0 Тогда  //Записываем только если пустой доп реквизит.
                       
                            НоменклатураОбъект = Результат.Ссылка.ПолучитьОбъект();
                            ДобавитьРеквизит(НоменклатураОбъект, СтрокаДопРеквизита.Ссылка, Свойство.Значение);
                            НоменклатураОбъект.Записать();
                       
                    КонецЕсли;   
                КонецЕсли;
                КонецЕсли;   
                   
                //-Доп реквизиты
            КонецЦикла;
           
            Возврат Результат.Ссылка;
           
        ИначеЕсли фСоздаватьНовые Тогда
           
            фУслуга = Ложь;
            Если мЗначения.Свойство("Группа") Тогда
                фУслуга = ?(Сред(мЗначения.Группа, 1, 2)="У ", Истина, Ложь);
            КонецЕсли;   
           
            ТекОбъект = Справочники.Номенклатура.СоздатьЭлемент();
            Для Каждого Свойство из мЗначения Цикл
                Если ТекОбъект.Метаданные().Реквизиты.Найти(Свойство.Ключ) <> Неопределено Тогда
                    ТекОбъект[Свойство.Ключ] = Свойство.Значение;
                КонецЕсли;   
               
                //Доп реквизиты
                //Сообщить(мДопРеквизиты.НайтиПоЗначению(Свойство.Ключ)<> Неопределено);
                СтрокиДоп = мДопРеквизиты.НайтиСтроки(Новый Структура("ПредставлениеБезНедСимволов",Свойство.Ключ));
                Если СтрокиДоп.Количество() > 0 Тогда
                   
                    СтрокаДопРеквизита = СтрокиДоп.Получить(0);
                        //пИмяСвойства = СтрЗаменить(Строка(Свойство.Ключ), "_", " ");
                        //пИмяСвойства = ЗаменитьНедопустимыеСимволыВИмениФайла(Строка(Свойство.Ключ),"_");
                        ДобавитьРеквизит(ТекОбъект, СтрокаДопРеквизита.Ссылка, Свойство.Значение);
                    КонецЕсли;   
                //-Доп реквизиты
               
            КонецЦикла;   
           
            Если мЗначения.Свойство("Артикул") Тогда
                ТекОбъект.Артикул = мЗначения.Артикул;
            Иначе
                ТекОбъект.Артикул = z_ОбщийМодуль.ПолучитьНовыйАртикул();
            КонецЕсли;   
               
            ТекОбъект.Наименование = мЗначения.Наименование;
            ТекОбъект.НаименованиеПолное = мЗначения.Наименование;
            ТекОбъект.ВидНоменклатуры = ?(фУслуга, Справочники.ВидыНоменклатуры.НайтиПоНаименованию("Услуга"), Справочники.ВидыНоменклатуры.НайтиПоНаименованию("Товар"));
            ТекОбъект.ТипНоменклатуры = ?(фУслуга, Перечисления.ТипыНоменклатуры.Услуга, Перечисления.ТипыНоменклатуры.Товар);
            ТекОбъект.ВариантОформленияПродажи = Перечисления.ВариантыОформленияПродажи.РеализацияТоваровУслуг;
            //ТекОбъект.ИспользованиеХарактеристик = Перечисления.ВариантыИспользованияХарактеристикНоменклатуры.ОбщиеДляВидаНоменклатуры;
            ТекОбъект.ИспользованиеХарактеристик = Перечисления.ВариантыИспользованияХарактеристикНоменклатуры.НеИспользовать;
            ТекОбъект.ИспользоватьУпаковки = Ложь;
            ТекОбъект.КодДляПоиска = ТекОбъект.Артикул;
            ТекОбъект.ВидНоменклатуры = Справочники.ВидыНоменклатуры.НайтиПоНаименованию("Товар");
            ТекОбъект.СтавкаНДС = Перечисления.СтавкиНДС.БезНДС;
            ТекОбъект.ЕдиницаИзмерения = Справочники.ЕдиницыИзмерения.НайтиПоНаименованию("шт");
           
            Если мЗначения.Свойство("Производитель") Тогда
                ТекОбъект.Производитель = ПолучитьПроизводителя(мЗначения.Производитель);
            КонецЕсли;   
           
            Если мЗначения.Свойство("Группа") Тогда
                Запрос = Новый Запрос;
                Запрос.Текст = 
                "ВЫБРАТЬ
                |    Номенклатура.Ссылка
                |ИЗ
                |    Справочник.Номенклатура КАК Номенклатура
                |ГДЕ
                |    Номенклатура.Наименование = &Наименование
                |    И Номенклатура.ЭтоГруппа = Истина";
                Запрос.УстановитьПараметр("Наименование", мЗначения.Группа);
                РезультатЗапроса = Запрос.Выполнить();
                ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
                Если ВыборкаДетальныеЗаписи.Следующий() Тогда
                    ТекОбъект.Родитель = ВыборкаДетальныеЗаписи.Ссылка;   
                Иначе   
                    оРодитель = Справочники.Номенклатура.СоздатьГруппу();
                    оРодитель.Наименование = мЗначения.Группа;
                    Попытка
                        оРодитель.Записать();
                        ТекОбъект.Родитель = оРодитель.Ссылка;   
                    Исключение
                    КонецПопытки;
                КонецЕсли;
            КонецЕсли;
    
            фЗаписан = Ложь;
            //Записываем для использования в дальнейшем как владельца
            Попытка
                ТекОбъект.Записать();
                фЗаписан = Истина;
            Исключение
                ТекОбъект.Наименование = ТекОбъект.Наименование + " ("+ТекОбъект.Артикул+")";
                ТекОбъект.НаименованиеПолное = ТекОбъект.Наименование + " ("+ТекОбъект.Артикул+")";
                Попытка
                    ТекОбъект.Записать();
                    фЗаписан = Истина;
                Исключение
                    Сообщить("Наименование " + ТекОбъект.Наименование + " не уникально !!!");
                КонецПопытки;
            КонецПопытки;
           
            Если фЗаписан Тогда
                //Штрих-коды !!!
                    пКод = ТекОбъект.Артикул;
                    Попытка
                        пКод = Число(пКод);
                    Исключение
                        пКод = 0;
                    КонецПопытки;
                    Если пКод <> 0 Тогда
                        НовыйШтрихкод = РегистрыСведений.ШтрихкодыНоменклатуры.СоздатьМенеджерЗаписи();
                        НовыйШтрихкод.Номенклатура = ТекОбъект.Ссылка; 
                        пШтрихкод = "2"+Формат(пКод, "ЧЦ=11; ЧВН=; ЧГ=");
                        НовыйШтрихкод.Штрихкод = пШтрихкод+РегистрыСведений.ШтрихкодыНоменклатуры.КонтрольныйСимволEAN(пШтрихкод, 13);
                        //НовыйШтрихкод.ТипШтрихкода = ПланыВидовХарактеристик.ТипыШтрихкодов.EAN13;
                        НовыйШтрихкод.Записать();
                    КонецЕсли;
                   
                    Если мЗначения.Свойство("ШтрихКод") Тогда
                        Если мЗначения.ШтрихКод <> "" Тогда
                            Набор = РегистрыСведений.ШтрихкодыНоменклатуры.СоздатьНаборЗаписей();
                            Набор.Отбор.Штрихкод.Установить(мЗначения.ШтрихКод);
                            //
                            НовыйШК = Набор.Добавить();
                            НовыйШК.Штрихкод = мЗначения.ШтрихКод;
                            НовыйШК.Номенклатура = ТекОбъект.Ссылка;
                            //НовыйШК.ТипШтрихкода = ПланыВидовХарактеристик.ТипыШтрихкодов.EAN13;
                            Набор.Записать();
                        КонецЕсли;   
                    КонецЕсли;   
                //-Штрих-коды
               
                Возврат ТекОбъект.Ссылка;   
            Иначе
               
                Возврат Справочники.Номенклатура.ПустаяСсылка();
               
            КонецЕсли;
           
        КонецЕсли;
       
        Возврат Неопределено;
    
    КонецФункции
  4. LordMaverick
    Offline

    LordMaverick Профессионал в 1С

    Регистрация:
    17 мар 2014
    Сообщения:
    3.443
    Симпатии:
    376
    Баллы:
    104
    ну так оно для аналитики и выборе поставщика фигурирует
    и цены оно вроде подставляет при поступлении от данного поставщика

    вы вообще что хотите от справочника номенклатуры поставщика?
  5. TopicStarter Overlay
    SkyNetYar
    Offline

    SkyNetYar Опытный в 1С

    Регистрация:
    11 ноя 2014
    Сообщения:
    146
    Симпатии:
    0
    Баллы:
    26
    От справочника "Номенклатура поставщика " ничего не хочу,он не используется, у Номенклатуры создан дополнительный реквизит с типом строка ,назван "Номенклатура поставщика"
    Вот по этому полю в обработке я и хочу искать совпадения а не в Номенклатура.Ноименование как сейчас.
  6. LordMaverick
    Offline

    LordMaverick Профессионал в 1С

    Регистрация:
    17 мар 2014
    Сообщения:
    3.443
    Симпатии:
    376
    Баллы:
    104
    вообще-то справочник номенклатуры поставщиков и справочник номенклатуры и так уже сопоставлены в соответствие
    upload_2015-12-1_9-23-47.png
    upload_2015-12-1_9-28-24.png
  7. TopicStarter Overlay
    SkyNetYar
    Offline

    SkyNetYar Опытный в 1С

    Регистрация:
    11 ноя 2014
    Сообщения:
    146
    Симпатии:
    0
    Баллы:
    26
    Это придется всю обработку переписывать,отбирать поставщика и.т.д...
    Мне нужно всего то осуществить поиск по доп.реквизиту номенклатуры которое уже скопировано..
    Это вот в этом запросе
    Код:
    Запрос.Текст = Запрос.Текст + "
    |ВЫБРАТЬ
    | 4,
    | Номенклатура.Ссылка,
    | Номенклатура.Артикул
    |ИЗ
    | Справочник.Номенклатура КАК Номенклатура
    |ГДЕ
    | Номенклатура.Наименование = &НаименованиеТочно
    | И Номенклатура.ЭтоГруппа = Ложь";
    //////////////////////////////////////////////////////////////////////
    Запрос.УстановитьПараметр("НаименованиеТочно", мЗначения.Наименование);
    Нужно выбрать тут это дополнительное значение и установить ему параметр "НаименованиеТочно" ,но я что то не допираю где оно хранится?!?!
  8. nickpugachev
    Offline

    nickpugachev Профессионал в 1С Команда форума

    Регистрация:
    28 май 2012
    Сообщения:
    3.266
    Симпатии:
    131
    Баллы:
    104
    в табличной части ДополнительныеРеквизиты справочника Номенклатура
    должно быть что-то типа
    Код:
    ВЫБРАТЬ
      таб.Ссылка,
      таб.Ссылка.Артикул КАК Артикул
    ИЗ
      Справочник.Номенклатура.ДополнительныеРеквизиты КАК таб
    ГДЕ
      таб.Значение=&НаименованиеТочно
      И таб.Свойство=&Свойство
      И НЕ таб.Ссылка.ЭтоГруппа
    В параметр Свойство надо ссылку на элемент плана видов характеристик ДополнительныеРеквизитыИСведения передать
    SkyNetYar нравится это.
  9. TopicStarter Overlay
    SkyNetYar
    Offline

    SkyNetYar Опытный в 1С

    Регистрация:
    11 ноя 2014
    Сообщения:
    146
    Симпатии:
    0
    Баллы:
    26
    Простите только учусь,не подтолкнете на мысль как и где это сделать?
    Консоль запросов не выбирает ничего =(

    Вложения:

  10. TopicStarter Overlay
    SkyNetYar
    Offline

    SkyNetYar Опытный в 1С

    Регистрация:
    11 ноя 2014
    Сообщения:
    146
    Симпатии:
    0
    Баллы:
    26
    Код:
       
     Запрос.Текст = Запрос.Текст + "
         |ВЫБРАТЬ
      |таб.Ссылка,
      |таб.Ссылка.Артикул КАК Артикул
    |ИЗ
      |Справочник.Номенклатура.ДополнительныеРеквизиты КАК таб
    |ГДЕ
      |таб.Значение=&НаименованиеТочно
      |И таб.Свойство=&Свойство
      |И НЕ таб.Ссылка.ЭтоГруппа";
      Запрос.УстановитьПараметр("Свойство" , ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Номенклатура поставщика"));
    УРА!
    Вот так работает! Безграничное Вам спасибо!!!

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