Ошибка при вызове метода контекста данныеформывзначение

ДанныеФормыВЗначение для внешней обработки ☑ 0

NikePopov

22.06.15

10:45

Добрый день!

Хочу воспользоваться возможностью процедур с директивой «&НаСервереБезКонтекста» во внешней обработке. Все механизмы заполнения у меня в модуле объекта внешней обработки. У обработки при этом довольно увесистая форма, которую при каждом заполнении таскать на сервер нет никакого желания.

Пример кода:

&НаКлиенте

Процедура Команда1(Команда)

    Команда1НаСервере(Объект);

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

&НаСервереБезКонтекста

Процедура Команда1НаСервере(Объект)

    ВнешняяОбработкаОбъект = ДанныеФормыВЗначение(Объект, Тип(«ВнешняяОбработкаОбъект.ВнешняяОбработка1»));

КонецПроцедуры // Команда1НаСервере()

При выполнении функции «ДанныеФормыВЗначение» возникает ошибка :

{Форма.Форма.Форма(10)}: Ошибка при вызове метода контекста (ДанныеФормыВЗначение)

    ВнешняяОбработкаОбъект = ДанныеФормыВЗначение(Объект, Тип(«ВнешняяОбработкаОбъект.НабивкаБлюд»));

по причине:

Несоответствие типов (параметр номер ‘2’)

Не могу понять как требуется указывать второй параметр функции «ДанныеФормыВЗначение». Если обработка внутри конфигуркции, то проблемы нет.

Возможность обхода через процедуру «&НаСервере» я знаю, но такой подход сильно замедляет выполнение. Переносить процедуры заполнения в форму тоже не хочется.

1

mikecool

22.06.15

10:46

нафейхоа безконтекста??

2

NikePopov

22.06.15

10:47

Передача самой формы на сервер довольно долгое занятие, так как на форме довольно много разнообразных данных. Если пользоваться НаСервереБезКонтекста, то выполнение процедуры очень сильно ускоряется.

3

NikePopov

22.06.15

10:55

Интересно, что ТипЗнч(РеквизитФормыВЗначение(«Объект»)) <> Тип(«ВнешняяОбработкаОбъект.ВнешняяОбработка1»)

А вот Строка(ТипЗнч(РеквизитФормыВЗначение(«Объект»))) = Строка(Тип(«ВнешняяОбработкаОбъект.НабивкаБлюд»)) .

4

NikePopov

22.06.15

10:55

(3) В последнем месте опечатка: вместо «НабивкаБлюд» — «ВнешняяОбработка1»

5

NikePopov

22.06.15

10:55

На нескольких обработках тестирую))

6

Aprobator

22.06.15

10:56

(2) ага, только вот без контекста нет на сервере реквизитов формы.

7

NikePopov

22.06.15

10:57

Я специально для этого убрал директиву над функцией. С целью проверки.

8

Aprobator

22.06.15

11:28

Попробуй на стороне сервера получить для теста через РеквизитФормыВЗначение — там тип не обязателен.

9

hhhh

22.06.15

11:39

(7) а что вы там тестируете? вы же создаете свой контекст. Ваш контекст думаете будет быстрее нуралиевского?

10

NikePopov

22.06.15

12:03

(8) РеквизитФормыВЗначение  — это метод формы. Если использовать его то от «БезКонтекста» придется отказаться, что опять же приведет к большему времени передачи формы с клиента на сервер и обратно.

(9) Я не хочу тянуть контекст формы. Он мне не интересен. Для выполнения требуемых мне действий мне выше крыши хватит только объекта внешней обработки. Весь контекст тянуть долго.

11

ДенисЧ

22.06.15

12:13

При БезКонтекста — ты не имеешь контекста. Ваш Кэп.

неоткуда получать.

12

NikePopov

22.06.15

12:35

(11) Это здорово, но не очень ясно как эту интересную информацию можно применить))

13

DTXqueque

22.06.15

12:41

(10) >Я не хочу тянуть контекст формы. Он мне не интересен. Для выполнения требуемых мне действий мне выше крыши хватит только объекта внешней обработки. Весь контекст тянуть долго.

Курлык-курлык.. Интересно, а что там ещё в контекст попадёт кроме объекта обработки?)

14

Fragster

22.06.15

12:42

из-за этого в своих внешних обработках отказался от модуля обработки вообще — всё в форме.

15

NikePopov

22.06.15

13:10

(13) Приличное количество объектов. Мало того, эти объекты — не ссылки, а целые таблицы, динамические списки, объекты, табличные документы. То, что должен видеть пользователь, а там довольно разнообразная информация.

Объект — это способ заполнения, так скажем, одной записи. А таких записей в форме может быть довольно много.

16

NikePopov

22.06.15

13:12

(14) Так раньше и делал, но теперь хотел бы решить для себя: есть ли возможность использовать форму — как способ отображения информации пользователю, а объект — как отдельный инструмент заполнения.

17

Aprobator

22.06.15

13:17

(10) я понимаю, для чего всё это делается. Просто отладчиком можно будет посмотреть тип объекта и сравнить его с тем, что выдаёт Тип(«ВнешниеОбработки……») и получить дальнейшую информацию для размышлений.

18

DTXqueque

22.06.15

13:24

(15) Ну да, если ты в обработке наплодил кучу сущностей.

Если хочешь отказаться от контекста, передавай нужные параметры в качестве параметров процедуры без контекста.

19

Fragster

22.06.15

13:26

(18) вот пишешь ты обработку и под управляемые и под обычные формы, логично записать общие функции в модуль обработки. а в УФ — еще и без контекста к ним обращаться, чтобы работало поживее.

20

DTXqueque

22.06.15

13:33

(19) Не понял. Ты намекаешь на то, что без контекста можно вызвать процедуры модуля?

21

NikePopov

24.06.15

13:20

(17) В том то и проблема: в (3) я уже так и сделал. Результат удивил. У объекта «Тип» нельзя понять как именно требуется его получить.

(18) Мне нужны не параметры(нужны в меньшей степени), а методы ОбработкаОбъекта. Я хочу все обработки заполнения выполнять в модуле объекта, а формой пользоваться для показа результата пользователю в нужном ему виде.

(20) Да! Именно для этого и затевал обсуждение!

22

cathode

24.06.15

22:23

(0) Тебе точно нужен вызов метода объекта без контекста?

Если модуль объекта используется как библиотека процедур, то в управляемой форме можно сделать так:

1. Создать реквизит формы ОбъектТип, тип «строка неограниченной длины».

2. В ПриСозданииНаСервере:

    // Сохраням тип реквизита Объект для вызовов без контекста.

    ОбъектТип = СтрЗаменить(РеквизитФормыВЗначение(«Объект»).Метаданные().ПолноеИмя(), «.», «Объект.»);

3. Во внеконтекстную серверную процедуру передаем Знач ОбъектТип (можно еще передать Знач Объект, если нужны его данные):

    ОбъектЗначение = Новый(Тип(ОбъектТип));

    // Если передали Объект

    ЗаполнитьЗначенияСвойств(ОбъектЗначение, Объект);

    Результат = ОбъектЗначение.ЭкспортныйМетод();

    Возврат Результат;

В результате получаем вызов метода объекта без передачи контекста, но тип объекта в виде строки для таких вызовов нужно хранить на клиенте.

23

NikePopov

26.06.15

13:33

(22) Вот! Это действительно супер! Есть конечно минус с переносом данных реквизитов и табличных частей(их надо переносить перед экспортным методом в «ОбъектЗначение», а после из «ОбъектЗначение» в «Объект»), но уже отлично!

Всем привет ! Вот код. Ошибка при вызове метода контекста (ДанныеФормыВЗначение) ПОчему так надо ? Потому что поле СреднедневнаяЗарплата  добавлен в ТЧ как реквизит формы. Остальные поля ТЧ от табличной части Объекта. Почему такая ошибка ? И на правильном пути ли я вообще ?

Вот полная ошибка {Документ.НачислениеСуммРезерваКОтпуску.Форма.ФормаДокумента1.Форма}: Ошибка при вызове метода контекста (ДанныеФормыВЗначение)     НаборКонстантОбъект = ДанныеФормыВЗначение(Резервы,Тип(«ТаблицаЗначений»)); по причине: Несоответствие типов (параметр номер ‘1’) Несоответствие типов (параметр номер ‘1’)

Для Каждого ТекСтрока Из Резервы Цикл ……. КонецЦикла; Вполне достаточно, если Резервы — реквизит с типом таблица значений управляемой формы

НЕт Поле объекта не обнаружено (СреднедневнаяЗарплата) Это потому что я добавил это поле на форме как дополнительное. В Объект.Резервы его нету.

Вы путаетесь в показаниях… Определись уже, Объект.Резервыф — это ТЧ объекта, просто Резервы — может быть реквизитом формы, состав реквизитов этой табличной части задается или в реквизитах объекта, или в реквизитах формы… и да, где вы цикл запускаете, чтобы уж совсем наверняка, это нужно делать &НаСервере

Аааа, кажется дошло, у вас в ТЧ объекта нет поля СреднедневнаяЗарплата, оно добавлено в форме. Зачем такое извращение, не моё дело, конечно. Но тут опять жен  на сервере, можно пойти таким путём: тз = Элементы.Резервы.Выгрузить; получим таблицу значений, потом с ней делаем, что захочется, и загружаем обратно…

Да если это таблица то проще Не ДанныеФормыВЗначение а РеквизитФормыВЗначение(«Резервы») на выходе получите таблицу значений.

{Документ.НачислениеСуммРезерваКОтпуску.Форма.ФормаДокумента1.Форма}: Поле объекта не обнаружено (резервы)     Для Каждого ТекСтрока Из НаборКонстантОбъект.резервы Цикл

{Документ.НачислениеСуммРезерваКОтпуску.Форма.ФормаДокумента1.Форма}: Поле объекта не обнаружено (СреднедневнаяЗарплата)

Попробуй не Объект.Резервы, а просто Резервы и посмотри в отладчике что в текСтроку попадает.

Тэги: 1С 8

Комментарии доступны только авторизированным пользователям

Andy_First

0 / 0 / 0

Регистрация: 17.05.2018

Сообщений: 8

1

1C 8.x

Необходимо открыть форму, заполнить ее и показать клиенту

29.05.2018, 10:29. Показов 8898. Ответов 10

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Добрый день.
Я не волшебник, я только учусь.
Делаю импорт документов (Поступление товаров и услуг).
Необходимо чтобы при импорте документа открывалась заполненная форма нового, не записанного, документа Поступление товаров и услуг: Покупка, комиссия. И после этого клиент, при необходимости, правит ее и записывает в базу.
Для этого используется вот такая вот конструкция:

1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
&НаКлиенте
Процедура ОткрытьФормуПоступлениеТоваровУслуг()
   ФормаНовогоДокумента = ПолучитьФорму("Документ.ПоступлениеТоваровУслуг.ФормаОбъекта"); 
   ЗаполнитьДанныеФормыНаСервере(ФормаНовогоДокумента);    
   КопироватьДанныеФормы(ФормаНовогоДокумента, ФормаНовогоДокумента.Объект);
   ФормаНовогоДокумента.Открыть();
 КонецПроцедуры
 
&НаСервере
Процедура ЗаполнитьДанныеФормыНаСервере(ДанныеФормы)
   ФормаПоступлениеТоваровУслуг = ДанныеФормыВЗначение(ДанныеФормы, Тип("ДокументОбъект.ПоступлениеТоваровУслуг"));
   Для каждого СтрокаДок Из Таблица Цикл
            // Заполнение формы
   КонецЦикла;        
   ЗначениеВДанныеФормы(ФормаПоступлениеТоваровУслуг, ДанныеФормы);
КонецПроцедуры

Ругается:
Ошибка при вызове метода контекста (ДанныеФормыВЗначение)
ФормаПоступлениеТоваровУслуг = ДанныеФормыВЗначение(ДанныеФормы, Тип(«ДокументОбъект.ПоступлениеТоваровУслуг»));
по причине:
Несоответствие типов (параметр номер ‘1’)



0



Programming

Эксперт

94731 / 64177 / 26122

Регистрация: 12.04.2006

Сообщений: 116,782

29.05.2018, 10:29

10

Dethmontt

Модератор

Эксперт 1С

3744 / 2932 / 581

Регистрация: 10.03.2011

Сообщений: 11,539

Записей в блоге: 1

03.06.2018, 01:11

2

1C
1
2
   ЗаполнитьДанныеФормыНаСервере(ФормаНовогоДокумента.Объект);    
   //КопироватьДанныеФормы(ФормаНовогоДокумента, ФормаНовогоДокумента.Объект);

Добавлено через 4 минуты
ну а правильно вот так

1C
1
2
3
4
5
6
7
 ПараметрыЗаполнения = Новый Структура;
 ПараметрыЗаполнения.Вставить("ИмяРеквизита", "Тест строка");
 
 ПараметрыФормы = Новый Структура("ЗначенияЗаполнения", ПараметрыЗаполнения);
 
 фНовыйДокумент = ПолучитьФорму("Документ.ТестДокумент.Форма.ФормаДокумента", ПараметрыФормы, ЭтаФорма);
 фНовыйДокумент.Открыть();

Добавлено через 5 минут
https://infostart.ru/public/236382/



0



0 / 0 / 0

Регистрация: 17.05.2018

Сообщений: 8

08.06.2018, 16:59

 [ТС]

3

Сделал как вы сказали. Форма открывается, но пустая. Пробую заполнить поле комментарий, но открывает пустое форму. Поле Комментарий не заполнено.
Как заполнить форму?

ПараметрыЗаполнения = Новый Структура;
ПараметрыЗаполнения.Вставить(«Комментарий», «12345»);
ПараметрыФормы = Новый Структура(«ЗначенияЗаполнения», ПараметрыЗаполнения);
ПараметрыФормы, ЭтаФорма);
фНовыйДокумент = ПолучитьФорму(«Документ.ПоступлениеТоваровУслуг.Форма.ФормаДокумента», ПараметрыФормы, ЭтаФорма);
фНовыйДокумент.Открыть();



0



1965 / 1350 / 480

Регистрация: 16.01.2015

Сообщений: 5,853

08.06.2018, 19:37

4

Цитата
Сообщение от Andy_First
Посмотреть сообщение

ПараметрыФормы = Новый Структура(«ЗначенияЗаполнения», ПараметрыЗаполнения);
ПараметрыФормы, ЭтаФорма);

Здесь ошибка, но думаю, это просто ошиблись перенося в форум ПараметрыФормы, ЭтаФорма); — лишнее.
А почему не работает, скорей всего найдете ответ здесь



0



0 / 0 / 0

Регистрация: 17.05.2018

Сообщений: 8

09.06.2018, 11:46

 [ТС]

5

Командой фНовыйДокумент = ПолучитьФорму(«Документ.ПоступлениеТоваровУслуг.Форма.ФормаДокумента», ПараметрыФормы, ЭтаФорма); я передаю форме ее параметры. Но форма выходит пустая. Наверное нужно еще в самой форме добавить ее заполнение. Но как это сделать?

Вставил в модуле формы процедуру
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Этаформа.Параметры.УстановитьЗначениеПараметра(«Комментарий», Параметры.Комментарий);
КонецПроцедуры

Через УстановитьЗначениеПараметра у меня выходит ошибка:
Переменная не определена (Параметры)
Этаформа.Параметры.УстановитьЗначениеПараметра(«Комментарий», <<?>>Параметры.Комментарий);

Нужно добавить реквизит Параметры? Подскажите.



0



Yulunga

1231 / 763 / 218

Регистрация: 22.04.2013

Сообщений: 5,589

Записей в блоге: 1

09.06.2018, 12:10

6

первая ссылка в гугле по «открытие формы с параметрами»

1C
1
2
3
4
5
6
&НаСервере
  Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
      Если Параметры.Свойство("тПараметр") Тогда
         //обработка параметра
      КонецЕсли;
  КонецПроцедуры

зачем вы в вашей форме параметры ставите ? наверно надо реквизиту формы присвоить значение того, что пришло извне



0



0 / 0 / 0

Регистрация: 17.05.2018

Сообщений: 8

09.06.2018, 13:45

 [ТС]

7

Подскажите, как реквизиту формы присвоить значение того, что пришло извне



0



Yulunga

1231 / 763 / 218

Регистрация: 22.04.2013

Сообщений: 5,589

Записей в блоге: 1

09.06.2018, 19:04

8

1C
1
РеквизитФормы = Параметры.Тотпараметркоторыйпришолъизъвне

?



0



polax

1965 / 1350 / 480

Регистрация: 16.01.2015

Сообщений: 5,853

09.06.2018, 20:36

9

Andy_First, 1. Посмотрите ссылку что публиковал выше
2. Не нравится, не понятно по ссылке — сообщение Yulunga от 12.10 Чтобы понятней

1C
1
2
3
4
5
6
&НаСервере
  Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
      Если Параметры.Свойство("Комментарий") Тогда
         Объект.Комментарий = Параметры.Комментарий // а Параметры  - это и есть то что вы передаете в структуре ПараметрыФормы
      КонецЕсли;
  КонецПроцедуры



0



Andy_First

0 / 0 / 0

Регистрация: 17.05.2018

Сообщений: 8

13.06.2018, 10:32

 [ТС]

10

Цитата
Сообщение от Yulunga
Посмотреть сообщение

первая ссылка в гугле по «открытие формы с параметрами»

1C
1
2
3
4
5
6
&НаСервере
  Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
      Если Параметры.Свойство("тПараметр") Тогда
         //обработка параметра
      КонецЕсли;
  КонецПроцедуры

зачем вы в вашей форме параметры ставите ? наверно надо реквизиту формы присвоить значение того, что пришло извне

У меня при сохранении выходит ошибка: Переменная не определена (Параметры)
Если <<?>>Параметры.Свойство(«Комментарий») Тогда (Проверка: Толстый клиент (обычное приложение))

Похоже что форма не получает параметры



0



11 / 11 / 1

Регистрация: 09.01.2016

Сообщений: 71

14.06.2018, 11:49

11

у вас обычное приложение, а не управляемое.
Соответственно формы тоже обычные.

Я, конечно, не спец по обычным формам, но я не понимаю зачем вам директивы &НаКлиенте и прочее.
Там вам надо типа такого:
форма = ПолучитьФорму(****
форма.Комментарий = «ывмыва»
форма.Открыть();

И откройте отладчик в конце концов!!



0



Добрый День!
возникла необходимость передачи данных на форму документа до момента его создания из другого документа. ИНТЕРФЕЙС ОБЫЧНЫЙ
есть две процедуры

Процедура ОперацииКупюрыОткрытие(Элемент, СтандартнаяОбработка)
    Форма = ПолучитьФорму("Документ.Купюрник.ФормаОбъекта");
ДанныеФормы = Форма.ЭтаФорма.ДокументОбъект; // Получаем объект формы в переменную
СтрокаТабличнойЧасти = ЭлементыФормы.Операции.ТекущиеДанные;

если пустаястрока(СтрокаТабличнойЧасти.Купюры)=Истина тогда
    ЗаполнитьДокументНаСервере(ДанныеФормы.этотобъект,СтрокаТабличнойЧасти); // Заполняем документ на сервере
            КопироватьДанныеФормы(ДанныеФормы.этотобъект, Форма.ЭтаФорма.ДокументОбъект.этотобъект); // копируем наш объект в объект формы и далее открываем ее
            Форма.Открыть();
конецесли;

КонецПроцедуры
Функция ЗаполнитьДокументНаСервере(ДанныеФормы,СтрокаТабличнойЧасти);

НовыйДокумент = ДанныеФормыВЗначение(ДанныеФормы, Тип("ДокументОбъект.Купюрник")); // Получаем объект из данных формы ИЛИ
Попытка

        НовыйДокумент= Документы.Купюрник.СоздатьДокумент();

// Заполняем реквизиты объекта или другие действия ********
СтрокаТабличнойЧасти = ЭлементыФормы.Операции.ТекущиеДанные;
НовыйДокумент.Сумма_необходимая         =  СтрокаТабличнойЧасти.Сумма;
        НовыйДокумент.Дата               = ТекущаяДата();

        НовыйДокумент.Записать();
        Сообщить("Документ  успешно создан");

        ЗначениеВДанныеФормы(НовыйДокумент,ДанныеФормы); // Кладем обратно в объект формы уже созданный документ

     Исключение
        Сообщить("НЕ УДАЛОСЬ создать окумент" );
КонецПопытки;

КонецФункции

ИСПОЛЬЗУЮ ТЕКСТ СТАТЬИ https://infostart.ru/public/118784/
НО У МЕНЯ ОБЫЧНЫЙ ИНТЕРФЕЙС
ПОЛУЧАЕМ ОШИБКУ НА СТРОКАХ

НовыйДокумент = ДанныеФормыВЗначение(ДанныеФормы, Тип("ДокументОбъект.Купюрник")); // Получаем объект из данных формы

   ЗначениеВДанныеФормы(НовыйДокумент,ДанныеФормы); // Кладем обратно в объект формы уже созданный документ

    КопироватьДанныеФормы(ДанныеФормы.этотобъект, Форма.ЭтаФорма.ДокументОбъект.этотобъект);
ОШИБКА «НЕСООТВЕТСТВИЕ ТИПОВ, ХОТЯ В ОТЛАДЧИКЕ ВСЕ СОВПАДАЕТ «

Цитировать{Документ.Касса.Форма.ФормаДокумента.Форма(529)}: Ошибка при вызове метода контекста (ДанныеФормыВЗначение)
НовыйДокумент = ДанныеФормыВЗначение(ДанныеФормы, Тип(«ДокументОбъект.Купюрник»)); // Получаем объект из данных формы ИЛИ
по причине:
Несоответствие типов (параметр номер ‘1’)

ПРИЧЕМ НА ВСЕХ ТРЕХ СТРОКАХ.
как исправить?

ДанныеФормыВЗначение для внешней обработки

Я

  

NikePopov

22.06.15 — 10:45

Добрый день!

Хочу воспользоваться возможностью процедур с директивой «&НаСервереБезКонтекста» во внешней обработке. Все механизмы заполнения у меня в модуле объекта внешней обработки. У обработки при этом довольно увесистая форма, которую при каждом заполнении таскать на сервер нет никакого желания.

Пример кода:

&НаКлиенте

Процедура Команда1(Команда)

    Команда1НаСервере(Объект);

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

&НаСервереБезКонтекста

Процедура Команда1НаСервере(Объект)

    ВнешняяОбработкаОбъект = ДанныеФормыВЗначение(Объект, Тип(«ВнешняяОбработкаОбъект.ВнешняяОбработка1»));

КонецПроцедуры // Команда1НаСервере()

При выполнении функции «ДанныеФормыВЗначение» возникает ошибка :

{Форма.Форма.Форма(10)}: Ошибка при вызове метода контекста (ДанныеФормыВЗначение)

    ВнешняяОбработкаОбъект = ДанныеФормыВЗначение(Объект, Тип(«ВнешняяОбработкаОбъект.НабивкаБлюд»));

по причине:

Несоответствие типов (параметр номер ‘2’)

Не могу понять как требуется указывать второй параметр функции «ДанныеФормыВЗначение». Если обработка внутри конфигуркции, то проблемы нет.

Возможность обхода через процедуру «&НаСервере» я знаю, но такой подход сильно замедляет выполнение. Переносить процедуры заполнения в форму тоже не хочется.

  

mikecool

1 — 22.06.15 — 10:46

нафейхоа безконтекста??

  

NikePopov

2 — 22.06.15 — 10:47

Передача самой формы на сервер довольно долгое занятие, так как на форме довольно много разнообразных данных. Если пользоваться НаСервереБезКонтекста, то выполнение процедуры очень сильно ускоряется.

  

NikePopov

3 — 22.06.15 — 10:55

Интересно, что ТипЗнч(РеквизитФормыВЗначение(«Объект»)) <> Тип(«ВнешняяОбработкаОбъект.ВнешняяОбработка1»)

А вот Строка(ТипЗнч(РеквизитФормыВЗначение(«Объект»))) = Строка(Тип(«ВнешняяОбработкаОбъект.НабивкаБлюд»)) .

  

NikePopov

4 — 22.06.15 — 10:55

(3) В последнем месте опечатка: вместо «НабивкаБлюд» — «ВнешняяОбработка1»

  

NikePopov

5 — 22.06.15 — 10:55

На нескольких обработках тестирую))

  

Aprobator

6 — 22.06.15 — 10:56

(2) ага, только вот без контекста нет на сервере реквизитов формы.

  

NikePopov

7 — 22.06.15 — 10:57

Я специально для этого убрал директиву над функцией. С целью проверки.

  

Aprobator

8 — 22.06.15 — 11:28

Попробуй на стороне сервера получить для теста через РеквизитФормыВЗначение — там тип не обязателен.

  

hhhh

9 — 22.06.15 — 11:39

(7) а что вы там тестируете? вы же создаете свой контекст. Ваш контекст думаете будет быстрее нуралиевского?

  

NikePopov

10 — 22.06.15 — 12:03

(8) РеквизитФормыВЗначение  — это метод формы. Если использовать его то от «БезКонтекста» придется отказаться, что опять же приведет к большему времени передачи формы с клиента на сервер и обратно.

(9) Я не хочу тянуть контекст формы. Он мне не интересен. Для выполнения требуемых мне действий мне выше крыши хватит только объекта внешней обработки. Весь контекст тянуть долго.

  

ДенисЧ

11 — 22.06.15 — 12:13

При БезКонтекста — ты не имеешь контекста. Ваш Кэп.

неоткуда получать.

  

NikePopov

12 — 22.06.15 — 12:35

(11) Это здорово, но не очень ясно как эту интересную информацию можно применить))

  

DTXqueque

13 — 22.06.15 — 12:41

(10) >Я не хочу тянуть контекст формы. Он мне не интересен. Для выполнения требуемых мне действий мне выше крыши хватит только объекта внешней обработки. Весь контекст тянуть долго.

Курлык-курлык.. Интересно, а что там ещё в контекст попадёт кроме объекта обработки?)

  

Fragster

14 — 22.06.15 — 12:42

из-за этого в своих внешних обработках отказался от модуля обработки вообще — всё в форме.

  

NikePopov

15 — 22.06.15 — 13:10

(13) Приличное количество объектов. Мало того, эти объекты — не ссылки, а целые таблицы, динамические списки, объекты, табличные документы. То, что должен видеть пользователь, а там довольно разнообразная информация.

Объект — это способ заполнения, так скажем, одной записи. А таких записей в форме может быть довольно много.

  

NikePopov

16 — 22.06.15 — 13:12

(14) Так раньше и делал, но теперь хотел бы решить для себя: есть ли возможность использовать форму — как способ отображения информации пользователю, а объект — как отдельный инструмент заполнения.

  

Aprobator

17 — 22.06.15 — 13:17

(10) я понимаю, для чего всё это делается. Просто отладчиком можно будет посмотреть тип объекта и сравнить его с тем, что выдаёт Тип(«ВнешниеОбработки……») и получить дальнейшую информацию для размышлений.

  

DTXqueque

18 — 22.06.15 — 13:24

(15) Ну да, если ты в обработке наплодил кучу сущностей.

Если хочешь отказаться от контекста, передавай нужные параметры в качестве параметров процедуры без контекста.

  

Fragster

19 — 22.06.15 — 13:26

(18) вот пишешь ты обработку и под управляемые и под обычные формы, логично записать общие функции в модуль обработки. а в УФ — еще и без контекста к ним обращаться, чтобы работало поживее.

  

DTXqueque

20 — 22.06.15 — 13:33

(19) Не понял. Ты намекаешь на то, что без контекста можно вызвать процедуры модуля?

  

NikePopov

21 — 24.06.15 — 13:20

(17) В том то и проблема: в (3) я уже так и сделал. Результат удивил. У объекта «Тип» нельзя понять как именно требуется его получить.

(18) Мне нужны не параметры(нужны в меньшей степени), а методы ОбработкаОбъекта. Я хочу все обработки заполнения выполнять в модуле объекта, а формой пользоваться для показа результата пользователю в нужном ему виде.

(20) Да! Именно для этого и затевал обсуждение!

  

cathode

22 — 24.06.15 — 22:23

(0) Тебе точно нужен вызов метода объекта без контекста?

Если модуль объекта используется как библиотека процедур, то в управляемой форме можно сделать так:

1. Создать реквизит формы ОбъектТип, тип «строка неограниченной длины».

2. В ПриСозданииНаСервере:

    // Сохраням тип реквизита Объект для вызовов без контекста.

    ОбъектТип = СтрЗаменить(РеквизитФормыВЗначение(«Объект»).Метаданные().ПолноеИмя(), «.», «Объект.»);

3. Во внеконтекстную серверную процедуру передаем Знач ОбъектТип (можно еще передать Знач Объект, если нужны его данные):

    ОбъектЗначение = Новый(Тип(ОбъектТип));

    // Если передали Объект

    ЗаполнитьЗначенияСвойств(ОбъектЗначение, Объект);

    Результат = ОбъектЗначение.ЭкспортныйМетод();

    Возврат Результат;

В результате получаем вызов метода объекта без передачи контекста, но тип объекта в виде строки для таких вызовов нужно хранить на клиенте.

  

NikePopov

23 — 26.06.15 — 13:33

(22) Вот! Это действительно супер! Есть конечно минус с переносом данных реквизитов и табличных частей(их надо переносить перед экспортным методом в «ОбъектЗначение», а после из «ОбъектЗначение» в «Объект»), но уже отлично!

Всем привет ! Вот код. Ошибка при вызове метода контекста (ДанныеФормыВЗначение) ПОчему так надо ? Потому что поле СреднедневнаяЗарплата  добавлен в ТЧ как реквизит формы. Остальные поля ТЧ от табличной части Объекта. Почему такая ошибка ? И на правильном пути ли я вообще ?

Вот полная ошибка {Документ.НачислениеСуммРезерваКОтпуску.Форма.ФормаДокумента1.Форма}: Ошибка при вызове метода контекста (ДанныеФормыВЗначение)     НаборКонстантОбъект = ДанныеФормыВЗначение(Резервы,Тип(«ТаблицаЗначений»)); по причине: Несоответствие типов (параметр номер ‘1’) Несоответствие типов (параметр номер ‘1’)

Для Каждого ТекСтрока Из Резервы Цикл ……. КонецЦикла; Вполне достаточно, если Резервы — реквизит с типом таблица значений управляемой формы

НЕт Поле объекта не обнаружено (СреднедневнаяЗарплата) Это потому что я добавил это поле на форме как дополнительное. В Объект.Резервы его нету.

Вы путаетесь в показаниях… Определись уже, Объект.Резервыф — это ТЧ объекта, просто Резервы — может быть реквизитом формы, состав реквизитов этой табличной части задается или в реквизитах объекта, или в реквизитах формы… и да, где вы цикл запускаете, чтобы уж совсем наверняка, это нужно делать &НаСервере

Аааа, кажется дошло, у вас в ТЧ объекта нет поля СреднедневнаяЗарплата, оно добавлено в форме. Зачем такое извращение, не моё дело, конечно. Но тут опять жен  на сервере, можно пойти таким путём: тз = Элементы.Резервы.Выгрузить; получим таблицу значений, потом с ней делаем, что захочется, и загружаем обратно…

Да если это таблица то проще Не ДанныеФормыВЗначение а РеквизитФормыВЗначение(«Резервы») на выходе получите таблицу значений.

{Документ.НачислениеСуммРезерваКОтпуску.Форма.ФормаДокумента1.Форма}: Поле объекта не обнаружено (резервы)     Для Каждого ТекСтрока Из НаборКонстантОбъект.резервы Цикл

{Документ.НачислениеСуммРезерваКОтпуску.Форма.ФормаДокумента1.Форма}: Поле объекта не обнаружено (СреднедневнаяЗарплата)

Попробуй не Объект.Резервы, а просто Резервы и посмотри в отладчике что в текСтроку попадает.

Тэги: 1С 8

Комментарии доступны только авторизированным пользователям

Andy_First

0 / 0 / 0

Регистрация: 17.05.2018

Сообщений: 8

1

1C 8.x

Необходимо открыть форму, заполнить ее и показать клиенту

29.05.2018, 10:29. Показов 8256. Ответов 10

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Добрый день.
Я не волшебник, я только учусь.
Делаю импорт документов (Поступление товаров и услуг).
Необходимо чтобы при импорте документа открывалась заполненная форма нового, не записанного, документа Поступление товаров и услуг: Покупка, комиссия. И после этого клиент, при необходимости, правит ее и записывает в базу.
Для этого используется вот такая вот конструкция:

1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
&НаКлиенте
Процедура ОткрытьФормуПоступлениеТоваровУслуг()
   ФормаНовогоДокумента = ПолучитьФорму("Документ.ПоступлениеТоваровУслуг.ФормаОбъекта"); 
   ЗаполнитьДанныеФормыНаСервере(ФормаНовогоДокумента);    
   КопироватьДанныеФормы(ФормаНовогоДокумента, ФормаНовогоДокумента.Объект);
   ФормаНовогоДокумента.Открыть();
 КонецПроцедуры
 
&НаСервере
Процедура ЗаполнитьДанныеФормыНаСервере(ДанныеФормы)
   ФормаПоступлениеТоваровУслуг = ДанныеФормыВЗначение(ДанныеФормы, Тип("ДокументОбъект.ПоступлениеТоваровУслуг"));
   Для каждого СтрокаДок Из Таблица Цикл
            // Заполнение формы
   КонецЦикла;        
   ЗначениеВДанныеФормы(ФормаПоступлениеТоваровУслуг, ДанныеФормы);
КонецПроцедуры

Ругается:
Ошибка при вызове метода контекста (ДанныеФормыВЗначение)
ФормаПоступлениеТоваровУслуг = ДанныеФормыВЗначение(ДанныеФормы, Тип(«ДокументОбъект.ПоступлениеТоваровУслуг»));
по причине:
Несоответствие типов (параметр номер ‘1’)

0

Programming

Эксперт

94731 / 64177 / 26122

Регистрация: 12.04.2006

Сообщений: 116,782

29.05.2018, 10:29

10

Dethmontt

Модератор

Эксперт 1С

3711 / 2907 / 573

Регистрация: 10.03.2011

Сообщений: 11,447

Записей в блоге: 1

03.06.2018, 01:11

2

1C
1
2
   ЗаполнитьДанныеФормыНаСервере(ФормаНовогоДокумента.Объект);    
   //КопироватьДанныеФормы(ФормаНовогоДокумента, ФормаНовогоДокумента.Объект);

Добавлено через 4 минуты
ну а правильно вот так

1C
1
2
3
4
5
6
7
 ПараметрыЗаполнения = Новый Структура;
 ПараметрыЗаполнения.Вставить("ИмяРеквизита", "Тест строка");
 
 ПараметрыФормы = Новый Структура("ЗначенияЗаполнения", ПараметрыЗаполнения);
 
 фНовыйДокумент = ПолучитьФорму("Документ.ТестДокумент.Форма.ФормаДокумента", ПараметрыФормы, ЭтаФорма);
 фНовыйДокумент.Открыть();

Добавлено через 5 минут
https://infostart.ru/public/236382/

0

0 / 0 / 0

Регистрация: 17.05.2018

Сообщений: 8

08.06.2018, 16:59

 [ТС]

3

Сделал как вы сказали. Форма открывается, но пустая. Пробую заполнить поле комментарий, но открывает пустое форму. Поле Комментарий не заполнено.
Как заполнить форму?

ПараметрыЗаполнения = Новый Структура;
ПараметрыЗаполнения.Вставить(«Комментарий», «12345»);
ПараметрыФормы = Новый Структура(«ЗначенияЗаполнения», ПараметрыЗаполнения);
ПараметрыФормы, ЭтаФорма);
фНовыйДокумент = ПолучитьФорму(«Документ.ПоступлениеТоваровУслуг.Фо рма.ФормаДокумента», ПараметрыФормы, ЭтаФорма);
фНовыйДокумент.Открыть();

0

1822 / 1241 / 444

Регистрация: 16.01.2015

Сообщений: 5,446

08.06.2018, 19:37

4

Цитата
Сообщение от Andy_First
Посмотреть сообщение

ПараметрыФормы = Новый Структура(«ЗначенияЗаполнения», ПараметрыЗаполнения);
ПараметрыФормы, ЭтаФорма);

Здесь ошибка, но думаю, это просто ошиблись перенося в форум ПараметрыФормы, ЭтаФорма); — лишнее.
А почему не работает, скорей всего найдете ответ здесь

0

0 / 0 / 0

Регистрация: 17.05.2018

Сообщений: 8

09.06.2018, 11:46

 [ТС]

5

Командой фНовыйДокумент = ПолучитьФорму(«Документ.ПоступлениеТоваровУслуг.Фо рма.ФормаДокумента», ПараметрыФормы, ЭтаФорма); я передаю форме ее параметры. Но форма выходит пустая. Наверное нужно еще в самой форме добавить ее заполнение. Но как это сделать?

Вставил в модуле формы процедуру
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Этаформа.Параметры.УстановитьЗначениеПараметра(«Ко мментарий», Параметры.Комментарий);
КонецПроцедуры

Через УстановитьЗначениеПараметра у меня выходит ошибка:
Переменная не определена (Параметры)
Этаформа.Параметры.УстановитьЗначениеПараметра(«Ко мментарий», <<?>>Параметры.Комментарий);

Нужно добавить реквизит Параметры? Подскажите.

0

Yulunga

1153 / 700 / 203

Регистрация: 22.04.2013

Сообщений: 5,208

Записей в блоге: 1

09.06.2018, 12:10

6

первая ссылка в гугле по «открытие формы с параметрами»

1C
1
2
3
4
5
6
&НаСервере
  Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
      Если Параметры.Свойство("тПараметр") Тогда
         //обработка параметра
      КонецЕсли;
  КонецПроцедуры

зачем вы в вашей форме параметры ставите ? наверно надо реквизиту формы присвоить значение того, что пришло извне

0

0 / 0 / 0

Регистрация: 17.05.2018

Сообщений: 8

09.06.2018, 13:45

 [ТС]

7

Подскажите, как реквизиту формы присвоить значение того, что пришло извне

0

Yulunga

1153 / 700 / 203

Регистрация: 22.04.2013

Сообщений: 5,208

Записей в блоге: 1

09.06.2018, 19:04

8

1C
1
РеквизитФормы = Параметры.Тотпараметркоторыйпришолъизъвне

?

0

polax

1822 / 1241 / 444

Регистрация: 16.01.2015

Сообщений: 5,446

09.06.2018, 20:36

9

Andy_First, 1. Посмотрите ссылку что публиковал выше
2. Не нравится, не понятно по ссылке — сообщение Yulunga от 12.10 Чтобы понятней

1C
1
2
3
4
5
6
&НаСервере
  Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
      Если Параметры.Свойство("Комментарий") Тогда
         Объект.Комментарий = Параметры.Комментарий // а Параметры  - это и есть то что вы передаете в структуре ПараметрыФормы
      КонецЕсли;
  КонецПроцедуры

0

Andy_First

0 / 0 / 0

Регистрация: 17.05.2018

Сообщений: 8

13.06.2018, 10:32

 [ТС]

10

Цитата
Сообщение от Yulunga
Посмотреть сообщение

первая ссылка в гугле по «открытие формы с параметрами»

1C
1
2
3
4
5
6
&НаСервере
  Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
      Если Параметры.Свойство("тПараметр") Тогда
         //обработка параметра
      КонецЕсли;
  КонецПроцедуры

зачем вы в вашей форме параметры ставите ? наверно надо реквизиту формы присвоить значение того, что пришло извне

У меня при сохранении выходит ошибка: Переменная не определена (Параметры)
Если <<?>>Параметры.Свойство(«Комментарий») Тогда (Проверка: Толстый клиент (обычное приложение))

Похоже что форма не получает параметры

0

11 / 11 / 1

Регистрация: 09.01.2016

Сообщений: 71

14.06.2018, 11:49

11

у вас обычное приложение, а не управляемое.
Соответственно формы тоже обычные.

Я, конечно, не спец по обычным формам, но я не понимаю зачем вам директивы &НаКлиенте и прочее.
Там вам надо типа такого:
форма = ПолучитьФорму(****
форма.Комментарий = «ывмыва»
форма.Открыть();

И откройте отладчик в конце концов!!

0

Я сделал форму, добавил реквизит пользователей из справочника пользователей и создал поле выбора с типом справочника пользователей. Мне нужно получить значение этого реквизита в модуле формы, но в строке, где я его получаю, выходит ошибка:

Ошибка при вызове метода контекста (РеквизитФормыВЗначение)
{Отчеты Отчет.НовыйОтчетПрофилей.Форма.ФормаОтчета.Форма(201)}:РеквизитПользователя = РеквизитФормыВЗначение("Пользователь"); //
{Отчеты Отчет.НовыйОтчетПрофилей.Форма.ФормаОтчета.Форма(230)}:ТабДокумент                          = СформироватьМакетНаСервере();

по причине:
Недопустимое значение параметра (параметр номер '1')

Как это можно исправить?

Вот сам код:

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

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

Вот форма со свойствами поля:

И свойства реквизита:

margo_irkutsk

19.04.19 — 09:49

Доброго времени суток всем.

Обращаюсь к экспортной процедуре, находящейся в модуле объекта, из модуля формы списка документов через метод РеквизитФормыВЗначение.

Программа ругается: {Документ.ЛГ_ЖдНакладная.Форма.ФормаСпискаЛогистика.Форма(297)}: Ошибка при вызове метода контекста (РеквизитФормыВЗначение)

    ДокОбъект = РеквизитФормыВЗначение(«Объект»);

по причине:

Недопустимое значение параметра (параметр номер ‘1’)

В чем может быть ошибка?

Вот текст процедуры обращения:

&НаСервере

Процедура СпецификацияЗаполнитьПриложенияСервер()

    
    Объект = Элементы.Ссылка;

    ДокОбъект = («Объект»);

    Объект. ЗаполнитьИРасценитьПоВнутреннимЦенам();

        

    ДокОбъект.ЗначениеВРеквизитФормы(«Объект»);

    Объект.Обработано = Истина;

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

Mankubus

1 — 19.04.19 — 09:52

(0) в тексте процедуры нет той строки на которой происходит ошибка

margo_irkutsk

2 — 19.04.19 — 09:55

криво скрпировала))

&НаСервере

Процедура СпецификацияЗаполнитьПриложенияСервер()

    
    Объект = Элементы.Ссылка;

    ДокОбъект = РеквизитФормыВЗначение(«Объект»);

    Объект. ЗаполнитьИРасценитьПоВнутреннимЦенам();

        

    ДокОбъект.ЗначениеВРеквизитФормы(«Объект»);

    Объект.Обработано = Истина;

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

hhhh

3 — 19.04.19 — 09:56

(0) посмотрите на форме, справа, где список реквизитов, есть там такой реквизит «Объект»?

hhhh

4 — 19.04.19 — 09:57

(2) тут у вас получается, что Объект это вообще не реквизит, а какие-то Элементы.Ссылка

margo_irkutsk

5 — 19.04.19 — 09:58

на форме списка документов нужно обработать выделенные документы через процедуру вызываемую из модуля объекта:

&НаКлиенте

Процедура ЗаполнитьПриложениями(Команда)

    

    ВыделенныеСтроки = ПроверитьПолучитьВыделенныеВСпискеСсылки(Элементы.СписокПиломат);

    Если ВыделенныеСтроки.Количество() = 0 Тогда

        Возврат;

    КонецЕсли;

    ТекстВопроса = НСтр(«ru=’К выделенным в списке документам будут заполнены приложения. Продолжить?’»);

    Ответ = Вопрос(ТекстВопроса,РежимДиалогаВопрос.ДаНет);

    

    Если Ответ = КодВозвратаДиалога.Нет Тогда

        Возврат;

    КонецЕсли;

    

    ОчиститьСообщения();

    Объект = Элементы.Ссылка;

    Для каждого Объект из ВыделенныеСтроки Цикл

     Если  НЕ Объект.СпецификацияКатВ.Количество()= 0    Тогда

        ТекстОшибки = НСтр(«ru = ‘Заполнена спецификация кат.В (необходимо предварительно очистить!’»);

        ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстОшибки);

        Возврат;

    КонецЕсли;

    СпецификацияЗаполнитьПриложенияСервер();    

    
    КонецЦикла;

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

НЕА123

6 — 19.04.19 — 10:00

(4) похоже на попытку «редактировать в списке»

НЕА123

7 — 19.04.19 — 10:02

(0)

что оно должно сделать?

margo_irkutsk

8 — 19.04.19 — 10:03

перебирать выделенные документы и в каждом заполнять табличную часть

Eg0rkas

9 — 19.04.19 — 10:07

покажите теперь код процедуры «ЗаполнитьИРасценитьПоВнутреннимЦенам()»

Darych

10 — 19.04.19 — 10:13

в (2) в коде беда

margo_irkutsk

11 — 19.04.19 — 11:15

немного подправила код, но ошибка осталась та же:

&НаКлиенте

Процедура ЗаполнитьПриложениями(Команда)

    

    ВыделенныеСтроки = ПроверитьПолучитьВыделенныеВСпискеСсылки(Элементы.СписокПиломат);

    Если ВыделенныеСтроки.Количество() = 0 Тогда

        Возврат;

    КонецЕсли;

    ТекстВопроса = НСтр(«ru=’К выделенным в списке документам будут заполнены приложения. Продолжить?’»);

    Ответ = Вопрос(ТекстВопроса,РежимДиалогаВопрос.ДаНет);

    

    Если Ответ = КодВозвратаДиалога.Нет Тогда

        Возврат;

    КонецЕсли;

    

    ОчиститьСообщения();

    Для каждого Объект из ВыделенныеСтроки Цикл

     Если  НЕ Объект.СпецификацияКатВ.Количество()= 0    Тогда

        ТекстОшибки = НСтр(«ru = ‘Заполнена спецификация кат.В (необходимо предварительно очистить!’»);

        ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстОшибки);

        Возврат;

    КонецЕсли;

    СпецификацияЗаполнитьПриложенияСервер();    

    
    КонецЦикла;

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

Процедура СпецификацияЗаполнитьПриложенияСервер()

    

    
    ДокОбъект = РеквизитФормыВЗначение(«Объект»,Тип(«ДокументОбъект.ЛГ_ЖдНакладная»));

    ДокОбъект. ЗаполнитьИРасценитьПоВнутреннимЦенам();

        

    ДокОбъект.ЗначениеВРеквизитФормы(«Объект»);

    ДокОбъект.Обработано = Истина;

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

margo_irkutsk

12 — 19.04.19 — 11:17

Пробовала через ДанныеФормыВЗначение, но ошибка та же.

Darych

13 — 19.04.19 — 11:18

объект — это что?

Darych

14 — 19.04.19 — 11:18

если данные формы — то беда

margo_irkutsk

15 — 19.04.19 — 11:19

объект-это документ

Mankubus

16 — 19.04.19 — 11:19

(11) >>Для каждого Объект из ВыделенныеСтроки Цикл

нельзя использовать слово «объект» в качестве переменных!

margo_irkutsk

17 — 19.04.19 — 11:29

Хорошо,изменила код, ошибка та же(. В параметрах метода также пробовала менять. Ошибка не уходит.

Наименование п

&НаКлиенте

Процедура ЗаполнитьПриложениями(Команда)

    

    ВыделенныеСтроки = ПроверитьПолучитьВыделенныеВСпискеСсылки(Элементы.СписокПиломат);

    Если ВыделенныеСтроки.Количество() = 0 Тогда

        Возврат;

    КонецЕсли;

    ТекстВопроса = НСтр(«ru=’К выделенным в списке документам будут заполнены приложения. Продолжить?’»);

    Ответ = Вопрос(ТекстВопроса,РежимДиалогаВопрос.ДаНет);

    

    Если Ответ = КодВозвратаДиалога.Нет Тогда

        Возврат;

    КонецЕсли;

    

    ОчиститьСообщения();

    Для каждого Элемент из ВыделенныеСтроки Цикл

     Если  НЕ Элемент.СпецификацияКатВ.Количество()= 0    Тогда

        ТекстОшибки = НСтр(«ru = ‘Заполнена спецификация кат.В (необходимо предварительно очистить!’»);

        ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстОшибки);

        Возврат;

    КонецЕсли;

    СпецификацияЗаполнитьПриложенияСервер();    

    
    КонецЦикла;

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

Процедура СпецификацияЗаполнитьПриложенияСервер()

    

    
    ДокОбъект = РеквизитФормыВЗначение(«Объект»,Тип(«ДокументОбъект.ЛГ_ЖдНакладная»));

    ДокОбъект. ЗаполнитьИРасценитьПоВнутреннимЦенам();

        

    ДокОбъект.ЗначениеВРеквизитФормы(«Объект»);

    ДокОбъект.Обработано = Истина;

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

Darych

18 — 19.04.19 — 11:32

она не читает ответы

hhhh

19 — 19.04.19 — 11:41

(17) ДокОбъект = РеквизитФормыВЗначение(«Объект»,Тип(«ДокументОбъект.ЛГ_ЖдНакладная»)); — это для формы документа

для формы списка так писать — это полный дебилизм.

поэтому пробуйте

Процедура СпецификацияЗаполнитьПриложенияСервер(Элемент)

    

    
    ДокОбъект = Элемент.Ссылка.ПолучитьОбъект();

    ДокОбъект. ЗаполнитьИРасценитьПоВнутреннимЦенам();

        

    ДокОбъект.Обработано = Истина;

ДокОбъект.Записать();

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

margo_irkutsk

20 — 19.04.19 — 11:57

Ответы читаю.

Задача стоит так: в списке документов накладных пользователь выделяет несколько документов для групповой обработки. цель обработки проставить стоимость товаров в табличных частях выделенных документов. в процедуре Заполнить приложениями (команда) получаю список выделенных и в цикле забираю каждый. И для каждого выбранного документа вызываю процедуру заполнения (ЗаполнитьИРасценитьПоВнутреннимЦенам). Процедура заполнения цен товаров прописана в модуле объекта документа, поэтому обращаюсь через метод РеквизитФормыВЗначение.

Мои извинения, если чего-то не понимаю.

  

SSSSS_AAAAA

21 — 19.04.19 — 11:59

(20) И Реквизит какой формы вы пытаетесь загнать в значение? Формы списка?

{Обработка.РМКУправляемыйРежим.Форма.Форма.Форма(2823)}: Ошибка при вызове метода контекста (РеквизитФормыВЗначение)     Объект  = РеквизитФормыВЗначение(«Обработка»); по причине: Недопустимое значение параметра (параметр номер ‘1’) Вот функция &НаСервере КонецФункции Почему может валить ошибку?

есть реквизит формы «Обработка»?

ОбъектОбработки = РеквизитФормыВЗначение(«Объект»);

Преобразовывать в значение существующий реквизит

если я в обработку добавлю макет, как его получить?

А если добавляю кнопку, то отображается окно с «» и больше ничего, кто нибудь сталкивался?

из серверной процедуры(функции) модуля формы:

А зачем вообще его в форме получать? Я бы заполнил в модуле объекта и вернул уже готовый табличный документ

На РМК Кнопку  нужно прикрутить, а тут такие подвохи блин, второй час долблюсь

я уже и другую кнопку отредактировал,  теперь вот эта фигня выскакивает

Дык, чтобы вызвать метод из модуля объекта — его (объект) все-равно получить придется

{Обработка.РМКУправляемыйРежим.Форма.Форма.Форма(2823)}: Ошибка при установке значения атрибута контекста (Объект)     Объект  = РеквизитФормыВЗначение(«Объект»); по причине: Нельзя изменять поле, содержащее объект данных формы Нельзя изменять поле, содержащее объект данных формы

Объект в реквизиты добавить?

Таки да, но удобнее заполнять в модуле, а не в форме — если что можно будет вызвать без открытия формы … да и вообще в форме должен быть только код, связанный с работой самой формы

Что не понятно в функции РеквизитФормыВЗначение?

Посмотри внимательно на форму. Там уже есть реквизит «Объект». Только не верь глазам своим, он не фига не объект :-). Это данные формы (можешь пока представлять себе как структуру с полями). А чтобы вызвать методы этого объекта — его надо преобразовать в»настоящий» при помощи РеквизитФормыВЗначение

+ Объект = … — так нельзя!!!

Неправильно:  Объект  = …. Правильно ОбъектНастоящий = ….

+ в том случае, если у тебя реквизит формы назван по умолчанию, т.е. «Объект» (назван платформой)

Что тут не так по мимо того что нет значения для макета

Реквизит на форме нужно разместить?

Что отладчик говорит про полученный объект? Тип значения у него какой?

{Обработка.РМКУправляемыйРежим.Форма.Форма.Форма(2823)}: Ошибка при вызове метода контекста (РеквизитФормыВЗначение)     Объект  = РеквизитФормыВЗначение(«Отчет»); по причине: Недопустимое значение параметра (параметр номер ‘1’) Недопустимое значение параметра (параметр номер ‘1’)

ТС, ответь на вопрос: как называется основной реквизит твоей обработки?

так у тебя есть реквизит формы с именем «Отчет»?

А не проще к самому отчету обратится сразу Отчеты.ВидыОплатККМ.ПолучитьМакет?

{Обработка.РМКУправляемыйРежим.Форма.Форма.Форма(2875)}: Ошибка при вызове метода контекста (Показать)     ТабДок.Показать; по причине: Метод недоступен на сервере Метод недоступен на сервере а тут то что не так?

Метод показать не работает на сервере?

А кому и на чем показывать ее на сервере? Предлагаю немного углубиться в понимание концепции управляемых форм

а как тогда его на клиенте показать? если он в другой функции?

Параметр передай, заполни его на сервере, а когда вернешься на клиент — покажи. Я повторюсь

ну серверу он хочет показать…сервер что, не живой, ему что, прекрасное увидеть не хочется… а то гоняют и в хвост и в гриву, а ничего и не показывают, вот потом и появляются ошибки формата потока)

Переменная не определена ТабДок)))

Спасибо за помощи идиоту!!

Тэги: 1С 8

Комментарии доступны только авторизированным пользователям

Я сделал форму, добавил реквизит пользователей из справочника пользователей и создал поле выбора с типом справочника пользователей. Мне нужно получить значение этого реквизита в модуле формы, но в строке, где я его получаю, выходит ошибка:

Ошибка при вызове метода контекста (РеквизитФормыВЗначение)
{Отчеты Отчет.НовыйОтчетПрофилей.Форма.ФормаОтчета.Форма(201)}:РеквизитПользователя = РеквизитФормыВЗначение("Пользователь"); //
{Отчеты Отчет.НовыйОтчетПрофилей.Форма.ФормаОтчета.Форма(230)}:ТабДокумент                          = СформироватьМакетНаСервере();

по причине:
Недопустимое значение параметра (параметр номер '1')

Как это можно исправить?

Вот сам код:

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

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

Вот форма со свойствами поля:

И свойства реквизита:

Показывать по
10
20
40
сообщений

Новая тема

Ответить

Ukubaeva

Дата регистрации: 26.05.2010
Сообщений: 111

Добрый день!
1С:Предприятие 8.2 (8.2.17.169)
У меня возникла такая проблема!
В модуле управляемой формы клиент обращается к серверу, сервер через com соединение подключается к другой базе, получает результаты запроса из этой базы и передает их через реквизит формы клиенту.
Код:
&НаСервере
Процедура ПолучениеСотрудника()
ПодключениеКБазе(DataSource);
ЗапросСотруд = DataSource.NewObject(«Запрос» ;
ЗапросСотруд.Текст = «ВЫБРАТЬ
|      СотрудникиОрганизаций.Ссылка
|ИЗ
|      Справочник.СотрудникиОрганизаций КАК СотрудникиОрганизаций
|ГДЕ
|      СотрудникиОрганизаций.Физлицо = &Физлицо
|      И СотрудникиОрганизаций.Организация = &Организация»;
ЗапросСотруд.УстановитьПараметр(«Физлицо»,ТекФизЛи цо);
ЗапросСотруд.УстановитьПараметр(«Организация»,Data Source.Справочники.Организации.НайтиПоКоду(«000000 002» );
//      ТЗВыгрСотр = РеквизитФормыВЗначение(«ВыгрСотр» ;
ТЗВыгрСотр = Новый ТаблицаЗначений;
ТЗВыгрСотр = ЗапросСотруд.Выполнить().Выгрузить();
сообщить(ТипЗнч(ТЗВыгрСотр));
ЗначениеВРеквизитФормы(ТЗВыгрСотр,»ВыгрСотр» ;
КонецПроцедуры

Но, при выполнении кода происходит ошибка Ошибка при вызове метода контекста (ЗначениеВРеквизитФормы)
ЗначениеВРеквизитФормы(ТЗВыгрСотр,»ВыгрСотр» ;
по причине:
Недопустимое значение параметра (параметр номер ‘2’)

Получаю тип значения результата запроса — тип comобъект!
Как же мне получить в качестве результата запроса ТаблицуЗначений?
Спасибо!!!

Ukubaeva

Дата регистрации: 26.05.2010
Сообщений: 111

а, все, нашла, нужно передать в строку, а потом назад

Показывать по
10
20
40
сообщений

В платформе 1С сообщения об ошибках бывают достаточно запутаны, и без должных навыков разобраться в причинах достаточно сложно. Вот и сообщение об ошибке при вызове контекста может ввести в ступор начинающего разработчика. Однако в подавляющем большинстве случаев мы видим подобное сообщение, если разработчик допустил ошибку в своем коде. Причем речь зачастую идет не об орфографических ошибках, а о логических.

Исправляем ситуацию

Чтобы избавиться от этого неприятного сообщения об ошибке при вызове метода контекста, следует понимать, что контекстом называют методы платформы 1С. Значит в определенной строке кода воспользовались методом с неверными параметрами или вызвали его не от того владельца. Всегда внимательно и полностью читайте сообщения об ошибках – часто в них содержится указание на строку и метод, вызвавший ошибку. Это поможет сэкономить время на отладку и поиск проблемного места в коде.

Планшет

Приглашаем на
бесплатный вебинар!

18 апреля в 11:00 мск

40 мин.

Рассмотрим действия разработчика на примере со специально допущенной ошибкой. Мы запускаем на исполнение нижеприведенный кусок кода с запросом, в котором забыли дописать условие отбора. Компилятор 1С пропускает такую процедуру, так как орфографических ошибок в написании команд мы не допустили. Однако в режиме предприятия нас ждет такое сообщение об ошибке:


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

Рис.1 Запускаем на исполнение нижеприведенный кусок кода с запросом, в котором забыли дописать условие отбора

Рис.1 Запускаем на исполнение нижеприведенный кусок кода с запросом, в котором забыли дописать условие отбора

Приведенный текст ошибки программисту 1С скажет, что в модуле формы обработки «ЧтениеЗаписьXML на 152 строчке кода не может выполниться запрос. Причина в том, что на 17 строчке запроса нет чего-то, что ждал компилятор. Таким образом, чтобы убрать подобное сообщение, необходимо выяснить, что там должно быть и написать недостающий код.

Увидев вышеприведенный кусок кода, разработчик заметит, что в запросе есть служебное слово «ГДЕ», дающее сигнал 1С, что дальше будет условие. Но мы забыли дописать его и, естественно, система с помощью сообщения об ошибке спрашивает нас – «а где условие?». Чтобы исправить эту ситуацию необходимо либо убрать оператор «ГДЕ» из запроса, либо добавить условие.

Но ошибки могут быть не только в текстах запросов. Допустим, мы хотим выбрать всю номенклатуру и узнать, входит ли она в определенную группу. Проверка происходит с помощью метода «ПринадлежитЭлементу» и его параметра, который должен быть типа СправочникСсылка. Мы опять допускаем ошибку и вместо ссылки в параметр метода помещаем строку, содержащую имя переменной.


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

Рис.2 Мы опять допускаем ошибку и вместо ссылки в параметр метода помещаем строку, содержащую имя переменной

Рис.2 Мы опять допускаем ошибку и вместо ссылки в параметр метода помещаем строку, содержащую имя переменной

1С выдает настолько же информативное сообщение, из которого мы понимаем, что на 158 строке у 1 параметра неправильный тип. Но что же делать, если мы не знаем, какой тип должен быть? В этом нам поможет Синтакс-помощник, встроенный в платформу 1С.

Рис.3 Синтакс-помощник

Рис.3 Синтакс-помощник

В конфигураторе находим строку и метод, на который указывало сообщение об ошибке, и нажимаем на него правой кнопкой мыши. Выбираем пункт «Поиск в синтакс-помощнике» и платформа самостоятельно ищет справочную информацию по выделенному методу. В справке мы видим не только подробное описание параметров и самого метода, но и пример. Сверив пример с нашим кодом, приходит понимание, что кавычки не нужны и без них все работает.

Рис.4 Сверив пример с нашим кодом, приходит понимание, что кавычки не нужны и без них все работает

Рис.4 Сверив пример с нашим кодом, приходит понимание, что кавычки не нужны и без них все работает

Чаще всего причиной подобных ошибок выступают следующие факторы:

  1. Невнимательность;
  2. Отсутствие опыта или знаний;
  3. Несогласованность действий разработчиков друг с другом;
  4. Изменения в методах контекста в новых версиях платформы.

Но ошибки при разработке ПО случаются постоянно, поскольку иногда ошибаются даже специалисты с многолетним опытом. Самое главное – уметь исправлять их и учиться на них. Постепенно вы будете видеть сообщения об ошибках все реже и научитесь замечать подобные «опечатки» еще до запуска 1С.

Понравилась статья? Поделить с друзьями:
  • Ошибка получения обработки обслуживания при закрытии смены 1с
  • Ошибка при вызове метода контекста заполнить
  • Ошибка при вызове метода контекста выполнитьзадачуинтерактивно
  • Ошибка получения обработки обслуживания вики принт
  • Ошибка планирования это