|
Нужна помощь в написании обробки. Изменения данных в документах | ☑ | ||
---|---|---|---|---|
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
|
Вы не смотрите тупо текст кода. Используйте отладчик.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |