Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Проверка/создание иерархии номенклатуры
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 8.2 > Программирование обычных форм 1С 8.2 и не интерфейсной логики
Fabri
Добрый день. Имеется табличное поле с колонками - Группа1, Группа2, Группа3, Номенклатура, Артикул.
Необходимо создавать номенклатуру в иерархии Группа1-Группа2-Группа3.

Я вижу код так, но мне как-то не нравится:
Для Каждого Строка Из ТабличнаяЧасть Цикл

ПервРодитель = ПроверитьИлиСоздатьГруппу(Строка.Группа1);
ВторРодитель=ПроверитьИлиСоздатьГруппу(Строка.Группа2,ПервРодитель);
ТретийРодитель=ПроверитьИлиСоздатьГруппу(Строка.Группа3,ВторРодитель);
СоздатьНоменклатуру(Строка.Номенклатура,Строка.Артикул,ТретийРодитель); //Описывать процедуру не буду, вопрос не по ней
КонецЦикла;

Функция ПроверитьИлиСоздатьГруппу(Наименование,Родитель)

Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    Номенклатура.Ссылка КАК Группа
        |ИЗ
        |    Справочник.Номенклатура КАК Номенклатура
        |ГДЕ
        |    Номенклатура.Родитель = &Родитель
        |    И Номенклатура.ЭтоГруппа = ЛОЖЬ
        |    И Номенклатура.Наименование = &Наименование";

    Запрос.УстановитьПараметр("Родитель", Родитель);
       Запрос.УстановитьПараметр("Наименование", Наименование);

    Результат = Запрос.Выполнить();

    ВыборкаДетальныеЗаписи = Результат.Выбрать();

    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        Возврат ВыборкаДетальныеЗаписи.Группа; //Возвращаем ссылку на группу
    КонецЦикла;

Возврат СоздатьГруппу(Родитель); //Функция создает группу и возвращает ссылку на нее (описывать тут не буду, впорос не по данной функции)


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


Может у кого-то есть идеи по оптимизации данного кода, или другое решение вопроса. Спасибо.
Vofka
Дайте скрин табличного поля. А то я начал было писать, а потом прикинул, вдруг я не о том пишу сейчас и обломался.
Fabri

 ! 

Правила, п.11
 


Ardi
Идея нормальная.
Только иногда может быть только первый. Или первый и второй родитель.

Ну и "И Номенклатура.ЭтоГруппа = истина"
Fabri
Если будут только первый или второй родитель то ерунда, это я пропишу:
Если ЗначениеЗаполнено(Строка.Группа3)=Ложь Тогда
СоздатьНоменклатуру(Строка.Номенклатура,Строка.Артикул,[b]ВторРодитель[/b]);
Иначе
ТретийРодитель=ПроверитьИлиСоздатьГруппу(Строка.Группа3,ВторРодитель);
КонецЕсли;


По поводу
|    И Номенклатура.ЭтоГруппа = ЛОЖЬ

спасибо, это я уже исправил, вообще код ещё не вставлял в обработку, накидал его сюда чисто для примера.
Vofka
Вопрос в том, как группы создавать? Собираем все в таблицу значений. Делаем к ней потом запрос, соединяем со справочником номенклатуры и смотрим каких позиций нету и их создаем. Как-то так:

...
;
ВЫБРАТЬ
   Группа1,
   Группа2,
   Группа3,
   Ном1.ГруппаСсылка1,
   Ном2.ГруппаСсылка2,
   Ном3.ГруппаСсылка3
ИЗ
   ТаблицаЗначений КАК ТаблицаЗначений

   ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Ном1
      ПО Ном1.Наименование = Группа1
      И Ном1.Родитель = Значение(Справочник.Номенклатура.ПустаяСсылка)

   ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Ном2
      ПО Ном2.Наименование = Группа2
      И Ном1.Родитель.Наименование = Группа1

   ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Ном3
      ПО Ном3.Наименование = Группа3
      И Ном3.Родитель.Наименование = Группа2
      И Ном3.Родитель.Родитель.Наименование = Группа1
ГДЕ
   Ном1.ГруппаСсылка1 ЕСТЬ NULL
   ИЛИ Ном2.ГруппаСсылка2  ЕСТЬ NULL
   ИЛИ Ном3.ГруппаСсылка3 ЕСТЬ NULL


Код, конечно, может быть не работоспособным. Короче, это просто на подумать.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.