Имя: Пароль:
1C
1С v8
Как програмно создать и заполнить документ на основании?
0 avcherkasov
 
29.10.13
16:38
Задача: при проведении поступления товаров и услуг на основании программно вводить документ установка цен номенклатуры.
Делаю так:

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

В итоге документ создаётся пустой. Направте на путь истинный, пожалуйста.
1 Wobland
 
29.10.13
16:40
отладчик, конечно, не предлагать?
2 avcherkasov
 
29.10.13
16:45
(1) )) Был я там, решения не нашёл.
3 aka AMIGO
 
29.10.13
16:49
4 Maxus43
 
29.10.13
16:49
в доке УстановкаЦенНоменклатуры в процедуре ОбработкаЗаполнения должно всё заполнятся, юзать дополнительные ЗаполнениеДокументов.ЗаполнитьШапкуДокументаПоОснованию(НовыйДокУстановкаЦен, ЭтотОбъект.Ссылка);
поидее не надо
5 Wobland
 
29.10.13
16:49
а ты верно думаешь, что от магического слова "заполнить" сразу что-то появится в ТЧ?
6 avcherkasov
 
29.10.13
16:55
(5) Это вопрос ко мне или к (4)?
7 Wobland
 
29.10.13
16:56
(6) к тебе. и ещё один: что такое пустой документ?
8 palpetrovich
 
29.10.13
16:59
имхается мне, что табличной части "типы цен" в доке "поступление товаров" нет, ее прийдется таки РукоКодом заполнять, ибо без нее ТЧ Номенклатура (или как там она зовется) - не заполнится
9 avcherkasov
 
29.10.13
17:02
(7) Я имел ввиду документ с пустой табличной частью.
(8) Нет типа цен там, меня интересует вопрос, когда я не программно нажимаю ввести на основании, то док открывается уже заполненным, значит ОюработкаЗаполнения срабатывает, почему она тогда не срабатывает при открытии программно?
10 Wobland
 
29.10.13
17:04
надо как-то себя пересилить и открыть таки отладчик
11 avcherkasov
 
29.10.13
17:06
(5) Дело в том, что на днях писал обработку, где программно создавал один док на основании другого и он открывался уже с заполненной табличной частью. Вот пример:
НовыйДокПереоценка = Документы.ПереоценкаТоваровВРознице.СоздатьДокумент();
                НовыйДокПереоценка.Заполнить(НовыйДок.Ссылка);
        НовыйДокПереоценка.Комментарий = "Записан программно";
        НовыйДокПереоценка.Записать(РежимЗаписиДокумента.Проведение);

В чем прикол с установкой цен?
12 Wobland
 
29.10.13
17:06
(11) ну не умеет установка цен заполнять ТЧ по обработке заполнения. так уж она устроена
13 palpetrovich
 
29.10.13
17:08
(9) где "Нет типа цен там"?
(11) я таки пока не изменил своего мнения, ибо  в Поступлении  ТипЦены - это реквизит, а в УстановкеЦен - это ТЧ
14 Wobland
 
29.10.13
17:10
(13) если это не ЗУП, конечно
15 avcherkasov
 
29.10.13
17:12
(12) Как не умеет, а это тогда для чего?ЗаполнитьТабличнуюЧастьПоПоступлениюНаОсновании(ПараметрОснование);
(14) УТП
16 Wobland
 
29.10.13
17:13
(15) а про это слово речи не было
17 avcherkasov
 
29.10.13
17:18
Как мне этот параметр основание передавать перед открытием документа?
18 Wobland
 
29.10.13
17:20
(17) посмотреть, что там внутре ожидается от параметра, поразмыслить, применить результат работы
19 Serg_1960
 
29.10.13
17:26
Читаю и думаю: а какие именно цены устанавливать по поступления собирается ТС? Цены поставщика? :) Так ведь поставщик их уже установил :)) Тут разумно только зарегистрировать эти цены на основании поступления. Но это уже другой документ и другая тема.

"Бойтесь исполнения своих желаний"(с)
20 avcherkasov
 
29.10.13
17:32
(18) ДокументСсылка там внутри.
(19) Нет не цены поставщика, их механизм мне понятен, а цены номенклатуры, которые в карточке товаров, а изменяет их документ Установка цен. Цены контрагентов мы не используем.
21 1Cv8_accepted
 
29.10.13
17:32
(0) ОбработкаЗаполнения() не предлагать?
22 avcherkasov
 
29.10.13
17:35
(21) А поподробнее можно уточнить ход ваших мыслей?
23 palpetrovich
 
29.10.13
17:50
(22) посмотрел ЗаполнитьТабличнуюЧастьПоПоступлениюНаОсновании(ПараметрОснование); - не все так просто там, наверное надо или повторять фукционал или делать ее экспортной и вызывать

а если не хо, можно обойтись быдлокодом типа:
    НовыйДокУстановкаЦен = Документы.УстановкаЦенНоменклатуры.СоздатьДокумент();
    НовыйДокУстановкаЦен.Заполнить(ПоступлениеТоваровУслуг);
    ЗаполнениеДокументов.ЗаполнитьШапкуДокументаПоОснованию(НовыйДокУстановкаЦен, ПоступлениеТоваровУслуг);
    НовыйДокУстановкаЦен.Дата = ТекущаяДата();
    НоваяСтрока = НовыйДокУстановкаЦен.ТипыЦен.Добавить();
    НоваяСтрока.ТипЦен = ПоступлениеТоваровУслуг.ТипЦен.ТипЦеныНоменклатуры;
    Для КАЖДОГО СтрокаТовары ИЗ ПоступлениеТоваровУслуг.Товары Цикл
        НоваяСтрокаТов = НовыйДокУстановкаЦен.Товары.Добавить();
        НоваяСтрокаТов.Номенклатура = СтрокаТовары.Номенклатура;
        НоваяСтрокаТов.ЕдиницаИзмерения = СтрокаТовары.ЕдиницаИзмерения;
        НоваяСтрокаТов.Цена = СтрокаТовары.Цена;
        НоваяСтрокаТов.ТипЦен = ПоступлениеТоваровУслуг.ТипЦен.ТипЦеныНоменклатуры;
        НоваяСтрокаТов.Валюта = ПоступлениеТоваровУслуг.ТипЦен.ВалютаЦены;
    КонецЦикла;
    Попытка
        НовыйДокУстановкаЦен.Записать();
    Исключение    КонецПопытки;

:)
24 avcherkasov
 
29.10.13
18:06
(23)Да в том то и дело, что она не экспортная.
Ваш код выполняет не все действия, дело в том, что в ТЧ документ Установка цен должны быть не только цена закупки (т.е базовая), но и пересчитываться все расчётные цены товара относительно этой цены. Не подскажите, как проще это реализовать или всю обработку заполнения переносить в документ поступления?
25 Михаил Козлов
 
29.10.13
18:11
(24) В модуле документа установки цен посмотрите код в ОбработкаЗаполнения(Основание). В типовых есть заполнение ТЧ по ПТиУ.
26 avcherkasov
 
29.10.13
18:16
(25) Это всё что есть у меня:
Процедура ОбработкаЗаполнения(Основание)

    Если ТипЗнч(Основание) = Тип("ДокументСсылка.ПоступлениеТоваровУслуг") Тогда

        // Заполним реквизиты из стандартного набора по документу основанию.
        ЗаполнениеДокументов.ЗаполнитьШапкуДокументаПоОснованию(ЭтотОбъект, Основание);
    КонецЕсли;

КонецПроцедуры // ОбработкаЗаполнения()
27 Михаил Козлов
 
29.10.13
18:47
Заполнение по ПТиУ делается в ПередОткрытием() формы.
Либо открывать форму (и сразу закрывать), либо перенести код заполнения из ЗаполнитьТабличнуюЧастьПоПоступлениюНаОсновании(ДокументПоступление,Перезаполнение=Ложь)
28 avcherkasov
 
29.10.13
19:07
Весь код из ЗаполнитьТабличнуюЧастьПоПоступлениюНаОсновании(ДокументПоступление,Перезаполнение=Ложь) переносить как-то неудобно он с собой тянет ещё несколько процедур.
Открывать и закрывать, что вы под этим подразумеваете, не понял?
29 Михаил Козлов
 
29.10.13
20:03
фрм = НовыйДокУстановкаЦен.ПолучитьФорму(...);
фрм.Открыть(); // может модально
фрм.Закрыть();
Может быть можно фрм.ПередОткрытием(сюда параметр) и не открывать.
30 avcherkasov
 
30.10.13
11:03
(29) Результата не дало.
31 avcherkasov
 
01.11.13
18:22
Продолжаем разговор... Док создаётся и заполняется.

Попытка
        мДок = Документы.УстановкаЦенНоменклатуры.СоздатьДокумент().ПолучитьФорму("ФормаДокумента");
        мДок.ПараметрОснование = Ссылка;        
        мДок.Открыть();        
        мДок.ЗаписатьВФорме(РежимЗаписиДокумента.Проведение);
        мДок.Закрыть();
    Исключение
        Сообщить(ОписаниеОшибки());
    КонецПопытки;

Проблема в следующем, документ основание проводится текущей датой, а не датой документа поступления. Как это побороть?
32 Wobland
 
01.11.13
18:25
(31) присвоить какую-нибудь другую дату? не, ты уже проверил. что же делать?..
33 avcherkasov
 
01.11.13
18:26
(32) Дело в том, что форма открыта
34 Wobland
 
01.11.13
18:53
(33) это плохо?
Основная теорема систематики: Новые системы плодят новые проблемы.