Имя: Пароль:
1C
1С v8
УТ11. Программно изменить вид номенклатуры
0 kIR
 
18.06.13
16:07
Здрасьте.
Есть база с перенесенной номенклатурой. Вся номенклатура без видов.
Требуется:
для каждой позиции установить вид номенклатуры в зависимости от группы. ТОесть если группа 3го уровня,то вид - наименование группы 2го уровня, если 2го-то 2го,если 1го-то 1го.



Написал примерно вот что:

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

&НаСервере
Процедура СоздатьИустановитьВидыНомнклатуры()
   ЗапросНоменклатуры = Новый Запрос;
   ЗАпросНоменклатуры.Текст = "ВЫБРАТЬ
                              |    Номенклатура.Ссылка,
                              |    Номенклатура.Родитель,
                              |    Номенклатура.Родитель.Родитель,
                              |    Номенклатура.Родитель.Родитель.Родитель
                              |ИЗ
                              |    Справочник.Номенклатура КАК Номенклатура
                              |ГДЕ
                              |    Номенклатура.ЭтоГруппа = ЛОЖЬ";
   Выборка = ЗапросНоменклатуры.Выполнить().Выбрать();
   а = 0;
   Пока Выборка.Следующий() Цикл
       Если НЕ Выборка.Родитель= Неопределено Тогда
           Если Не Выборка.Родитель.Родитель = неопределено ТОгда
               Если Не Выборка.Родитель.Родитель.Родитель = неопределено ТОгда
                   ОбъектНоменклатуры = Выборка.ссылка.ПолучитьОбъект();
                   ОбъектНоменклатуры.ВидНоменклатуры = ПроверитьВидНоменклатуры(Выборка.РОдитель.Родитель);
                   ОбъектНоменклатуры.Записать();
               Иначе
                   ОбъектНоменклатуры = Выборка.ссылка.ПолучитьОбъект();
                   ОбъектНоменклатуры.ВидНоменклатуры = ПроверитьВидНоменклатуры(Выборка.РОдитель.Родитель);
                   ОбъектНоменклатуры.Записать();
               КонецЕсли;
               ОбъектНоменклатуры = Выборка.ссылка.ПолучитьОбъект();
               ОбъектНоменклатуры.ВидНоменклатуры = ПроверитьВидНоменклатуры(Выборка.РОдитель);
               ОбъектНоменклатуры.Записать();
           КонецЕсли;    
               ОбъектНоменклатуры = Выборка.ссылка.ПолучитьОбъект();
               ОбъектНоменклатуры.ВидНоменклатуры = ПроверитьВидНоменклатуры(Выборка.РОдитель);
               ОбъектНоменклатуры.Записать();
       КонецЕсли;
       а=а+1;
   КонецЦикла;
   Сообщить("Обработано " + а + " позиций номенклатуры!")
       
КонецПроцедуры

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




Виды то он создает,но вот в элементах то номенклары вид все равно не указан...
чяднт?
1 kIR
 
18.06.13
16:08
да,косячок есть,он создает несколько одинаковых видов,но я его уже поправил
2 Флудер
 
18.06.13
16:08
В обработчике передзаписью стоит проверка на запрет изменения виданоменклатуры в некоторых случаях. Может отрабатывает?
3 mikecool
 
18.06.13
16:10
а чего бы не Выборка.Ссылка.Уровень() проверять?
4 kIR
 
18.06.13
16:10
(2) а программно ее можно отрубить?
5 mikecool
 
18.06.13
16:11
запрос в цикле...
6 kIR
 
18.06.13
16:16
(5) поясни
7 Zapal
 
18.06.13
16:24
(0) <<рукалицо>>
8 mikecool
 
18.06.13
16:25
(6) ты на каждой итерации по номенклатуре делаешь запрос к видам
9 Флудер
 
18.06.13
16:26
(4) ОбменДанными.Загрузка=Истина
10 Zapal
 
18.06.13
16:29
думаю косяк где-то здесь:

   Итог = Запрос.Выполнить().Выбрать();
   Если Итог.Количество()>0 тогда
       Возврат Итог.ссылка;
11 kIR
 
19.06.13
08:51
(10) именно)спасибо)
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.