Имя: Пароль:
1C
1С v8
Не могу разобраться с механизмом ввода на основании
,
0 Irena100
 
15.01.16
21:59
Всем привет!

Создаю документ на основании, в котором есть поле, связанное с документом Партия - Партия.Цена (это ссылка на реквизит документа Партия - Цена).

Когда создаю документ на основании в первый раз - все суммы подхватываютя из документа Партия.

Когда меняю в партии эту цену и перепровожу программно, так:

Док = СсылкаНаПартию.ПолучитьОбъект;
Док.Цена = 10;
Док.Записать(РежимЗаписиДокумента.Проведение,РежимПроведенияДокумента.Неоперативный);

То при повторном создании документа на основании цена не меняется, не обновляется на 10!!!

Когда захожу в документ Партия и меняю цену, проводу вручную - нажимаю кнопку, то при создании документа на основании - Все ОК! Цена меняется, ПОЧЕМУ?

Т.е. есть ли различие в 8.3 программно ли мы проводим документ или интерактивно(нажатием кнопки)? Почему документ записан, проведен, стоит правильная цена - 10(как в примере), а у документа в связанном поле(Партия.Цена) - другое значение - предыдущее?
1 Irena100
 
15.01.16
22:05
Мучаюсь пол-дня, подскажите, люди добрые!

Программно текст этого поля не поменяешь, поле связано с реквизитом документа Партия.
2 Irena100
 
15.01.16
22:07
Когда проводишь документ программно, то сообщения "Изменено:" справа экрана не появляется, может дело в этом? Что-то где-то не прописывается? Может на клиент не попадает новое значение!?
3 PR третий
 
15.01.16
22:10
Читал читал, читал читал...
Так короче и не понял нихрена.
Ну его нахрен.
Тем более фотки нет.
4 Irena100
 
15.01.16
22:18
Поясню короче...

Есть поле ТЧ документа - Цена, значение которого - документ Партия.Цена.

В документе цена - 10, он проведен программно, а в этом поле - допустим 5 (другая цифра), почему?

Когда нажимаю провести на форме документа Партия, то в документе правильная цена - 10.
5 Cyberhawk
 
15.01.16
22:54
При интерактивном проведении (из формы) сначала отрабатывает код модуля формы, а затем уже код модуля объекта и подписок.
При программном проведении отрабатывает только код модуля объекта и подписок, так что причина тому, что что-то не дозаполняется, в том, что это предусмотрено только в модуле формы.
6 Irena100
 
16.01.16
12:29
Я закоментировала ВСЕ, что было в модуле формы, проверила, когда проводишь нажатием кнопки "Провести", все ОК. Т.е. даже при пустом коде модуля формы.
7 kotletka
 
16.01.16
12:31
Отладчиком могёшь?
8 MishaD
 
16.01.16
12:31
а в той ли форме заккоментировала ?
9 Irena100
 
16.01.16
13:12
Когда в первый раз создаешь документ на основании, то все ОК!

Когда второй, третий, то :

Документ Партия проведен, реквизит цена в нем - 10.

А в этом документе на основании в поле цена стоит - 5. Хотя это поле цена напрямую связано с реквизитом документа Партия, который равен - 10.

Т.е. как-то 1с 8.3. помнит предыдущий документ, созданный на основании...!? Или на клиенте не обновляет данные по документу Партия при программном проведении.
10 Irena100
 
16.01.16
13:18
Потом захожу в документ Партия(документ проведен, цена внем 10), нажимаю кнопку провети, все Ок, цена в документе на основаниии меняется на 10.
11 GROOVY
 
16.01.16
13:23
Что написано в обработчике события ОбработкаЗаполнения?
12 Irena100
 
16.01.16
13:24
Мне кажется, что дело в повторном вводе на основании. Как-то данные первого введенного на основании документа сохраняюся и обновляются только те, которые прописаны в обработке заполнения, а другие не обновляются.
13 Irena100
 
16.01.16
13:25
Я здесь ничего не меняла - 1с 8.3.

Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
    
    ТипДанныхЗаполнения = ТипЗнч(ДанныеЗаполнения);
    Если ДанныеЗаполнения <> Неопределено И ТипДанныхЗаполнения <> Тип("Структура")
        И Метаданные().ВводитсяНаОсновании.Содержит(ДанныеЗаполнения.Метаданные()) Тогда
        ЗаполнитьПоДокументуОснованию(ДанныеЗаполнения);
    Иначе
        СуммаВключаетНДС = Ложь; //1С-Минск
    КонецЕсли;
    ЗаполнениеДокументов.Заполнить(ЭтотОбъект, ДанныеЗаполнения);
    
    // Заполнение реквизитов, специфичных для документа:
    Если ЗначениеЗаполнено(Организация)
        И ЗначениеЗаполнено(Контрагент)
        И ЗначениеЗаполнено(ДоговорКонтрагента) Тогда
        Документы.РеализацияТоваровУслуг.ЗаполнитьСчетаУчетаРасчетов(ЭтотОбъект);
    КонецЕсли;
    
КонецПроцедуры
14 Irena100
 
16.01.16
13:26
А вот мой код...
//{{__КОНСТРУКТОР_ВВОД_НА_ОСНОВАНИИ
    // Данный фрагмент построен конструктором.
    // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!    
        ИначеЕсли ТипЗнч(Основание) = Тип("ДокументСсылка.ОтчетПроизводстваЗаСмену") Тогда
        // Заполнение шапки
        Комментарий = Основание.Комментарий;
        Организация = Основание.Организация;
        Ответственный = Основание.Ответственный;
        ПодразделениеОрганизации = Основание.ПодразделениеОрганизации;
        РучнаяКорректировка = Основание.РучнаяКорректировка;
        Склад = Основание.Склад;
        
        
        Для Каждого ТекСтрокаТовары Из Товары Цикл
      // Если Элемент.Цена=0 Тогда
           Товары.Удалить(ТекСтрокаТовары);
      // КонецЕсли;
   КонецЦикла;  
        
        Для Каждого ТекСтрокаПродукция Из Основание.Продукция Цикл
            НоваяСтрока = Товары.Добавить();
            
            ИзменитьЦену(ТекСтрокаПродукция.ДокументОприходования, ТекСтрокаПродукция.ЦенаИзготовителя);
                        
            НоваяСтрока.ЕдиницаИзмерения = ТекСтрокаПродукция.ЕдиницаИзмерения;
            НоваяСтрока.КоличествоМест = ТекСтрокаПродукция.КоличествоМест;
            НоваяСтрока.Коэффициент = ТекСтрокаПродукция.Коэффициент;
            НоваяСтрока.Количество = ТекСтрокаПродукция.Количество;
            НоваяСтрока.Номенклатура = ТекСтрокаПродукция.Номенклатура;
            НоваяСтрока.Цена = ТекСтрокаПродукция.ПлановаяСтоимость;
            НоваяСтрока.Сумма = ТекСтрокаПродукция.СуммаПлановая;
            НоваяСтрока.СчетУчета = ТекСтрокаПродукция.Счет;
            
            НоваяСтрока.ДокументОприходования = ТекСтрокаПродукция.ДокументОприходования;
                        
        //    НоваяСтрока.ДокументОприходования.ПолучитьОбъект().Записать(РежимЗаписиДокумента.Проведение,РежимПроведенияДокумента.Неоперативный);
            
        //    Сообщить(НоваяСтрока.ДокументОприходования.Цена);        
            
            НоваяСтрока.СтавкаНДС = ТекСтрокаПродукция.Номенклатура.СтавкаНДС;
            НоваяСтрока.Субконто = Справочники.НоменклатурныеГруппы.НайтиПоНаименованию("Производсто и оптовая торговля",1,,);
            
            НоваяСтрока.ЦенаИзготовителя = ТекСтрокаПродукция.ЦенаИзготовителя;

            
          ОбработкаТабличныхЧастейКлиентСервер.РассчитатьСуммуНДСТабЧасти(НоваяСтрока, ЭтотОбъект.СуммаВключаетНДС, ЭтотОбъект.ПорядокОкругленияДЧВ); //1С-Минск
    
        ДанныеОбъекта = Новый Структура(
        "Дата, ВидОперации, Организация, ДеятельностьНаПатенте,
        |Склад, ТипЦен, ВалютаДокумента, КурсВзаиморасчетов, КратностьВзаиморасчетов,
        |СуммаВключаетНДС, ДоговорКонтрагента,
        |ЭтоКомиссия, Реализация, ПорядокОкругленияДЧВ"); //1С-Минск
        ЗаполнитьЗначенияСвойств(ДанныеОбъекта, ЭтотОбъект);
        ДанныеОбъекта.ЭтоКомиссия    = ЛОЖЬ;
        ДанныеОбъекта.Реализация    = Истина;

        СведенияОНоменклатуре = БухгалтерскийУчетПереопределяемый.ПолучитьСведенияОНоменклатуре(
        НоваяСтрока.Номенклатура, ДанныеОбъекта);
        Если СведенияОНоменклатуре = Неопределено Тогда
            Возврат;
        КонецЕсли;
        
        Документы.РеализацияТоваровУслуг.ЗаполнитьСчетаУчетаВСтрокеТабличнойЧасти(
        ДанныеОбъекта, НоваяСтрока, "Товары", СведенияОНоменклатуре);
        КонецЦикла;
    
        Для Каждого ТекСтрокаУслуги Из Основание.Услуги Цикл
            НоваяСтрока = Услуги.Добавить();
            НоваяСтрока.Количество = ТекСтрокаУслуги.Количество;
            НоваяСтрока.Номенклатура = ТекСтрокаУслуги.Номенклатура;
        КонецЦикла;
    //}}__КОНСТРУКТОР_ВВОД_НА_ОСНОВАНИИ
    //)рэ Ирина 14.01.2016
        
    КонецЕсли;
15 Irena100
 
16.01.16
13:28
НоваяСтрока.ДокументОприходования - это документ Партия.

А его реквизит - Цена в документе на основании - Объект.ДокументОприходования.Цена.
16 GROOVY
 
16.01.16
13:32
(12)  Это бред.
Наверно соглашусь с коллегой из (3). Удачи.
17 Irena100
 
16.01.16
13:33
Второй код вызывается в процедуре ЗаполнитьПоДокументуОснованию(ДанныеЗаполнения);
18 Soul771
 
16.01.16
23:53
Поставьте точку останова на первой строке вашего кода из (0), вот этого:

Док = СсылкаНаПартию.ПолучитьОбъект;
Док.Цена = 10;
Док.Записать(РежимЗаписиДокумента.Проведение,РежимПроведенияДокумента.Неоперативный);

посмотрите, заходит ли вообще в эти строки?
чему равна цена до захода в этот кусок кода, чему после...
19 hhhh
 
16.01.16
23:57
вот это вообще бред, кто же так пишет

     Для Каждого ТекСтрокаТовары Из Товары Цикл
      // Если Элемент.Цена=0 Тогда

           Товары.Удалить(ТекСтрокаТовары);
      // КонецЕсли;

   КонецЦикла;  


напишите

Товары.Очистить();
20 Irena100
 
17.01.16
19:11
(19) Я это вообще удалила... Ненужный кусок кода...

(18) Документ Партия записан, проведен - это точно!!!

Вывожу сообщение цены - цена в нем 10! Это точно!!!

Причет если создать документ на основании в первый раз - все работает и этот код правильный!

Когда меняю цену в партии программным проведением, то при создании документа на основании во второй раз, третий - в партии цена - 10, а  в этом поле, на прямую связанном с реквизитом цена Партии - 5.
21 Irena100
 
17.01.16
19:14
Не разобралась... Заменила связанное поле Объект.ДокументОприходования.Цена на обычное: Объект.Цена.

Заполняю Объект.Цена программно:

Объект.Цена = Объект.ДокументОприходования.Цена.

Все работает. Может недоработка платформы?
22 Irena100
 
17.01.16
19:17
У меня в коде это выглядит так:

НоваяСтрока.ДокументОприходования = ТекСтрокаПродукция.ДокументОприходования;

НоваяСтрока.ЦенаПост = НоваяСтрока.ДокументОприходования.Цена;
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн