• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

Распределение элементов справочника по группам

  • Автор темы VoodyGoo
  • Дата начала
Статус
Закрыто для дальнейших ответов.
V

VoodyGoo

Здраствуйте.
Как можно изменить у существующего элемента справочника родителя, т.е. переместить его в определённую группу. При создании нового элемента всё просто:
Код:
НовыйЭлемент.Родитель = Какая то группа
А тот же метод на существующий элемент не действует.

Действие происходит так:

Есть документ с заполненной табличной частью (с реквизитом ТЧ - ТМЦ - тип спр.Номенклатура).
делаю цикл по строкам ТЧ, выхожу на ТМЦ и пытаюсь присвоить владельца описанным выше способом - не получется((
ТекНом.Родитель = ВыбГруппа;
{C:\VOODY\1C\РАСПРЕДЕЛЕНИЕПОГРУППАМ.ERT(23)}: Объект не может быть перепозиционирован!

метод Использовать владельца тоже не работает

как тут быть?
 
P

puh14

Эээ - ты ему прямо из документа пытаешся родителя задать? так не получится. Лучше примерно так ( в семерке)
Ном = СоздатьОбъект("Справочник.Номенклатура");
Пока ПолучитьСтроку() = 1 Цикл
ЕСли Ном.НайтиЭлемент(ТекущаяСтрока().Номенклатура) = 1 ТОгда
Ном.Родитель = ВыбГРуппа;
Ном.Записать();
Иначе
Сообщить("Элемент не найден в строке " + НомерСтроки);
КонецЕСли;
КонецЦикла;
 
V

VoodyGoo

Так тоже самое, пробовал даже выгружать в тз, и отуда уже пытаться. Ничего.
Через СоздатьОбъект та же ошибка.

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

puh14

Значит косяк в типе переменной выбгруппа - неверное значение(элемент), не тот справочник. Мож выбгруппа вообще строка
Он ведь нашел элемент номенклатуры в справочнике а вот родитель подкачал.
 
V

VoodyGoo

Значит косяк в типе переменной выбгруппа - неверное значение(элемент), не тот справочник. Мож выбгруппа вообще строка
Он ведь нашел элемент номенклатуры в справочнике а вот родитель подкачал.

Для выбора родителя создал на форме ПолеВвода (ид ВыбГруппа) тип Справочник.Номенклатура. И уже через него то и выбираю владельца

А если бы ВыбГруппа и была бы строкой, ии ещё чем либо, то элемент юы просто записался в корень справочника, такое я когда то замечал.
 
P

puh14

А ещё такой переменной в форме у тебя не объявлено? 1с в первую очередь смотрит на переменные формы, а потом на поля ввода, даже если идентификатор объявлен. Ещё посмотри - мож она у тебя перезаполняется чем. Если в лом искать - переименуй ВыбГРуппа в ВЫбгруппаНоменклатуры на поле ввода и в модуле и попробуй. Мож ВЫбГруппа - это вообще глобальная переменная.
 
V

VoodyGoo

А ещё такой переменной в форме у тебя не объявлено? 1с в первую очередь смотрит на переменные формы, а потом на поля ввода, даже если идентификатор объявлен. Ещё посмотри - мож она у тебя перезаполняется чем. Если в лом искать - переименуй ВыбГРуппа в ВЫбгруппаНоменклатуры на поле ввода и в модуле и попробуй. Мож ВЫбГруппа - это вообще глобальная переменная.

нет, форма чистая, обработку спец для этого создавал. Есть только 2 элемента ВыбГрупа и ВыбДок. Ничто нигде не перекрывается, точно
 
P

puh14

переименуй поле ввода на форме и соответственно в модуле каким нибуть длинным названием - и попробуй.
 
V

VoodyGoo

переименуй поле ввода на форме и соответственно в модуле каким нибуть длинным названием - и попробуй.

никаких улучшений
ТекНом.Родитель = ВыбГруппаДляИзменения;
{C:\VOODY\1C SOFT\РАСПРЕДЕЛЕНИЕПОГРУППАМ.ERT(23)}: Объект не может быть перепозиционирован!
 
P

puh14

ТекНом - это что? Код покажи целиком
Обычно такое бывает когда на одну переменную пытаются навесить несколько создать объект, или в поле ввода и переменная модуля совпадают.
 
V

VoodyGoo

ТекНом - это что? Код покажи целиком
Обычно такое бывает когда на одну переменную пытаются навесить несколько создать объект, или в поле ввода и переменная модуля совпадают.

тут его очень немного) Вот вся обработка
Код:
Процедура Выполнить() 

спрНоменклатура = СоздатьОбъект("Справочник.Номенклатура");

ВыбДок.ВыбратьСтроки();
Пока ВыбДок.ПолучитьСтроку() = 1 Цикл 

спрНоменклатура.НайтиПоКоду(ВыбДок.ТМЦ.Код);

ТекНом = спрНоменклатура.ТекущийЭлемент();

ТекНом.Родитель = ВыбГруппаДляИзменения;
ТекНом.Записать();

КонецЦикла;

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

puh14

Процедура Выполнить()

спрНоменклатура = СоздатьОбъект("Справочник.Номенклатура");

ВыбДок.ВыбратьСтроки();
Пока ВыбДок.ПолучитьСтроку() = 1 Цикл

Если спрНоменклатура.НайтиЭлемент(ВыбДок.ТМЦ) = 1 ТОгда// ТМЦ- это точно номенклатура? мож просто значение типа Справочник

СпрНоменклатура.Родитель = ВыбГруппаДляИзменения;
СпрНоменклатура.Записать();
Иначе
Сообщить("Не нашли");//ну а вдруг...
КонецЕСли;

КонецЦикла;

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

Походу проблема в том, что ТекНом - это тебе не создатьОбъект ;-)
 
V

VoodyGoo

Обычно такое бывает когда на одну переменную пытаются навесить несколько создать объект, или в поле ввода и переменная модуля совпадают.

а может быть такое, что причина всему то, что на один и тот же елемент справочника у меня сразу ссылается строка тч док-а(т.к мы в цикле на ней стоим), и Справочник Создать Объект Текущий элемент


puh14, спасибо ОГРОМНОЕ!
Получилось, только не понимаю в чём тут фокус?
Вроде и найти по коду и найтиэлемент возращают один и тот же тип, элемент.
Хотелось понять, а то получается что я тупо код списал -_-

Но и на этом уже спасибо!!!!
 
P

puh14

ТЧ дока ссылается через ВыбДок.ТМЦ а справочник серез СпрНоменклатура - так что не в этом дело. Короче - работает?

скорее всего дело было в том, что ТекНом - это не СоздатьОбъект, а тупо переменная. И Изменение параметров справочника через переменную невозможно - только через СоздатьОбъект. Ту же ошибку тебе выдаст ежли ты напишешь

ВыбДок.ТМЦ.Родитель = ВыбГруппаДляИзменения;
ВыбДок.ТМЦ.Записать();
 
U

unknown181538

НАйтиЭлмент и Найти ПОкКОду - это немножко разное. В восьмерке есть два типа "СправочникОбъект" и "СправочникСсылка". Чем различаются толком не понимаю. Для записи надо использовать НайтиЭлемент(). МОжно было написать НайтиПоКоду(), затем НАйтиЭлемент().
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!