Имя: Пароль:
1C
1С v8
Получить значения регистров
0 _leon4uk_
 
04.01.16
16:10
Добрый день!

Задача:
1. определить все регистры, по которым документ сделал движения
2. перед перепроведением документа, определить значения измерений, ресурсов, реквизитов регистров
3. после перепроведения документа, определить значения измерений, ресурсов, реквизитов регистров
4. сравнить значения, полученные в "2" и в "3". Показать различия.

1 я сделал:
Функция ОпределитьНаличиеДвиженийПоРегистратору(объект)
    
    ТекстЗапроса = "";
    ДвиженияДокумента = объект.Метаданные().Движения;
    
    Для Каждого Движение ИЗ ДвиженияДокумента Цикл
        
        Если НЕ ПравоДоступа("Просмотр", Движение) Тогда
            Продолжить;
        КонецЕсли;
        
        ТекстЗапроса = ТекстЗапроса + "
        |" + ?(ТекстЗапроса = "", "ВЫБРАТЬ РАЗРЕШЕННЫЕ ", "ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ") + "
        |ПЕРВЫЕ 1 ВЫРАЗИТЬ(""" + Движение.ПолноеИмя()
        +  """ КАК Строка(200)) КАК Имя ИЗ " + Движение.ПолноеИмя()
        + " ГДЕ Регистратор = &Регистратор";
    КонецЦикла;
    
    Если ТекстЗапроса = "" Тогда
        // У документа нет движений по регистрам или у пользователя нет прав на просмотр регистров движений документа
        Возврат Новый ТаблицаЗначений;
    КонецЕсли;
    
    ТекстЗапроса = ТекстЗапроса +
    "
    |УПОРЯДОЧИТЬ ПО
    |Имя
    |";
    
    Запрос = Новый Запрос(ТекстЗапроса);
    Запрос.УстановитьПараметр("Регистратор", Объект.Ссылка);
    
    ТаблицаЗапроса = Запрос.Выполнить().Выгрузить();
    ТаблицаЗапроса.Индексы.Добавить("Имя");
    
    Для Каждого СтрокаТаблицыДвижений Из ТаблицаЗапроса Цикл
        СтрокаТаблицыДвижений.Имя = СокрЛП(СтрокаТаблицыДвижений.Имя);
    КонецЦикла;
    
    Возврат ТаблицаЗапроса;
    
КонецФункции

не пойму как выполнить задание 2 и 3... хелп...
1 ДенисЧ
 
04.01.16
16:21
а в чём проблема создать наборы записей и прочитать их по регистратору?
2 QvalcharaQ
 
04.01.16
16:55
А не проще ли использовать Объект.движения, откуда, наборы записей распихивать по таблицам и сравнивать?
3 QvalcharaQ
 
04.01.16
17:13
Старые движения получить вот так,
    СтрДвижений=Новый Массив;
    Для каждого дв Из движения Цикл
        СтрДвижений.Добавить(дв.выгрузить())
    КонецЦикла;

новые после записи аналогично, сравнивать по вкусу
4 zak555
 
04.01.16
17:27
зачем сравнивать надо ?
5 ДенисЧ
 
04.01.16
17:31
(4) Вам, тупым франчам, постоянно нужно объяснять постановку... По 20 раз... Пока не только от зубов, но и от всех остальных частей тела отскакивать не будет...
6 _leon4uk_
 
04.01.16
17:38
(3) пока не совсем понял куда запихнуть это...
(4) документ проведен. значения в регистрах N. была доработка регистра. необходимо перепровести документы, которые делают движения по этому регистру. после перепроведения документа, движения в регистры будут новые - M. как-то так.
7 zak555
 
04.01.16
17:38
(5) пнз, м
8 kiruha
 
04.01.16
17:49
Видать задание дали. Ну тупое конечно для реальной жизни. Только надо было самому решать а не на форум накидывать. Но раз за  3 года выгрузку чел не научился делать = имхо бесполезно
9 zak555
 
04.01.16
17:53
(6) так зачем новые сравнивать со старыми ?
или это отладка новых движений ?
10 kiruha
 
04.01.16
17:55
(9)Тестируют чела ... 90%
11 _leon4uk_
 
04.01.16
18:00
(8) я кодил пол-года. перестал. теперь вот снова пришлось. начинаю всё с "нуля"
12 Nuobu
 
04.01.16
18:04
(11) Во франче, или так?
13 _leon4uk_
 
04.01.16
18:04
(12) не был и не знаю что такое франч :)
14 Nuobu
 
04.01.16
18:05
(13) Ну, фирма-франчайзи, БиТ, там всякий, Теллур и т.д..
15 _leon4uk_
 
04.01.16
18:06
(14) нет
16 Nuobu
 
04.01.16
18:08
(15) Так пойди, тебя возьмут и вымуштруют.
Глядишь - через полгода темы создавать перестанешь.
17 _leon4uk_
 
04.01.16
18:10
в общем сбились с темы.
18 ДенисЧ
 
04.01.16
18:20
(17) по теме я тебе в (1) ответил...
19 RomanYS
 
04.01.16
18:48
Если делать задачу просто, то
0. практически во всех типовых есть отчет по движениям документа
1. сохранить результат отчета до проведения
2. сохранить после
3. вызвать диалог сравнения файлов для сохраненных отчетов

Это если цель конечно не потренироваться в написании запросов и переборе метаданных.
20 QvalcharaQ
 
05.01.16
08:40
(6) Это в обработку проведения, или перед записью (нужно смотреть флаг очистки движений). Если движения рисуются обработкой, то в обработку.
21 _leon4uk_
 
05.01.16
20:18
1, 2, 3 задания я сделал.
перед и после перепроведения документа вызываю функцию, где определяю регистры, по которым сделал движения документ. дальше получаю значения этих регистров и выгружаю в массив как таблицы значений.

функция (не осуждайте...):
Функция ОпределитьНаличиеДвиженийПоРегистратору(объект)
    
    ТекстЗапроса = "";
    ДвиженияДокумента = объект.Метаданные().Движения;
    
    СтрДвижений=Новый Массив;
    Для Каждого Движение ИЗ ДвиженияДокумента Цикл
        
        Если НЕ ПравоДоступа("Просмотр", Движение) Тогда
            Продолжить;
        КонецЕсли;
        
        ТекстЗапроса = ТекстЗапроса + "
        |" + ?(ТекстЗапроса = "", "ВЫБРАТЬ РАЗРЕШЕННЫЕ ", "ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ") + "
        |ПЕРВЫЕ 1 ВЫРАЗИТЬ(""" + Движение.ПолноеИмя()
        +  """ КАК Строка(200)) КАК Имя ИЗ " + Движение.ПолноеИмя()
        + " ГДЕ Регистратор = &Регистратор";
        
    КонецЦикла;
    
    Если ТекстЗапроса = "" Тогда
        // У документа нет движений по регистрам или у пользователя нет прав на просмотр регистров движений документа
        Возврат Новый ТаблицаЗначений;
    КонецЕсли;
    
    ТекстЗапроса = ТекстЗапроса +
    "
    |УПОРЯДОЧИТЬ ПО
    |Имя
    |";
    
    Запрос = Новый Запрос(ТекстЗапроса);
    Запрос.УстановитьПараметр("Регистратор", Объект.Ссылка);
    
    ТаблицаЗапроса = Запрос.Выполнить().Выгрузить();
    ТаблицаЗапроса.Индексы.Добавить("Имя");
    
    Для Каждого СтрокаТаблицыДвижений Из ТаблицаЗапроса Цикл
        СтрокаТаблицыДвижений.Имя = СокрЛП(СтрокаТаблицыДвижений.Имя);
    КонецЦикла;
    
    СтрДвижений=Новый Массив;
    
    Для каждого дв из ДвиженияДокумента Цикл
        дв2 = ТаблицаЗапроса.Найти(дв.ПолноеИмя(), "Имя");
        если дв2 =    Неопределено тогда
            продолжить;
        конецесли;
        
        Запрос = Новый Запрос();
        
        запрос.Текст=
        "ВЫБРАТЬ
        |    "+дв.Имя+".*
        |ИЗ
        |    "+дв.ПолноеИмя()+" КАК "+дв.Имя+"
        |ГДЕ
        |    "+дв.имя+".Регистратор = &Регистратор";
        
        Запрос.УстановитьПараметр("Регистратор", Объект.Ссылка);
        РезультатЗапроса = Запрос.Выполнить().Выгрузить();
        
        СтрДвижений.Добавить(РезультатЗапроса);
        
    КонецЦикла;
    
    Возврат СтрДвижений;
КонецФункции


собственно остановился я на:
как сравнить 2 массива с таблицами значений? нужно выявить различия значений в таблицаДО и таблицаПОСЛЕ перепроведения.
22 _leon4uk_
 
06.01.16
00:08
up!
23 hhhh
 
06.01.16
02:54
(22) это на докторскую диссертацию тянет это вопрос. Там такое неизмеримое количество вариантов всяких возникнуть может - это просто искусственный интеллект изобретаете.
24 QvalcharaQ
 
06.01.16
08:39
(21) обходить каждую ТЗ из массива по строкам и колонкам, сравнивать значения.
Но тут стоит подумать о сортировке ТЗ, ибо значения могут быть одинаковые, а порядок строк разный. Будут ли тогда эти ТЗ разными?
Независимо от того, куда вы едете — это в гору и против ветра!