Имя: Пароль:
1C
1С v8
УТ 11.1 Программный ввод на основании документа "УстановкаЦенНоменклатуры"
0 kn
 
30.10.15
15:40
Приветствую, форумчане.
Как правильно программно на основании док ПоступлениеТиУ создать документ УстановкаЦенНоменклатуры?
Делаю так

&НаКлиенте
Процедура ПослеЗаписи(ПараметрыЗаписи)
    
    Оповестить("Запись_ПоступлениеТоваровУслуг", ПараметрыЗаписи, Объект.Ссылка);
   МодификацияКонфигурацииКлиентПереопределяемый.ПослеЗаписи(ЭтаФорма, ПараметрыЗаписи);

//здесь создание УстановкиЦен
    НовыйДокумент = СоздатьУстановкуЦенНоменклатурыНаСервере();
    Если ЗначениеЗаполнено(НовыйДокумент)  Тогда
        
         ОткрытьФорму("Документ.УстановкаЦенНоменклатуры.ФормаОбъекта", Новый Структура("Основание", НовыйДокумент));
        
    КонецЕсли;            
КонецПроцедуры


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

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

Но почему-то документ не заполняется, так понимаю табличная часть документа ВидыЦен не заполняется.Что не так в программном вводе на основании.Если интерактивно из документа ПоступлениеТиУ вводить на основании УстановкуЦенНоменклатуры, то все Ок, какой процедуры не хватает при программном вводе? Подскажите, кто знает.
1 VikingKosmo
 
30.10.15
15:44
Ради интереса открой форму документа УстановкаЦенНоменклатуры, удивись как эта аццкая поделка работает. Закрой и больше никогда не ходи в этот адов документ.
2 kn
 
30.10.15
15:46
приходилось открывать, очень интересно что в Обработкезаполнения вызавается

Процедура ЗаполнитьПоПоступлениюТоваровУслуг(
    Знач ДокументОснование,
    ДанныеЗаполнения)
    
    // Заполним данные шапки документа.
    Запрос = Новый Запрос(
    "ВЫБРАТЬ
    |    ПоступлениеТоваровУслугТовары.Номенклатура КАК Номенклатура,
    |    ПоступлениеТоваровУслугТовары.Характеристика КАК Характеристика,
    |    ПоступлениеТоваровУслугТовары.Упаковка КАК Упаковка,
    |    ВидыЦен.Ссылка КАК ВидЦены,
    |    0 КАК Цена
    |ИЗ
    |    Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары
    |        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ВидыЦен КАК ВидыЦен
    |        ПО (ВидыЦен.УстанавливатьЦенуПриВводеНаОсновании)
    |            И (НЕ ВидыЦен.ПометкаУдаления)
    |ГДЕ
    |    ПоступлениеТоваровУслугТовары.Ссылка = &Ссылка");
    Запрос.УстановитьПараметр("Ссылка", ДокументОснование);
    
    РезультатЗапроса = Запрос.Выполнить();
    Если РезультатЗапроса.Пустой() Тогда
        Текст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
            НСтр("ru = 'Не требуется вводить установку цен номенклатуры на основании документа %1'"),
            ДокументОснование);
        ВызватьИсключение Текст;
    Иначе
        
        ЭтотОбъект.ДокументОснование = ДокументОснование;
        Товары.Загрузить(РезультатЗапроса.Выгрузить());
        
    КонецЕсли;
    
КонецПроцедуры

И все...
3 VikingKosmo
 
30.10.15
15:49
Видимо этого достаточно для интерактивного заполнения документа. Еще раз повторюсь, открой МодульФормыДокумента и проникнись процессом заполнения этого самого документа.
4 kn
 
30.10.15
15:50
как достаточно там даже цены 0!
5 VikingKosmo
 
30.10.15
15:51
(4) 1С так не считает...
6 vantus
 
30.10.15
15:53
(0)  ДанныеЗаполнения = ОбъектНаСервере.Ссылка; в отладчике слева с права что?
7 kn
 
30.10.15
15:56
ДанныеЗаполнения - это просто временная переменная, думаю что там ссылка на док Поступление
8 kn
 
30.10.15
16:00
Видимо в процедуре ПриСозданииНаСервере происходит дальнейшее заполнение, может вот здесь
ДанныеДляРасчетаВычисляемыхЦенНаКлиенте = ЗаполнитьДокумент();
9 FuriKuri
 
30.10.15
16:09
Держи, может пригодится, я как то создавал док программно по нажатию кнопки. Это код из серверной процедуры:

    НовыйДок = Документы.УстановкаЦенНоменклатуры.СоздатьДокумент();
        НовыйДок.Комментарий = Объект.Комментарий;
        НовыйДок.Ответственный = Объект.Ответственный;
        НовыйДок.Дата = ТекущаяДата();
        НовыйДок.Статус = Перечисления.СтатусыУстановокЦенНоменклатуры.Согласован;
        Базовая = Справочники.ВидыЦен.НайтиПоНаименованию("Базовая");
        
        НовыйТипЦен = НовыйДок.ВидыЦен.Добавить();
        НовыйТипЦен.ВидЦены = Базовая;                 
        Рубли = Справочники.Валюты.НайтиПоКоду("643");
        
        Для каждого стр из Объект.Товары цикл
            
            НоваяСтрока = НовыйДок.Товары.Добавить();
            НоваяСтрока.Номенклатура = Стр.Номенклатура;
            НоваяСтрока.Характеристика = стр.Характеристика;
            НоваяСтрока.Цена = стр.БазоваяЦенаГруппы;
            НоваяСтрока.ВидЦены = Базовая;
            НоваяСтрока.ЦенаИзмененаВручную = Истина;
            
            Запрос = Новый Запрос;
            Запрос.Текст = "ВЫБРАТЬ
            |    ХарактеристикиНоменклатуры.Ссылка
            |ИЗ
            |    Справочник.ХарактеристикиНоменклатуры КАК ХарактеристикиНоменклатуры
            |ГДЕ
            |    ХарактеристикиНоменклатуры.Владелец = &Владелец";
            Запрос.УстановитьПараметр("Владелец", Стр.Номенклатура);
            Результат = Запрос.Выполнить().Выгрузить();

            // добавим характеристики номенклатуры
            Для каждого строка из Результат цикл
                НоваяСтрока = НовыйДок.Товары.Добавить();
                НоваяСтрока.Номенклатура = Стр.Номенклатура;
                НоваяСтрока.Характеристика = строка.Ссылка;
                НоваяСтрока.Цена = стр.БазоваяЦенаГруппы;
                НоваяСтрока.ВидЦены = Базовая;
                НоваяСтрока.ЦенаИзмененаВручную = Истина;
            КонецЦикла;
                
        КонецЦикла;
        
        
        Попытка
            НовыйДок.Записать(РежимЗаписиДокумента.Проведение);
            Сообщить("Документ - Установка цен номенклатуры успешно создан!");
            Возврат НовыйДок.Ссылка;
        Исключение
            Сообщить("Не удалось записать документ установки цен: " + ОписаниеОшибки(), СтатусСообщения.Важное);
        КонецПопытки;
10 kn
 
30.10.15
16:12
Спасибо, программно создавать было, загрузка из файла, тут же ввод на основании, там цены все зависимые должны рассчитываться вот в чем полезность.
11 VikingKosmo
 
30.10.15
16:15
(10) для того, что бы рассчитывались зависимые цены все же настоятельно рекомендую изучить процесс их расчета...
12 kn
 
30.10.15
16:24
т.е легких путей не искать?
13 VikingKosmo
 
30.10.15
16:26
в документе УстановкаЦенНоменклатуры? Пятнично!
14 kn
 
30.10.15
18:02
вверх
15 kn
 
30.10.15
19:17
Делюсь, нужно просто было открыть форму документа УстановкаЦенНоменклатуры, а в качестве Основания подставить ссылку на это Поступление.

&НаКлиенте
Процедура ПослеЗаписи(ПараметрыЗаписи)
    
    Оповестить("Запись_ПоступлениеТоваровУслуг", ПараметрыЗаписи, Объект.Ссылка);
   МодификацияКонфигурацииКлиентПереопределяемый.ПослеЗаписи(ЭтаФорма, ПараметрыЗаписи);

ОткрытьФорму("Документ.УстановкаЦенНоменклатуры.ФормаОбъекта",
        Новый Структура("Основание", ПолучитьСсылкуНаЭтотОбъект()));

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

&НаСервере
Функция ПолучитьСсылкуНаЭтотОбъект()
   ОбъектНаСервере = РеквизитФормыВЗначение("Объект");
   Возврат ОбъектНаСервере.Ссылка;
КонецФункции