Имя: Пароль:
1C
1C 7.7
v7: Изменение ТЧ документа. Не меняет
0 AntiBuh
 
23.03.12
08:09
Программно меняю реквизиты ТЧ части документа
ДВижения формируются по новым реквизитам
При открытии формы документа - всё старое

в чем может быть проблема?
56 alxxsssar
 
23.03.12
10:21
(55) была бы она у меня... ветка то не моя)))
57 Tymoha
 
23.03.12
10:25
(56) а ну да ... пардоньте ))) хотя .... судя по имени ТС - точно бухи прячуть, а потом достают из засады ... вот ))))
58 AntiBuh
 
23.03.12
10:31
выборка движений регистра по данному документу может повлиять?
59 Ёпрст
 
23.03.12
10:34
(58) если смотреть сверху -  то сбоку кажется, что снизу ничего не видно ©...
60 alxxsssar
 
23.03.12
10:37
да вряд ли, документ то сам не трогается
61 Irbis
 
23.03.12
10:42
(58) Могут, если после удара бейсбольной битой по голове у тебя шнурки развязываются.
62 Tymoha
 
23.03.12
10:42
(58) поскольку речь идет о ценах ... смею предположить, что речь будет идти или о периодике или об отдельном справочнике с ценами ... но это чистый дедуктивный метод ... )))
63 AntiBuh
 
23.03.12
10:49
вот и я думаю что не причем
но ощущение что реквизиты дока блокируются от изменения
причем все
64 alxxsssar
 
23.03.12
10:50
(62) я выше писал что возможно есть типы цен, а это как раз и предполагает отдельный или справочник или регистр
65 Ёпрст
 
23.03.12
10:50
(63) код покажешь али так и будешь ломаться как ц..а ?
66 AntiBuh
 
23.03.12
11:11
вот так:


Док.ВыбратьДокументы(НачДата, КонДата);
Пока Док.ПолучитьДокумент() = 1 Цикл
Рег.ВыбратьДвиженияДокумента(Док);
Пока Рег.ПолучитьДвижение() = 1 Цикл
 Если Рег.Приход = 1 Тогда
   Продолжить;
 КонецЕсли;
 стр = рег.НомерСтроки();
 Док.ПолучитьСтрокуПоНомеру(стр);    
 ТЗ.НоваяСтрока();
 ТЗ.Номер = стр;
 ТЗ.Номенклатура = Рег.Номенклатура;
 ТЗ.Количество = Док.Количество;
 ТЗ.ЦенаСтарая = Док.Цена;
 ТЗ.Коэффициент = Док.Коэффициент;
 ТЗ.Единица = Док.Единица;
КонецЕсли;
ТЗ.ЦенаНовая  = Окр(Рег.СуммаРуб / Рег.Количество,2);
Док.Цена = ТЗ.ЦенаНовая;
Док.Сумма = Док.Цена * Док.Количество;

КонецЦикла;
док.Записать(); док.Провести();
67 AntiBuh
 
23.03.12
11:12
КонецЦикла
68 Ёпрст
 
23.03.12
11:12
(66) покажи весь код
69 zak555
 
23.03.12
11:12
(66) сначала умножаем, потом делим
70 Ёпрст
 
23.03.12
11:13
хотя не надо .. и так виден бред сразу
71 AntiBuh
 
23.03.12
11:14
(70) ткни носом
72 Ёпрст
 
23.03.12
11:15
(71) ну для начала вот это :
стр = рег.НомерСтроки();
 Док.ПолучитьСтрокуПоНомеру(стр);
73 Ёпрст
 
23.03.12
11:16
Уверен, что есть привязка строки в регистре ?
74 Ёпрст
 
23.03.12
11:17
//Рег.ВыбратьДвиженияДокумента(Док);
Рег.ВыбратьДвиженияДокумента(Док.ТекущийДокумент());
75 Ёпрст
 
23.03.12
11:17
Нахрена там ТЗ уперлаь для этого кода ?!
76 Tymoha
 
23.03.12
11:18
(73) ну ведь было же заявлено что отладчик после записи показывает нужный вариант )))
77 AntiBuh
 
23.03.12
11:18
(72) а как надо?
78 Ёпрст
 
23.03.12
11:19
потом, нужно делать так:

Док.Сумма  = Рег.СуммаРуб;
глПересчетТабЧасти(Док,"Сумма")..
79 Ёпрст
 
23.03.12
11:19
И.. больше кода - т.е весь целиком
80 AntiBuh
 
23.03.12
11:19
(73) уверен
(74) пробовал, всё так же
(75) тз используется еще в другом месте
81 Ёпрст
 
23.03.12
11:19
Нам отсюда не видно твоей незавершенной транзакции
82 Ёпрст
 
23.03.12
11:22
И СуммаРуб - это ресурс ПартииНаличие, там номер строки не привязывается + если автоподбор партий - то может быть несколько строк с одной номенклатурой и разными партиями, т.е весь код в (66) в топку.
83 Ёпрст
 
23.03.12
11:23
че пытался делать автор и так понятно - продать товар по себестоимости, которая на тот момент есть в регистре, токма сделал всё это через ж..у , еще и код не хочет показывать
84 Ёпрст
 
23.03.12
11:24
даже, если строки и привязываются - еще хуже при данном коде
85 AntiBuh
 
23.03.12
11:24
(78) Док.Сумма может не соответствовать Рег.СуммаРуб
этот регистр останется без изменений, содержимое ТЧ влияет на другой
(79) да нет больше ничего
86 AntiBuh
 
23.03.12
11:28
(82) да может быть несколько, но выбирается одна
87 AntiBuh
 
23.03.12
11:29
в данном случае партия одна
88 Ёпрст
 
23.03.12
11:30
(85) :)

ты не поверишь - и на этот тоже - изменятся реквизиты регистра.

А код не весь, не ври
Хотя пофик - он и так идеологически не верный.
Нужно сворачивать движуху регистра по номенклатуре сперва - потом уже изменять СУММУ (а не цену документа)
И у тебя один фиг - незавершенная транзакция в коде. которую ты до сих пор не показал.
89 zak555
 
23.03.12
11:30
(80) > (73) уверен

в курсе, что одна стока может породить несколько движений ?!
90 AntiBuh
 
23.03.12
11:31
(83) да, смысл примерно такой
для расчета цены берется последняя партия по конкретной номенклатуре
91 AntiBuh
 
23.03.12
11:32
нет транзакции
92 Ёпрст
 
23.03.12
11:34
(90) это не верно, нет понятия цены - всегда нужно опперировать понятием сумма

(91) есть, покажи весь код целиком
93 Ёпрст
 
23.03.12
11:36
+ если это типовой Тис, то как минимум, ты не установил новую СуммВзаиморасчетов - тоже болт в регистрах
94 Ёпрст
 
23.03.12
11:37
в общем,  один сплошной косяк.
ЗЫ: покажи весь код целиком
95 AntiBuh
 
23.03.12
12:06
(93) док не реализация, а переделка Перемещения
96 AntiBuh
 
23.03.12
12:07
Регистр ПартииНаличие не изменяется
97 Ёпрст
 
23.03.12
12:09
(96) че правда ?!
И давно это у нас в перемещении появилась сумма ?
Али это перемещение в розницу ?
98 Ёпрст
 
23.03.12
12:12
и если что ПродСтоимость меняется в регистре при перемещении в розницу
99 AntiBuh
 
23.03.12
12:12
(97) да в розницу
100 Ёпрст
 
23.03.12
12:12
Сотка

и .. весь код показывай..
:)
101 AntiBuh
 
23.03.12
12:15
да нечего больше показывать
там несколько условий на выборку и всё
транзакций нет, если только они из каментов конечно как-нибудь вылазят
102 zak555
 
23.03.12
12:21
секретный код
103 AntiBuh
 
23.03.12
12:23
да ничего секретного
все выдал как есть
убрал пару условий и срач коментариев
104 Ёпрст
 
23.03.12
12:27
Как проверяешь

1. что движения в регистре привязаны и привязка соответствует тому, что в табличной части дока ?
2. как проверяешь, что документ не записался ?
105 AntiBuh
 
23.03.12
12:36
(104) не совсем понял вопрос
106 AntiBuh
 
23.03.12
12:38
Движения ПартииНиличие привязываются к строкам, это при проведении задано
а проверка записи документа
Попытка
Док.Записать();
Исключение
Сообщить("Ошибка записи");
Сообщить(ОписаниеОшибки());
КонецПопытки;
Попытка
Док.Провести();
Исключение
Сообщить("Ошибка проведения");
Сообщить(ОписаниеОшибки());
КонецПопытки;
107 Ёпрст
 
23.03.12
12:40
Процедура сформировать()


Док= создатьОбъект("Документ.ПеремещениеТМЦ");
Рег = СоздатьОбъект("Регистр.ПартииНаличие");
ТЗ = СоздатьОбъект("ТаблицаЗначений");
ТЗ.НоваяКолонка("Номенклатура");
ТЗ.НоваяКолонка("Сумма");

Док.УстановитьФильтр(1,0);
Док.ВыбратьДокументы(НачДата, КонДата);
Пока Док.ПолучитьДокумент() = 1 Цикл
Если Док.Склад.РозничныйСклад+Док.СкладПолучатель.РозничныйСклад = 0 Тогда Продолжить; КонецЕсли;
Рег.ВыбратьДвиженияДокумента(Док.ТекущийДокмент);
Пока Рег.ПолучитьДвижение() = 1 Цикл
    Если Рег.Приход = 1 Тогда
        Продолжить;
    КонецЕсли;
    ТЗ.НоваяСтрока();
    ТЗ.Номенклатура = Рег.Номенклатура;
    ТЗ.Сумма = Рег.СуммаРуб;
КонецЦикла;
ТЗ.Свернуть("Номенклатура","Сумма");
Док.ВыбратьСтроки();
Пока Док.ПолучитьСтроку()=1 Цикл
   сч="";
   Если ТЗ.НайтиЗначение(Док.Номенклатура,Сч,"Номенклатура")=1 Тогда
      Док.Сумма = ТЗ.ПолучитьтЗначение(сч,"Сумма");
      глПересчетТаблЧасти(Док,"Сумма");
   КонецЕсли;
КонецЦикла;
Док.Записать();
Док.ПАровести();
КонецЦикла;          

КонецПроцедуры

наслаждайся


док.Записать(); док.Провести();
108 Ёпрст
 
23.03.12
12:41
(106) это п..ц а не проверка..
:)
109 Ёпрст
 
23.03.12
12:42
вот подправил..

Процедура сформировать()


Док= создатьОбъект("Документ.ПеремещениеТМЦ");
Рег = СоздатьОбъект("Регистр.ПартииНаличие");
ТЗ = СоздатьОбъект("ТаблицаЗначений");
ТЗ.НоваяКолонка("Номенклатура");
ТЗ.НоваяКолонка("Сумма");

Док.УстановитьФильтр(1,0);
Док.ВыбратьДокументы(НачДата, КонДата);
Пока Док.ПолучитьДокумент() = 1 Цикл
Если Док.Склад.РозничныйСклад+Док.СкладПолучатель.РозничныйСклад = 0 Тогда Продолжить; КонецЕсли;
ТЗ.УдалитьСтроки();
Рег.ВыбратьДвиженияДокумента(Док.ТекущийДокмент);
Пока Рег.ПолучитьДвижение() = 1 Цикл
    Если Рег.Приход = 1 Тогда
        Продолжить;
    КонецЕсли;
    ТЗ.НоваяСтрока();
    ТЗ.Номенклатура = Рег.Номенклатура;
    ТЗ.Сумма = Рег.СуммаРуб;
КонецЦикла;
ТЗ.Свернуть("Номенклатура","Сумма");
Док.ВыбратьСтроки();
Пока Док.ПолучитьСтроку()=1 Цикл
   сч="";
   Если ТЗ.НайтиЗначение(Док.Номенклатура,Сч,"Номенклатура")=1 Тогда
      Док.Сумма = ТЗ.ПолучитьтЗначение(сч,"Сумма");
      глПересчетТаблЧасти(Док,"Сумма");
   КонецЕсли;
КонецЦикла;
Док.Записать();
Док.Провести();
КонецЦикла;          

КонецПроцедуры
110 Ёпрст
 
23.03.12
12:43
ну и синтаксис там сам исправишь - мне лень.
111 AntiBuh
 
23.03.12
12:48
Спасибо
т.е. получается через ПолучитьСТрокуПоНомеру() не выйдет
и нужен перебор ТЧ
112 Ёпрст
 
23.03.12
12:49
(111) ты не догоняешь - в регистре может быть 20 строк с одинаковой номенклатурой и разных партий.
113 AntiBuh
 
23.03.12
12:51
(112) Понимаю, нужную строку я найду и выберу партию что мне нужна
114 Ёпрст
 
23.03.12
12:53
(113) ?

какая из 20-ти будет нужная ?
115 AntiBuh
 
23.03.12
12:56
(114) та которую укажет бух
может приход в определенную дату, может с опреденным ВхНомером
но скорее всего последняя из списываемых партий
116 Ёпрст
 
23.03.12
12:58
(115) и как твоя поделка узнает об этом, когда ты в цикле перебираешь документы ?
117 AntiBuh
 
23.03.12
13:03
(116) типа из регистра нельзя получить инфу о документе прихода

Пока Рег.ПолучитьДвижение() = 1 Цикл
    Если Рег.Приход = 1 Тогда
        Продолжить;
    КонецЕсли;
    ТЗ.НоваяСтрока();
    ПрихДокумент = Рег.Партия.ПриходныйДокумент;
    ТЗ.Номенклатура = Рег.Номенклатура;
    ТЗ.Сумма = Рег.СуммаРуб;
КонецЦикла;
118 Ёпрст
 
23.03.12
13:22
(117) чудак человек.
Как ты слова буха будешь превращать в действия ?
будешь делать таблицу соответствия для каждой номенклатуры ?
Для каждого документа ?
119 AntiBuh
 
23.03.12
13:40
(118) скорее всего нужна будет последняя партия из набора партий
это третье дело
120 Ёпрст
 
23.03.12
13:43
(119) что значит последня ?
121 AntiBuh
 
23.03.12
13:47
Последняя попавшая в документ по данной позиции номенклатуры
122 AntiBuh
 
23.03.12
13:50
короче проблему с незаписью реквизитов решил
как - говорить не буду - стыдно
123 Ёпрст
 
23.03.12
13:51
(122) это, еще сыграем в угадайку на 100 постов ?
:)

колись давай, нам всем за тебя стыдно
124 AntiBuh
 
23.03.12
13:53
(123) :))))
125 AntiBuh
 
23.03.12
13:54
СделатьНеПроведенным() слегка не вовремя :)
126 Ёпрст
 
23.03.12
13:56
(125) ну ёпт, грили же тебе - больше кода
127 AntiBuh
 
23.03.12
14:01
зато пятница удалась
128 Tymoha
 
23.03.12
14:03
(125) хммм .... ну и как это коррелирует с заявлением "в отладчике при записи все гуд"???
129 viktor_vv
 
23.03.12
14:06
Ну наконец-то :). Правда я тоже не понял как СделатьНеПроведенным повлияло на незапись документа.
130 AntiBuh
 
23.03.12
14:09
(128)потому что "не вовремя"
попробуй такую последовательность
заполняется реквизит, Распроводится, Записывается, Проводится
131 Ёпрст
 
23.03.12
14:11
(129) при переборе движений в цикл не заходило, таб часть дока не менялась
132 Tymoha
 
23.03.12
14:13
(131) ТС утверждал, что в момент записи отладчик показывал результат, нужный ТС ... КАК????
133 AntiBuh
 
23.03.12
14:14
(132) и продолжаю утверждать, так и было
134 Ёпрст
 
23.03.12
14:22
(132) я хз, код то свой он так и не показал весь целиком
135 viktor_vv
 
23.03.12
14:22
(131) Теперь понятно. ТС'у надо разведчиком работать :).
136 viktor_vv
 
23.03.12
14:23
(135)+ или шпионом, смотря с какой стороны смотреть :).
137 AntiBuh
 
23.03.12
14:37
(136) я Наш :)
было примерно так

Процедура сформировать()


Док= создатьОбъект("Документ.ПеремещениеТМЦ");
Рег = СоздатьОбъект("Регистр.ПартииНаличие");
ТЗ = СоздатьОбъект("ТаблицаЗначений");
ТЗ.НоваяКолонка("Номенклатура");
ТЗ.НоваяКолонка("Сумма");

Док.УстановитьФильтр(1,0);
Док.ВыбратьДокументы(НачДата, КонДата);
Пока Док.ПолучитьДокумент() = 1 Цикл
Если Док.Склад.РозничныйСклад+Док.СкладПолучатель.РозничныйСклад = 0 Тогда Продолжить; КонецЕсли;
ТЗ.УдалитьСтроки();
Рег.ВыбратьДвиженияДокумента(Док.ТекущийДокмент);
Пока Рег.ПолучитьДвижение() = 1 Цикл
    Если Рег.Приход = 1 Тогда
        Продолжить;
    КонецЕсли;
    ТЗ.НоваяСтрока();
    ТЗ.Номенклатура = Рег.Номенклатура;
    ТЗ.Сумма = Рег.СуммаРуб;
КонецЦикла;
ТЗ.Свернуть("Номенклатура","Сумма");
Док.ВыбратьСтроки();
Пока Док.ПолучитьСтроку()=1 Цикл
   сч="";
   Если ТЗ.НайтиЗначение(Док.Номенклатура,Сч,"Номенклатура")=1 Тогда
      Док.Сумма = ТЗ.ПолучитьтЗначение(сч,"Сумма");
      глПересчетТаблЧасти(Док,"Сумма");
   КонецЕсли;
КонецЦикла;
//------
Док. СделатьНеПроведенным();
//------
Док.Записать();
Док.Провести();
КонецЦикла;          

КонецПроцедуры
138 alxxsssar
 
23.03.12
14:38
не понимаю как СделатьНеПроведенным() повлияло на изменение суммы в ТЧ. Я тупой наверное
139 Tymoha
 
23.03.12
14:38
(133) да дело в том что наиболее вероятный вариант в (131) .. и он абсолютно противоречит варианту в (130) ... в общем, что-то тут не так )))). ну да ладно - проблема решилась и хорошо ... только вот реально: в след раз лучше сначала отладчиком проверяй, а не на 130 постов телепатические навыки ёпрста проверяй )))
140 Tymoha
 
23.03.12
14:40
(137) а приведи-ка, мил человек, код Обработки отмены проведения ....
141 Ёпрст
 
23.03.12
14:49
(137) забавно, отменяет ли СделатьНеПроведенным все изменения с переменной Док ?
лень проверять - никогда так не писал, хотя, всё может быть
142 AntiBuh
 
23.03.12
14:50
(138)вот в том то и фокус
переставил перед Док.ВыбратьСтроки() и получилось щастье
(140) а нет ее
143 Ёпрст
 
23.03.12
14:50
(142) а зачем ты его распроводишь?
144 AntiBuh
 
23.03.12
14:52
(141) если и изменяет то весьма странно, после отмены проведения в самой переменной ничего не изменилось, точнее всё осталось измененным
и движения сформировались с измененными данными
145 viktor_vv
 
23.03.12
14:53
(141) У меня тоже была первая мысль об этом.
146 AntiBuh
 
23.03.12
14:53
(143) это с первого варианта еще осталось
время документа изменял
147 Tymoha
 
23.03.12
14:56
(142) ну так а как же отладчик при записи???
148 Ёпрст
 
23.03.12
14:57
(147) если предположение в (141) верно, то отладчик будет всё верно казать.. как и говорил автор
149 Tymoha
 
23.03.12
15:04
(148) с каких делов? ведь отмена проведения происходила после заполнения ТЧ, но перед записью ... соответственно - если отмена проведения сбрасывает все итерации с ТЧ, то как жеж отладчик будет правильно казать? ... ниче не понимаю ((((
150 viktor_vv
 
23.03.12
15:05
(148) Заинтриговали. Проверил. СделатьНеПроведенным не отменяет изменения.

Процедура Сформировать()
   ДокРН = СоздатьОбъект("Документ.РасходнаяНакладная") ;
   
   ДокРН.НайтиДокумент(фасРН);
   Сообщить(ДокРН.ВидРасхода);
   ДокРН.ВидРасхода = Перечисление.ВидыРасхода.Нал ;
   Сообщить(ДокРН.ВидРасхода);
   ДокРН.СделатьНеПроведенным() ;
   Сообщить(ДокРН.ВидРасхода);
   ДокРН.Записать();
   Сообщить(ДокРН.ВидРасхода);
КонецПроцедуры

Результат.

По счету
Нал
Нал
Нал

то есть СделатьНеПроведенным вызывает неявную запись объекта с изменениями.
151 viktor_vv
 
23.03.12
15:11
А посыпаю голову. В базе все осталось по старому :).
152 viktor_vv
 
23.03.12
15:15
Вот так нагляднее будет.

//*******************************************
Процедура Сформировать()
   ДокРН = СоздатьОбъект("Документ.РасходнаяНакладная") ;
   ДокРНПроверка = СоздатьОбъект("Документ.РасходнаяНакладная") ;
   ДокРНПроверкаЗапись = СоздатьОбъект("Документ.РасходнаяНакладная") ;
   
   ДокРН.НайтиДокумент(фасРН);
   Сообщить(ДокРН.ВидРасхода);
   
   ДокРН.ВидРасхода = Перечисление.ВидыРасхода.Нал ;
   Сообщить(ДокРН.ВидРасхода);
   
   ДокРН.СделатьНеПроведенным() ;
   
   ДокРНПроверка.НайтиДокумент(ДокРН.ТекущийДокумент());
   Сообщить(ДокРНПроверка.ВидРасхода);
   
   ДокРН.Записать();
   ДокРНПроверкаЗапись.НайтиДокумент(ДокРН.ТекущийДокумент());
   
   Сообщить(ДокРНПроверкаЗапись.ВидРасхода);    
   //Сообщить(ДокРН.ВидРасхода);
КонецПроцедуры


Результат.

По счету
Нал
По счету
По счету
153 Tymoha
 
23.03.12
15:17
(151), (152) - офигеть ... ТС, приношу свои извинения за недоверчивость ))))
154 AntiBuh
 
23.03.12
15:21
секретная недокументированная фича 1С :)
155 alxxsssar
 
23.03.12
15:26
вот веть пиляха муха
Независимо от того, куда вы едете — это в гору и против ветра!