• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Потеря периодических реквизитов после свертки

  • Автор темы Programmer_Hard
  • Дата начала
P

Programmer_Hard

Сделал таки свертку базы, работа в новой базе начата. После всех проверок, теперь выясниось, что в справочнике "Основные средства" пропали субконто для счета отнесения затрат и реквизиты "состояние" и "причины выбытия", а может еще чтото.
_http://1c.proclub.ru/modules/mydownloads/personal.php?cid=5&lid=5363 Отсюда узнал, что это врожденный баг, и приводится конфа с доком , который сохраняет до свертки значение реквизитов в тз:
ТЗ=СоздатьОбъект("ТаблицаЗначений");
ТЗ.НоваяКолонка("ВидСправочника","Строка");
ТЗ.НоваяКолонка("Элемент","Справочник");
ТЗ.НоваяКолонка("ТипЗнач","Строка");
ТЗ.НоваяКолонка("УстЗнач");
ТЗ.НоваяКолонка("ДатаЗнач","Дата");
ТЗ.НоваяКолонка("УстДокумент","Строка");
ТЗ.НоваяКолонка("НазРеквизита","Строка");
ТЗ.НоваяКолонка("ОбДокумент","Документ");
и потом грузит тз в тч дока, и проведением устанавливает значения реквизитов справочников.

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

Из-за чего происходит исключение непойму..
 
P

Programmer_Hard

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

УстЗнач - неопределен

У каждого реквизита есть ТипЗнач - определенный ТипЗначенияСтр(Реквизит.Значение); Он принимает значение ''Перечисление'', ''Справочник'', "документ" ... без детализации какой именно документ или справочник.
Если его использовать в УстановитьРеквизитСправочника(ОсновныеСр,СокрЛП(НазРеквизита),УстЗнач,ДатаЗнач,Т
ипЗнач ); то срабатывает исключение, там где УстЗнач не пустое.
К примеру, надо указать значение реквизита типа "Перечисление.СостояниеОС" = "В эксплуатации". Как это будет выглядеть? если у меня есть ТипЗнач="перечисление" и значение УстЗнач="В эксплуатации" неопределенного типа.
 
V

vbs

УстановитьРеквизитСправочника используется для установки реквизитов неопределенного типа (для Субконто, например),
а СостояниеОС имеет тип Перечисление.СостоянияОС
поэтому и не катит.
Попробуй использовать

Спр.ИспользоватьДату(ДатаУстановки);

Спр.УстановитьАтрибут("СостояниеОС",Перечисление.СостоянияОС.В_Эксплуатации);

Если состояние меняется, используй поиск значения перечисления по идентификатору
 
V

vbs

еще можно попробовать работать с объектом "Периодический"

СПРОС = ОсновныеСр.ТекущийЭлемент();
П = СоздатьОбъект("Периодический");
П = ИспользоватьОбъект("СостояниеОС",СПРОС);
П.ДатаЗнач = ...
П.Значение = ...
П.Записать();
 
P

Programmer_Hard

Перечисление.СостоянияОС.ЗначениеПоИдентификатору(СокрЛП(УстЗнач)) -
неработает , тк УстЗнач - не идентификатор, а значение перечисления.

И вот как получить значение "Перечисление.СостоянияОС.В_Эксплуатации", зная значение "В Эксплуатации" ?))

Я значение периодического атрибута получаю путем ОбъектПериодический.Значение, те неопределенного типа.
Код:
УстановитьРеквизитСправочника(ОсновныеСр,СокрЛП(НазРеквизита),Перечисление.Состо
янияОС.В_Эксплуатации,ДатаЗнач);
так оно тоже работает.
 
Мы в соцсетях:

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