Имя: Пароль:
1C
1С v8
Параметр в открытой форме
0 ParamPamPam
 
19.02.19
14:09
В УПП:Мясокомбинат в обычной форме документа ПоступлениеТоваровУслуг была форма "ВалютыИЦены", как в управляемой форме сделать что бы она работала?

//Код кнопки вызова формы в обычной форме документа :

// Процедура вызывается при нажатии кнопки "ЦеныВалюта" командной панели
// табличного поля "Товары", вызывает сервисный механизм для изменения
// общих для всей табличной части "Товары" реквизитов - таких, например,
// как тип цен, валюта и т. д.
&НаКлиенте
Процедура ДействиеЦеныВалюта(Команда)
    
    СпособЗаполненияЦен = Перечисления.СпособыЗаполненияЦен.ПоЦенамНоменклатурыКонтрагентов;
    
    // Задать набор реквизитов для редактирования.
    //СтруктураРеквизитовДокумента = Ценообразование.ПолучитьСтруктуруРеквизитовДокументаДляЦенообразования(ЭтотОбъект);
    СтруктураРеквизитовДокумента.Вставить("НДСВключенВСтоимость");
    СтруктураЗапрещенных = Неопределено;
    Если ВидОперации = Перечисления.ВидыОперацийПоступлениеТоваровУслуг.ВПереработку
     ИЛИ ЭтаФорма.Объект.ДоговорКонтрагента.ВидДоговора = Перечисления.ВидыДоговоровКонтрагентов.СКомитентом Тогда
    
         Если ВидОперации = Перечисления.ВидыОперацийПоступлениеТоваровУслуг.ПокупкаКомиссия Тогда
            СтруктураЗапрещенных = Новый Структура("НДСВключенВСтоимость");
        Иначе
            СтруктураЗапрещенных = Новый Структура("НДСВключенВСтоимость, УчитыватьНДС, СуммаВключаетНДС, РегистрироватьЦеныПоставщика");
        КонецЕсли;
    КонецЕсли;
    
    мВалютаРегламентированногоУчета = УниверсальныеМеханизмыТонкийКлиент.глЗначениеПеременнойНаСервере("ВалютаРегламентированногоУчета");
    
    // Вызов общей формы "Цены и валюта" и пересчеты по результатам выбора в этой форме.
    СтруктураЗначений = Ценообразование.ОткрытьФормуЦеныИВалюта(ЭтотОбъект, СтруктураРеквизитовДокумента, мВалютаРегламентированногоУчета,
                                                СтруктураЗапрещенных, "Товары");
    Если СтруктураЗначений <> Неопределено Тогда
        ЗаполнениеДокументов.ИзменитьЦеныВалюту(ЭтотОбъект, СпособЗаполненияЦен, СтруктураРеквизитовДокумента, СтруктураЗапрещенных, "Товары", мВалютаРегламентированногоУчета, , СтруктураЗначений);
    КонецЕсли;
    УстановитьВидимость();
КонецПроцедуры


У меня в управляемой открывается так:

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

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

    ДокументОбъект1 = ДокументОбъектВЗначениеНаСервере();
    
    // Задать набор реквизитов для
    СтруктураРеквизитовДокумента = Ценообразование.ПолучитьСтруктуруРеквизитовДокументаДляЦенообразования(ДокументОбъект1);
    СтруктураРеквизитовДокумента.Вставить("НДСВключенВСтоимость");
    СтруктураЗапрещенных = Неопределено;
    Если ВидОперации = Перечисления.ВидыОперацийПоступлениеТоваровУслуг.ВПереработку
     ИЛИ ЭтаФорма.Объект.ДоговорКонтрагента.ВидДоговора = Перечисления.ВидыДоговоровКонтрагентов.СКомитентом Тогда
    
         Если ВидОперации = Перечисления.ВидыОперацийПоступлениеТоваровУслуг.ПокупкаКомиссия Тогда
            СтруктураЗапрещенных = Новый Структура("НДСВключенВСтоимость");
        Иначе
            СтруктураЗапрещенных = Новый Структура("НДСВключенВСтоимость, УчитыватьНДС, СуммаВключаетНДС, РегистрироватьЦеныПоставщика");
        КонецЕсли;
    КонецЕсли;
    
    мВалютаРегламентированногоУчета = УниверсальныеМеханизмыТонкийКлиент.глЗначениеПеременнойНаСервере("ВалютаРегламентированногоУчета");
    
    // Вызов общей формы "Цены и валюта" и пересчеты по результатам выбора в этой форме.
    СтруктураЗначений = Ценообразование.ОткрытьФормуЦеныИВалюта(ДокументОбъект1, СтруктураРеквизитовДокумента, мВалютаРегламентированногоУчета,
                                                СтруктураЗапрещенных, "Товары");
    Если СтруктураЗначений <> Неопределено Тогда
        ЗаполнениеДокументов.ИзменитьЦеныВалюту(ДокументОбъект1, СпособЗаполненияЦен, СтруктураРеквизитовДокумента, СтруктураЗапрещенных, "Товары", мВалютаРегламентированногоУчета, , СтруктураЗначений);
    КонецЕсли;

    УстановитьВидимость();
КонецПроцедуры

Скрин формы:
https://b.radikal.ru/b40/1902/b3/e6227c1e6b0d.jpg


Но если меняю значение "Сумма ВКЛ ДНС" ничего не происходит с номенклатурой

Подскажите как передать ДокументОбъект. Спасибо
1 DrWatson
 
19.02.19
14:20
(0) Я так понимаю должно выдавать ошибку  в момент возврата из функции ДокументОбъектВЗначениеНаСервере()?
2 ParamPamPam
 
19.02.19
15:08
(1) Совсем нет, ошибок не возникает.
Если указывать вместо ДокументОбъект1 другие значения: Объект, Объект.Ссылка, ЭтаФорма и пр. ругается что невозможно преобразовать метаданные
3 singlych
 
19.02.19
15:59
навскидку, не размениваясь на оптимизацию серверных вызовов, я бы так сделал

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

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

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

&НаСервере
Процедура ИзменитьЦеныВалюту(СпособЗаполненияЦен, СтруктураРеквизитовДокумента, СтруктураЗапрещенных, СтруктураЗначений, мВалютаРегламентированногоУчета)
    
    ОбъектФормы = РеквизитФормыВЗначение("Объект");
    
    ЗаполнениеДокументов.ИзменитьЦеныВалюту(ОбъектФормы, СпособЗаполненияЦен, СтруктураРеквизитовДокумента, СтруктураЗапрещенных, "Товары", мВалютаРегламентированногоУчета, , СтруктураЗначений);
    
    ЗначениеВРеквизитФормы(ОбъектФормы, "Объект");
    
КонецПроцедуры
4 singlych
 
19.02.19
16:02
(3) а, ну и СпособЗаполненияЦен тоже на сервере надо получать.
Лучше, конечно, все за один вызов.
5 singlych
 
19.02.19
16:09
типа того

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

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

&НаСервере
Процедура ИзменитьЦеныВалюту(Контекст, СтруктураЗначений)
    
    ОбъектФормы = РеквизитФормыВЗначение("Объект");
    
    ЗаполнениеДокументов.ИзменитьЦеныВалюту(ОбъектФормы,
        Контекст.СпособЗаполненияЦен,
        Контекст.СтруктураРеквизитовДокумента,
        Контекст.СтруктураЗапрещенных,
        Контекст.ИмяТабличнойЧасти,
        Контекст.ВалютаРегламентированногоУчета,
        ,
        СтруктураЗначений);
    
    ЗначениеВРеквизитФормы(ОбъектФормы, "Объект");
    
КонецПроцедуры
6 ParamPamPam
 
20.02.19
10:25
Добавил в конце вызов такой процедуры:

&НаСервере
Процедура ДокументОбъектВРеквизитНаСервере(ДокументОбъект)
    ЗначениеВРеквизитФормы(ДокументОбъект, "Объект");    
КонецПроцедуры

и всё работает)
Спасибо всем за ответы
7 singlych
 
20.02.19
12:40
(6) Это потому что в читерском режиме. В чистом управляемом все поломается.