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

Тема в разделе "1C и всё что с ней связано", создана пользователем Programmer_Hard, 2 апр 2010.

  1. Programmer_Hard

    Programmer_Hard Гость

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

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

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

    vbs Well-Known Member

    Регистрация:
    18 фев 2007
    Сообщения:
    1.708
    Симпатии:
    3
    ДатаЗнач определена ?
     
  3. puh14

    puh14 Well-Known Member
    1C Team

    Регистрация:
    11 июл 2008
    Сообщения:
    1.412
    Симпатии:
    0

    Может в этом дело? обычно надо сначала назначить тип для реквизита.
     
  4. Programmer_Hard

    Programmer_Hard Гость

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

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

    vbs Well-Known Member

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

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

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

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

    vbs Well-Known Member

    Регистрация:
    18 фев 2007
    Сообщения:
    1.708
    Симпатии:
    3
    еще можно попробовать работать с объектом "Периодический"

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

    Programmer_Hard Гость

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

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

    Я значение периодического атрибута получаю путем ОбъектПериодический.Значение, те неопределенного типа.
    Код (Text):
    УстановитьРеквизитСправочника(ОсновныеСр,СокрЛП(НазРеквизита),Перечисление.Состо
    янияОС.В_Эксплуатации,ДатаЗнач);
    так оно тоже работает.
     
Загрузка...
Похожие Темы - Потеря периодических реквизитов
  1. serko
    Ответов:
    3
    Просмотров:
    968
  2. decay
    Ответов:
    1
    Просмотров:
    1.775
  3. pbnoob
    Ответов:
    3
    Просмотров:
    2.937
  4. olga13
    Ответов:
    4
    Просмотров:
    4.225

Поделиться этой страницей