Имя: Пароль:
1C
1С v8
Программно записать реквизиты в справочник из обрабогтки
0 modoll
 
13.06.16
13:38
Здравствуйте, помогите решить вот такую проблему: в справочнике "Номенклатура" необходимо заполнить реквизит Бренд (он уже создан) из обработки. Данные в обработку добавляются из Excel.

Заранее спасибо!




Процедура ЗагрузитьБрэнд()
    
    Для Каждого Элемент Из Товары Цикл
        СпрНом = Справочники.Номенклатура;
        Условие = НоменклатураПоКоду(СокрЛП(Элемент.Штрихкод));
           Если(Условие = Неопределено) Тогда
            Сообщить("Не найдена номенклатура с кодом: " + Элемент.Штрихкод,СтатусСообщения.ОченьВажное);
        Иначе    
            НоменкОбъект = Условие.ПолучитьОбъект();
            
            НоменкОбъект.Брэнд = Товары.Брэнд;
            Попытка
                НоменкОбъект.Записать();
            Исключение
                Сообщить(ОписаниеОшибки());
            КонецПопытки;
        КонецЕсли;    
    КонецЦикла;
    
    Попытка
        Обработка = Обработки.РегламентныеЗагрузкаНоменклатуры.Создать();
        Обработка.ОчиститьУзлыНоменклатуры();
    Исключение
    КонецПопытки;
    
    Предупреждение("Загружено");
    
Конецпроцедуры

Функция НоменклатураПоКоду(Код)
    Попытка
    Номенклатура = НайтиНоменклатуруПоPLU(Число(Код));
Исключение
    КонецПопытки;
    Если Номенклатура = Неопределено Тогда
        Номенклатура = НайтиНоменклатуруПоШК(СтрЗаменить(Код," ",""));
    КонецЕсли;
    
    Возврат Номенклатура;
    
КонецФункции

Функция НайтиНоменклатуруПоPLU(КодPLU)
    
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
                   |    КодыТоваровPLU.Номенклатура
                   |ИЗ
                   |    РегистрСведений.КодыТоваровPLU КАК КодыТоваровPLU
                   |ГДЕ
                   |    КодыТоваровPLU.Код = &Код";
    Запрос.УстановитьПараметр("Код",КодPLU);
                              
    Выборка = Запрос.Выполнить().Выбрать();
    Если Выборка.Следующий() Тогда        
        Возврат Выборка.Номенклатура.Ссылка;
    КонецЕсли;
    
    Возврат Неопределено;
    
КонецФункции

Функция НайтиНоменклатуруПоШК(Код)
    
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
                   |    Штрихкоды.Владелец КАК Номенклатура
                   |ИЗ
                   |    РегистрСведений.Штрихкоды КАК Штрихкоды
                   |ГДЕ
                   |    Штрихкоды.Штрихкод = &Код";
    Запрос.УстановитьПараметр("Код",Код);
                              
    Выборка = Запрос.Выполнить().Выбрать();
    Если Выборка.Следующий() Тогда        
        Возврат Выборка.Номенклатура.Ссылка;
    КонецЕсли;
    
    Возврат Неопределено;
    
КонецФункции
1 Лефмихалыч
 
13.06.16
13:46
запросы в цикле - это хуже некуда. Одним запросом получай все, что надо обрабатывать.

А записать - проще некуда:

НоменклатураОбъект = Выборка.СсылкаНаНоменклатуру.ПолучитьОбъект();
НоменклатураОбъект.Реквизит = Значение;
НоменклатураОбхект.Записать();
2 modoll
 
13.06.16
13:52
Лефмихалыч, извините, я только учусь!!!
3 Лефмихалыч
 
13.06.16
13:59
(2) да мне-то что? Это ж у тебя оно будет тормозить и глючить, а не у меня
4 modoll
 
13.06.16
14:29
а вот как-то так..... тоже не в правильном направлении иду???


Процедура ЗагрузитьБрэнд()
      Запрос = Новый Запрос;
      Запрос.УстановитьПараметр("Брэнд",Товары.Брэнд.Выгрузить());
      Запрос.Текст = "ВЫБРАТЬ
                     |    Номенклатура.Ссылка
                     |ИЗ
                     |    Справочник.Номенклатура КАК Номенклатура
                     |ГДЕ
                     |    Номенклатура.Брэнд = &Брэнд";
      Результат = Запрос.Выполнить();
      Если Результат.Пустой() Тогда
      Сообщить("Не найдена номенклатура с кодом: " + + ОписаниеОшибки());
    Иначе
      Выборка = Результат.Выбрать();
      НомОбъект = Выборка.Ссылка.ПолучитьОбъект();
      НомОбъект.Брэнд = "Новое наименование";
        Попытка
            НомОбъект.Записать();
            Исключение
            Сообщить("Не записывается, ругается на: " + ОписаниеОшибки());
        КонецПопытки;
        
    КонецЕсли;
Конецпроцедуры
5 hhhh
 
13.06.16
16:16
(4) Товары.Брэнд.Выгрузить() это у тебя таблица.

Номенклатура.Брэнд - это просто поле.

Думаешь в нашей вселенной когда нибудь будет

Номенклатура.Брэнд = &Брэнд  ???

Таблица равна полю?
6 modoll
 
13.06.16
16:28
Вот я ......., буду исправлять, hhhhh
7 modoll
 
14.06.16
08:51
Товары.Брэнд.Выгрузить() - это
                       Товары - это ТЧ
                       Брэнд - это поле в ТЧ Товары

Номенклатура.Брэнд - это Поле Брэнд в справочнике Номенклатура
8 modoll
 
14.06.16
12:45
Я уже и так пробую:





Процедура ЗагрузитьБрэнд()
    
    Для Каждого Элемент Из Товары Цикл
        
    НоменлСсылка = НоменклатураПоКоду(СокрЛП(Элемент.Штрихкод));
        Если(НоменлСсылка = Неопределено) Тогда
            Сообщить("Не найдена номенклатура с кодом: " + Элемент.Штрихкод,СтатусСообщения.ОченьВажное);
        Иначе    
            НоменлОбъект = НоменлСсылка.ПолучитьОбъект();
            
            
                Если ЗначениеЗаполнено(Элемент.Брэнд)  Тогда
                     НоменлОбъект = Элемент.Брэнд;
                Иначе    
                     НоменлОбъект = "пусто";
                КонецЕсли;
    
                
                Попытка
                    НоменлОбъект.Записать();
                Исключение
                       Сообщить(ОписаниеОшибки());
                КонецПопытки;
                
        КонецЕсли;    
    КонецЦикла;
    
        Попытка
            Обработка = Обработки.РегламентныеЗагрузкаНоменклатуры.Создать();
            Обработка.ОчиститьУзлыНоменклатуры();
        Исключение
        КонецПопытки;
    
    Предупреждение("Загружено");
Конецпроцедуры
9 hhhh
 
14.06.16
12:52
(8) смотри (1)
10 Мимохожий Однако
 
14.06.16
12:54
Отладчиком пройдись