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

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

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

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

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

метод УстановитьАтрибут()

  • Автор темы cbat
  • Дата начала
C

cbat

Всем привет!
При попытке вызова след метода:

Код:
ТекРег.УстановитьАтрибут("Номенклатура", НовоеЗначение);

вылетает ошибка:
ТекРег.УстановитьАтрибут("Номенклатура", НовоеЗначение);
{C:\REPLACE_REFS.ERT(173)}: Действие недоступно!

Данная операция устанавливает новый атрибут НовоеЗначение для измерения Номенклатура регистра ТекРег. В чем может быть проблема никак не могу понять, а 1С не в состоянии дать более исчерпывающую информацию кроме как "Действие недоступно!"?
 
V

vbs

А БЫЛО ЛИ СДЕЛАНО ПРЕДВАРИТЕЛЬНО
ТекРег= CreateObject("Register.Остатки"); // или какой-то там регистр ?
Если да, работать будет 100% !
 
C

cbat

А БЫЛО ЛИ СДЕЛАНО ПРЕДВАРИТЕЛЬНО
ТекРег= CreateObject("Register.Остатки"); // или какой-то там регистр ?
Если да, работать будет 100% !

да, конечно было:

Код:
		ТекРег = СоздатьОбъект("Регистр.ТестРег");
ТекРег.ВыбратьДвиженияДокумента(Док);
Пока ТекРег.ПолучитьДвижение()=1 Цикл
Если ТекРег.ПолучитьАтрибут("Номенклатура") = СтароеЗначение Тогда
ТекРег.УстановитьАтрибут("Номенклатура", НовоеЗначение); // ошибка: Действие не доступно!
КонецЕсли;
конецЦикла;

Странно для меня то, что метод ПолучитьАтрибут() работает. А вот УстановитьАтрибут() совершенно не хочет, выдавая ошибку "Действие не доступно!"
 
P

puh14

Интересно - мож быть дело в том что запускается не из модуля документа? а то действия по изменению регистров возможны вроде только из него.
 
C

cbat

Интересно - мож быть дело в том что запускается не из модуля документа? а то действия по изменению регистров возможны вроде только из него.
метод регистра УстановитьАтрибут() не обязательно использовать в модуле документа.
А вообще я пробовал и в модуле документа и обработкой - результат один - вылетает с ошибкой. :)
 
V

vitfil

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

cbat

1. Либо наименование атрибута задано неверно.
2. Либо значение пытаетесь не того типа запихать.
3. Либо все творите НЕ в модуле проведения документа.
Эти варианты я в первую очередь проверил:
1) исключено, так как в ином случае не выполнялось бы условие "Если ТекРег.ПолучитьАтрибут("Номенклатура") = СтароеЗначение Тогда"
2) тоже исключено, так как я пытался даже так написать "Регистр.ТестРег.УстановитьАтрибут("Номенклатура", СтароеЗначение);" - тот же результат.
3) именно в модуле проведения, т е код выглядит таким образом:
Код:
Процедура ОбработкаПроведения()
ТекРег = СоздатьОбъект("Регистр.ТестРег");
ТекРег.ВыбратьДвиженияДокумента(Док);
Пока ТекРег.ПолучитьДвижение()=1 Цикл
Если ТекРег.ПолучитьАтрибут("Номенклатура") = СтароеЗначение Тогда
ТекРег.УстановитьАтрибут("Номенклатура", НовоеЗначение); // ошибка: Действие не доступно!
КонецЕсли;
конецЦикла;
конецПроцедуры
галочка "оперативный учет" в документе выставлена.
:)
 
C

cbat

В общем проблема решилась заменой
Код:
ТекРег.УстановитьАтрибут("Номенклатура", НовоеЗначение);
на
Код:
Регистр.ТестРег.УстановитьАтрибут("Номенклатура", НовоеЗначение);
Не пойму какой смысл тогда было предоставлять пользователю доступ к методу через объект(в данном случае ТекРег) если он все равно нигде не работает.
 
H

has

видимо просто не работает через СоздатьОбъект()
 
V

vitfil

has
Ну так а я в своем коде разве что-то иное написал?
cbat
Решилось у вас именно так как я и написал! Внимательней надо читать то, что вам пишут.
Я еще раз повторюсь: движения в регистр (установку значений реквизитов и т.д.) делает документ. Для регистров, созданных через СоздатьОбъект допускается ТОЛЬКО чтение значений.
 
Мы в соцсетях:

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