Имя: Пароль:
1C
1С v8
Нужна помощь в написании обробки. Изменения данных в документах
0 mukilka
 
22.05.14
11:17
У меня есть такая обработка. Нужно переписывать данные из табличной части одного документа в документ табличную часть другого. И посоветуйте, так сделать чтобы и в регистр накопления, связанным с документом Обсл отображались новые данные? Процедура, которая переписывает данные документа ниже. АктДок и ОбслДок – результаты запроса.

Процедура ИзменитьЗнач(АктДок, ОбслДок);
    Акт=АктДок.ПолучитьОбъект();
    Обсл=ОбслДок.ПолучитьОбъект();    
    Для каждого Строка Из Обсл.товары Цикл
        Попытка
            Строка.Номенклатура = Акт.Товары[Строка.НомерСтроки-1].Номенклатура;
            Строка.ХарактеристикаНоменклатуры = Акт.Товары[Строка.НомерСтроки-1].ХарактеристикаНоменклатуры.Ссылка;
            Обсл.Записать();
            Исключение
        КонецПопытки;
    КонецЦикла;
КонецПроцедуры
1 Godofsin
 
22.05.14
11:19
Обсл.Записать(РежимЗаписиДокумента.Проведение);
2 Godofsin
 
22.05.14
11:19
Из цикла только вынеси, еретик !
3 Wobland
 
22.05.14
11:20
(2) а ну как будет вылет в середине обработки? так хоть что-то останется ;)
4 Godofsin
 
22.05.14
11:22
(3) И то верно )))
5 galimova_alsou
 
22.05.14
11:26
(1) именно.
И заполнение у вас как-то через назад написано.
Лучше так:

Для Каждого ТекСтрока Из Обсл.Товары Цикл
НоваяСтрока = Акт.Товары.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока,ТекСтрока);
КонецЦикла

Акт.Записать(РежимЗаписиДокумента.Проведение);
6 Wobland
 
22.05.14
11:28
(5) это даже покруче, чем загрузить
7 Godofsin
 
22.05.14
11:30
(6) загрузить неинтересно ))) мало букв
8 Леша1с
 
22.05.14
11:34
(7) да уж, ЗаполнитьЗначенияСвойств тоже не комильфо...
(0) чем не нравится 1С - есть масса путей написать херню, но только один - написать правильно.
9 Godofsin
 
22.05.14
11:48
Кстати, топик забавляет: "Обробка"! в копилку....
10 Wobland
 
22.05.14
11:55
(9) держи ещё

-Ты ж в командировке был. Как поедка?
-жареные бурятские пельмени. неплохо
11 mukilka
 
22.05.14
13:29
Спасибо всем!) Я только учусь!) как что-нибудь сделаю, напишу)
12 mukilka
 
22.05.14
13:30
(10) (9) (8) (7) (6) (5) (2) спасибо)
13 mukilka
 
22.05.14
17:35
(5) (6) (7)
Для меня главным является докум.Акт. Может стоить перебирать строки его таблчиной части и записывать в ТЧ док. Обсл, перед тем очистив ТЧ Обсл?
Посоветуйте, пожалуйста, как лучше сделать?
14 pavelul73
 
22.05.14
17:39
Может НоваяТЧ.Загрузить(СтараяТЧ.Выгрузить())?
15 Necessitudo
 
22.05.14
20:47
А запрос не комильфо?
16 Dionis Sergeevich
 
22.05.14
23:59
если "АктДок и ОбслДок – результаты запроса" тогда твой код должен вылетать на методе ПОлучитьОбъект()
17 mukilka
 
23.05.14
10:19
(16) (14) (15) так вроде не вылетает а работает:) суть проблемы еще в том, что реквизиты в ТЧ разные. Тогда мне лучше не очищать ТЧ Обсл перед записью а только заменять нужные реквизиты?
18 Godofsin
 
23.05.14
10:23
(17) Смотря какая задача.
19 Godofsin
 
23.05.14
10:24
(18) Если просто перезаполнить без учета старых данных - тогда лучше очищай
20 Godofsin
 
23.05.14
10:25
и воспользуйся (14) и будет тебе счастье!
21 Godofsin
 
23.05.14
10:25
Аминь!
22 mukilka
 
23.05.14
10:45
(20)  ЗаполнитьЗначенияСвойств в попытке чтобы исключить разные по количеству строк ТЧ? может так?
23 Леша1с
 
23.05.14
11:19
(22) всего делов:
В цикле перебираешь строки и
ЗаполнитьЗначенияСвойств - заполняешь аналогичные поля двух ТЗ.
После - заполняешь те, которые отличаются по именам. Тут можешь даже заранее список соответствия наименований полей подсовывать, если сможешь.
Все.
24 galimova_alsou
 
23.05.14
11:29
(17) Если разные, то Акт.Загрузить(Облс.Выгрузить()) и ЗаполнитьЗначенияСвойств() заполнит только колонки, совпадающие по именам. Но, как я понимаю, вам нужно заполнить только колонки Номенклатура и ХарактеристикаНоменклатуры. В обеих ТЧ имена колонок одинаковые. Так что оба варианта правильные.
Причем первый даже лучше, потому что он сам очищает ТЧ перед заполнением. А выгружать можно только нужные вам колонки.
25 mukilka
 
23.05.14
12:15
(24) (23) (21)  Друзья, у меня в результате осталась только одна проблема: Данные в регистре не изменяются, хотя в документах всё работает. Где искать причину? в Обработкепроведение документа данные  в регистр записываются так: Движения.Обслуживание.ВыполнитьПриход();   А в регистре такая процедура:
[CODE]Процедура ВыполнитьПриход() Экспорт
    Общий.ВыполнитьДвижениеПоРегистру(ЭтотОбъект,ВидДвиженияНакопления.Приход);
КонецПроцедуры[/CODE]
искать проблему в процедуре: Процедура ВыполнитьДвижениеПоРегистру общего модуля Общий???
Может есть способ не меняя процедуры, записать измененные реквизиты в регистр? Буду искренне благодарен за помощь.
26 galimova_alsou
 
23.05.14
12:27
Записи в регистр делаются при проведении документа. Вам просто нужно записать документ с режимом проведения.

Акт.Записать(РежимЗаписиДокумента.Проведение);
27 mukilka
 
23.05.14
12:36
(26) Да вся проблема в том, что документы даже если я вручну провожу, то новые данные в них не отображаются(( В код были внесены изменения, и я спрашиваю совет, где искать проблему? в какой функции? иле это точно никто не знает?))
28 galimova_alsou
 
23.05.14
12:39
Значит вам нужно допиливать проведение этих документов. Чтобы нужные вам данные записывались в нужных регистрах.

Это у вас новые документы что ли какие-то?
29 mukilka
 
23.05.14
12:46
(28) Были внесены изменение в обработку документа или в движения регистра, мне точно не известно так как это делал не я((( Теперь я должен найти причину, почему данные в регистре не обновляются при проведении документа?
30 galimova_alsou
 
23.05.14
12:51
Здесь только отладчиком гнать уж.

Посмотрите что происходит здесь

Общий.ВыполнитьДвижениеПоРегистру(ЭтотОбъект,ВидДвиженияНакопления.Приход);

Удачи.
31 mukilka
 
23.05.14
13:21
Разобрался) Вот только что осталось выяснить: изменения в регистре появляются только тогда, когда я или создаю новый документ изменяю реквизит "ХарактеристикаНоменклатуры" в документе и провожу его. В остальных случаях, проводка вручную, проводка методом: Записать(РежимЗаписиДокумента.Проведение)не приводит к изменениям регистра.
Я так полагаю, что нужно искать условия при проводке документа на изменения реквизита ХарактеристикаНоменклатуры. Но тогда почему при обработке, когда реквизит меняется, регистр это не учитывает???
32 galimova_alsou
 
23.05.14
13:28
Надо смотреть код. Больше тут нечего посоветовать..
33 mukilka
 
23.05.14
13:32
(32) АААА)))) Ачуметь)
34 mukilka
 
23.05.14
13:44
(32)  Не могу найти причину(( сдаюсь((
// Выполняет движение по регистру.
//
// Параметры:
//  НаборДвижений               - набор движений регистра,
//  ПустыеКолонкиСоставногоТипа - структура, содержащая имена измерений,ресурсов и
//  реквизитов составного типа, которые могут содержать пустые ссылки.
//
Процедура ВыполнитьДвижениеПоРегистру(НаборДвижений, ВидДвижения = Неопределено,
                                      ПустыеКолонкиСоставногоТипа = Неопределено, ЗаполнитьПериод = истина) Экспорт

    ТаблицаДвижений = НаборДвижений.мТаблицаДвижений;
    Если ТаблицаДвижений.Количество() = 0 Тогда
        Возврат;
    КонецЕсли;
    
    Если ПустыеКолонкиСоставногоТипа = Неопределено Тогда
        ПустыеКолонкиСоставногоТипа = Новый Структура;
    КонецЕсли;
    
    МетаРег = НаборДвижений.Метаданные();
    ИзмеренияСостТипа = Новый Структура;
    Для Каждого МетаИзм Из МетаРег.Измерения Цикл
        Если (МетаИзм.Тип.Типы().Количество() > 1)
           И НЕ (ПустыеКолонкиСоставногоТипа.Свойство(МетаИзм.Имя)) Тогда
            ИзмеренияСостТипа.Вставить(МетаИзм.Имя);
        КонецЕсли;
    КонецЦикла;
    Для Каждого МетаРек Из МетаРег.Реквизиты Цикл
        Если (МетаРек.Тип.Типы().Количество() > 1)
           И НЕ (ПустыеКолонкиСоставногоТипа.Свойство(МетаРек.Имя)) Тогда
            ИзмеренияСостТипа.Вставить(МетаРек.Имя);
        КонецЕсли;
    КонецЦикла;
    Для Каждого МетаРес Из МетаРег.Ресурсы Цикл
        Если (МетаРес.Тип.Типы().Количество() > 1)
           И НЕ (ПустыеКолонкиСоставногоТипа.Свойство(МетаРес.Имя)) Тогда
            ИзмеренияСостТипа.Вставить(МетаРес.Имя);
        КонецЕсли;
    КонецЦикла;
    
    // Откопируем остальные колонки (структура таблиц совпадает).
    ПерваяКолонка = Истина;
    МассивСтрок   = Новый Массив(ТаблицаДвижений.Количество());
    ЕстьПериод    = НЕ ТаблицаДвижений.Колонки.Найти("Период") = Неопределено;
    Для каждого Колонка Из ТаблицаДвижений.Колонки Цикл

        ИмяКолонки = Колонка.Имя;
        Если ИмяКолонки <> "Период"
           И ИмяКолонки <> "Активность"
           И ИмяКолонки <> "НомерСтроки"
           И ИмяКолонки <> ""
           И ?(ИмяКолонки = "ВидДвижения", ВидДвижения = Неопределено, Истина)
           И ИмяКолонки <> "МоментВремени" Тогда
          
            Если ИзмеренияСостТипа.Свойство(ИмяКолонки) Тогда
                ФлагКолонкиСостТипа = Истина;
            Иначе
                ФлагКолонкиСостТипа = Ложь;
            КонецЕсли;
            
            Индекс = 0;
            Для каждого СтрокаТаблицы Из ТаблицаДвижений Цикл

                Если ПерваяКолонка Тогда
                    
                    Если ВидДвижения = ВидДвиженияНакопления.Приход Тогда
                        СтрокаДвижения = НаборДвижений.ДобавитьПриход();
                    ИначеЕсли ВидДвижения = ВидДвиженияНакопления.Расход Тогда
                        СтрокаДвижения = НаборДвижений.ДобавитьРасход();
                    Иначе
                        СтрокаДвижения = НаборДвижений.Добавить(); // Для оборотных регистров
                    КонецЕсли;
                    
                    МассивСтрок[Индекс] = СтрокаДвижения;
                    СтрокаДвижения.Период = НаборДвижений.мПериод;
                    Если не ЗаполнитьПериод и ЕстьПериод И НЕ СтрокаТаблицы.Период = '00010101' Тогда
                        СтрокаДвижения.Период = СтрокаТаблицы.Период;
                    Иначе
                        СтрокаДвижения.Период = НаборДвижений.мПериод;
                    КонецЕсли;
                    
                Иначе
                    
                    СтрокаДвижения = МассивСтрок[Индекс];
                    
                КонецЕсли;
                
                Индекс = Индекс + 1;
                
                ЗначКолонки = СтрокаТаблицы[ИмяКолонки];
                Если ФлагКолонкиСостТипа Тогда

                    Очистить = Ложь;
                    Если ТипЗнч(ЗначКолонки) = Тип("Число")Тогда
                        Если ЗначКолонки = 0 Тогда
                            Очистить = Истина;
                        КонецЕсли;
                    ИначеЕсли ТипЗнч(ЗначКолонки) = Тип("Строка") Тогда
                        Если ЗначКолонки = "" Тогда
                            Очистить = Истина;
                        КонецЕсли;
                    ИначеЕсли ТипЗнч(ЗначКолонки) = Тип("Дата") Тогда
                        Если ЗначКолонки = '00010101000000' Тогда
                            Очистить = Истина;
                        КонецЕсли;
                    ИначеЕсли ЗначКолонки = Неопределено Или ЗначКолонки.Пустая() Тогда
                        Очистить = Истина;
                    КонецЕсли;

                    Если Очистить Тогда
                        СтрокаДвижения[ИмяКолонки] = Неопределено;
                    Иначе
                        СтрокаДвижения[ИмяКолонки] = ЗначКолонки;
                    КонецЕсли;
                Иначе
                    СтрокаДвижения[ИмяКолонки] = ЗначКолонки;
                КонецЕсли;
                
            КонецЦикла;
            
            ПерваяКолонка = Ложь;
            
        КонецЕсли;

    КонецЦикла;

КонецПроцедуры // ВыполнитьДвижениеПоРегистру()
35 Леша1с
 
23.05.14
15:39
(31)"не приводит к изменениям регистра."
либо данные не меняются, либо - неправильный отбор, и данные вообще пишутся в другое место.
Вся работа с регистрами 1С - это получить/создать набор записей, обработать его, и вновь записать.
36 galimova_alsou
 
23.05.14
15:46
Вы не смотрите тупо текст кода. Используйте отладчик.