Имя: Пароль:
1C
1С v8
УПП, РАУЗ и риб-база: получил битые ссылки после ТиИ ключей аналитики (?)
0 Serg_1960
 
15.06.12
10:31
ТиИ обнаружила битые ссылки в движениях документов по регистру учета затрат. Смотрел по ЖР в центральном и подчиненном узлах что могло быть первопричиной. Предпологаю, что дело было так:

В подчиненном узле (ПУ), груповой обработкой, отменили проведение некоторых документов, "вручную" внесли изменения и вновь провели документы.

В это время происходил сеанс обмена данными и в центральный узел (ЦУ) ушла информация о снятии с проведения и изменении документов (частично).

В ЦУ после сеанса обмена запускали обработку тестирования и исправления ключей аналитики. Она обнаружила и удалила не используемые ключи.

При очередном сеансе обмена из ЦУ ушла информация об удалении ключей, а из ПУ поступила информация о перепроведенных документах.

В итоге: в движениях некоорых документов по регистру учета затрат есть ссылки на удаленные записи справочников ключей аналитики.

PS: что-то плохо у меня получается в типовых алгоритмах проследить где и когда генерятся клюючи аналитики при проведении документа.
1 Maxus43
 
15.06.12
10:33
при проведении генерятся, если не найдена такая аналитика
2 Maxus43
 
15.06.12
10:33
процедуры типа ПолучитьСоздатьКлючиАналитики()
3 Maxus43
 
15.06.12
10:34
на копии можно попробовать обработку - тестирование и исправление ключей аналитики
4 Maxus43
 
15.06.12
10:38
// Функция получает ключ аналитики из регистра сведений или
// создает новый элемент в случае отсутствия.
//
// Параметры:
//    СтруктураИзмерений - Структура - Структура значений измерений ключа аналитики
//    МассивИзмерений - Массив - Массив измерений ключа аналитики
//    ИмяСправочника - Строка - Имя справочника - ключа аналитики
//    ИмяРегистра - Строка - Имя регистра сведений - ключа аналитики
//    СтруктураКлючиАналитики - Структура - Структура с таблицами ключей аналитики для кэширования данных
//
// Возвращаемое значение:
//    СправочникСсылка - Значение ключа аналитики
//
Функция ПолучитьСоздатьКлючАналитики(
   СтруктураИзмерений,
   МассивИзмерений,
   ИмяСправочника,
   ИмяРегистра,
   СтруктураКлючиАналитики
   )
5 Мигрень
 
15.06.12
10:40
Если РИБ и битые ссылки - то это нормально. Можно просто запустить ТИИ.
6 Serg_1960
 
15.06.12
10:42
(3) Запускал повторно я эту окаянную обработку :) Получил неожиданный эффект: обработка сообщила что некоторые ключи содержат ссылки на несуществующие ключи аналитики... и удали их. Вместо восстановления - удаление :(
7 Maxus43
 
15.06.12
10:44
(6) доки перепроведи - создаст заново
8 Maxus43
 
15.06.12
10:49
(7) + в ЦУ
9 Serg_1960
 
15.06.12
10:52
(6) "удали их" --> "удалила их"

(4) Угу. Эту функцию и другие в модуле РАУЗа я нашел. Сейчас пытаюсь отследить как к ним происходит обращение при проведении документов.

(7) Проблема: нельзя "просто" перепровести документы - они проведены по УУ и БУ в уже "закрытом" месяце. Есть расчет себестоимости. Заново его делать - цифры поплывут.

Единственный способ (имхо) - вытащить битые ссылки из регистра учета затрат и заново их создать по документу-регистратору.
10 Maxus43
 
15.06.12
10:56
(9) как вариант - сделай копию дока сегодняшним днём, проведи, удали. создадутся нужные ключи, останется заменить битые ссылки. Это чтоб не ковырять долго процедуры РАУЗа
11 Serg_1960
 
15.06.12
10:58
Сочинил алгоритм перепроведения документа. По иронии судьбы - он попрождает битые ссылки нановые ключи аналитики :)

Процедура ПереПроведениеДокументаПоРегиструНакопленияУУ(ТекСсылка, ИмяРегистра)
   
   Попытка
       Объект = ТекСсылка.ПолучитьОбъект();
       
       НачатьТранзакцию();
       
       Если Объект.Метаданные().Реквизиты.Найти("ОтражатьВБухгалтерскомУчете") <> Неопределено Тогда
           Объект.ОтражатьВБухгалтерскомУчете = Ложь;
       КонецЕсли;
       Если Объект.Метаданные().Реквизиты.Найти("ОтражатьВНалоговомУчете") <> Неопределено Тогда
           Объект.ОтражатьВНалоговомУчете = Ложь;
       КонецЕсли;
       
       Объект.Записать(РежимЗаписиДокумента.Проведение,РежимПроведенияДокумента.Неоперативный);
       Объект.Движения[ИмяРегистра].Прочитать();
       ТаблицаЗаписей = Объект.Движения[ИмяРегистра].Выгрузить();
       
       ОтменитьТранзакцию();
       
       Объект.Движения[ИмяРегистра].Загрузить(ТаблицаЗаписей);
       Объект.Движения[ИмяРегистра].Записать(Истина);
       
   Исключение
       
       Если ТранзакцияАктивна() Тогда
           ОтменитьТранзакцию();
       КонецЕсли;
       
   КонецПопытки;
   
   Возврат;
   
КонецПроцедуры
12 Serg_1960
 
15.06.12
11:00
(11) тьфу, очепятки "попрождает битые ссылки нановые ключи аналитики" --> "создает битые ссылки, если при проведении создаются новые ключи аналитики"
13 Serg_1960
 
15.06.12
11:09
Интересная мысль пришла в голову: в ТаблицеЗаписей (до отмены транзакции) ссылки на существующие и только что созданные ключи аналитики...
14 Maxus43
 
15.06.12
11:11
правильно что битые, отмена транзакции веть
15 Serg_1960
 
15.06.12
17:11
(13) Подправил алгоритм и теперь он "решает" проблему (0) - "восстанавливает" битые ссылки и заполняет отсутствующие ключи аналитики в справочниках и регистрах сведений.

(0) Проблема решена.
16 zmaximka
 
15.06.12
18:19
поздравляю, преступление раскрыто :)