РеквизитФормыВЗначение () и ДанныеФормыВзначение (). Описание и примеры использования.

09.10.12

Разработка - Механизмы платформы 1С

В Синтаксис-Помощнике очень скупо написано о процедуре ДанныеФормыВЗначение(), чуть побольше - о РеквизитФормыВЗначение(). И совсем нет примеров использования. Попробуем с этим разобраться.
 

РеквизитФормыВЗначение() является методом управляемой формы, компилируется только &НаСервере, контекст формы является для него необходимым, поэтому компиляция &НаСервереБезКонтекста недоступна. На клиенте не работает, поскольку в результате получаем прикладной объект.

Где и когда его нужно использовать?
Метод РеквизитФормыВЗначение() необходим, если требуется из модуля формы вызвать стандартный метод объекта или метод (процедуру, функцию) из модуля объекта, из общего модуля.
Этот метод будет отрабатывать с данными, взятыми из формы, т.е. еще не записанными в базу.

Для того, чтобы измененные данные вернуть на форму, используется метод ЗначениеВРеквизитФормы().

Вторым параметром метода РеквизитФормыВЗначение является тип значения. Это необязательный параметр. Если обрабатываемый реквизит не является составным типом, то тип будет автоматически получен из реквизита формы. Иначе генерируется исключение времени выполнения.

Примеры:
1)

&НаСервере
Процедура ЗаполнитьТЧПоДаннымПоследнегоДокумента(Контрагент)

            ДокОбъект = РеквизитФормыВЗначение("Объект");
            ДокОбъект.ЗаполнитьТЧПоДаннымПоследнегоДокумента(Контрагент);
            ЗначениеВРеквизитФормы(ДокОбъект, "Объект");

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

2)

&НаСервере
Процедура ОчиститьСтрокиСПустойЦенойНаСервере()

         ДокОбъект = РеквизитФормыВЗначение("Объект");
         ДокОбъект.ОчиститьСтрокиСПустойЦеной();
         ЗначениеВРеквизитФормы(ДокОбъект, "Объект");

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

3)

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

В указанных выше случаях метод РеквизитФормыВЗначение() похож на метод ПолучитьОбъект(). Разница в том, что первый получает объект, заполненный данными формы, а второй - объект с данными из базы.


ДанныеФормыВзначение()

В отличие от метода управляемой формы РеквизитФормыВЗначение(), процедура глобального контекста ДанныеФормыВЗначение() может работать без контекста формы, но именно поэтому, в частности, ей необходимо указывать тип конвертируемых данных.

Обратной процедурой является ЗначениеВДанныеФормы().

Примеры:
1)    &НаСервере

       // Инициализация набора констант
       НаборКонстантОбъект = ДанныеФормыВЗначение(НаборКонстант, Тип("КонстантыНабор"));
       НаборКонстантОбъект.Прочитать();
       ЗначениеВДанныеФормы(НаборКонстантОбъект, НаборКонстант);

2)   &НаСервере  

       НаборФорма = Объект.Движения.РегистрУправленческий;

       Набор = ДанныеФормыВЗначение(НаборФорма, Тип("РегистрБухгалтерииНаборЗаписей.РегистрУправленческий"));
       Если Набор.Количество()=0 Тогда
              Возврат;
       КонецЕсли;
       Набор.УстановитьАктивность(НЕ Набор[0].Активность);
       ЗначениеВДанныеФормы(Набор, НаборФорма);

В этом примере на форме отображен набор записей регистра бухгалтерии. При отработке процедуры, активность набора меняется только на форме, в базе при этом ничего не происходит. Активность у набора записей регистра в базе поменяется только после выполнения операции Записать.

3)
&НаКлиенте
Процедура Заполнить(Команда)

       ОснРеквизит = Объект;
       ВыполнитьНаСервереБезКонтекста(ОснРеквизит);
       КопироватьДанныеФормы(ОснРеквизит,Объект)

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

&НаСервереБезКонтекста
Процедура ВыполнитьНаСервереБезКонтекста(ОснРеквизит)

       ОбъектЗначение = ДанныеФормыВЗначение(ОснРеквизит, Тип("ДокументОбъект.АктСверкиВзаиморасчетов"));

       //...Выполнение операций с Объектом "ОбъектЗначение"

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

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

В этом примере на клиент возвращается ОснРеквизит, содержащий измененные данные. Но его еще нужно "запихать"  в отображаемую форму. Для этого используем процедуру глобального контекста КопироватьДанныеФормы().

 

В большинстве случаев процедуры ДанныеФормыВзначение() и РеквизитФормыВЗначение() взаимозаменяемы. При этом РеквизитФормыВЗначение проще в использовании. Но если требуется использование &НаСервереБезКонтекста - тогда только ДанныеФормыВЗначение.

В качестве иллюстрации взаимозаменяемости Пример 2 еще в двух вариантах:

ВАРИАНТ 1
&НаКлиенте
Процедура Активность(Команда)

       ОснРеквизитДвижения = Объект.Движения.РегистрУправленческий;
       АктивностьНаСервереБезКонтекста(ОснРеквизитДвижения);
       КопироватьДанныеФормы(ОснРеквизитДвижения,Объект.Движения.РегистрУправленческий);

КонецПроцедуры // Активность()

&НаСервереБезКонтекста
Процедура АктивностьНаСервереБезКонтекста(ОснРеквизитДвижения)

       Набор = ДанныеФормыВЗначение(ОснРеквизитДвижения, Тип("РегистрБухгалтерииНаборЗаписей.РегистрУправленческий"));
       Если Набор.Количество()=0 Тогда
              Возврат;
       КонецЕсли;
       Набор.УстановитьАктивность(НЕ Набор[0].Активность);
       ЗначениеВДанныеФормы(Набор, ОснРеквизитДвижения);

КонецПроцедуры // АктивностьНаСервереБезКонтекста()


ВАРИАНТ 2

&НаСервере
Процедура АктивностьНаСервере()

       НаборФорма = РеквизитФормыВЗначение("Объект");
       Набор = НаборФорма.Движения.РегистрУправленческий;

       Если Набор.Количество()=0 Тогда
              Возврат;
       КонецЕсли;

       Набор.УстановитьАктивность(НЕ Набор[0].Активность);
       ЗначениеВРеквизитФормы(НаборФорма, "Объект");

КонецПроцедуры // АктивностьНаСервере()

См. также

Поинтегрируем: сервисы интеграции – новый стандарт или просто коннектор?

Обмен между базами 1C Администрирование СУБД Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

В платформе 8.3.17 появился замечательный механизм «Сервисы интеграции». Многие считают, что это просто коннектор 1С:Шины. Так ли это?

11.03.2024    4480    dsdred    53    

71

Как готовить и есть массивы

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Все мы используем массивы в своем коде. Это один из первых объектов, который дают ученикам при прохождении обучения программированию. Но умеем ли мы ими пользоваться? В этой статье я хочу показать все методы массива, а также некоторые фишки в работе с массивами.

24.01.2024    5282    YA_418728146    25    

63

Планы обмена VS История данных

Обмен между базами 1C Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Вы все еще регистрируете изменения только на Планах обмена и Регистрах сведений?

11.12.2023    6401    dsdred    36    

111

1С-ная магия

Механизмы платформы 1С Бесплатно (free)

Язык программирования 1С содержит много нюансов и особенностей, которые могут приводить к неожиданным для разработчика результатам. Сталкиваясь с ними, программист начинает лучше понимать логику платформы, а значит, быстрее выявлять ошибки и видеть потенциальные узкие места своего кода там, где позже можно было бы ещё долго медитировать с отладчиком в поисках источника проблемы. Мы рассмотрим разные примеры поведения кода 1С. Разберём результаты выполнения и ответим на вопросы «Почему?», «Как же так?» и «Зачем нам это знать?». 

06.10.2023    18466    SeiOkami    46    

118

Дефрагментация и реиндексация после перехода на платформу 8.3.22

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Начиная с версии платформы 8.3.22 1С снимает стандартные блокировки БД на уровне страниц. Делаем рабочий скрипт, как раньше.

14.09.2023    12082    human_new    27    

74

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    8802    YA_418728146    6    

141

Внешние компоненты Native API на языке Rust - Просто!

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

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

20.08.2023    6273    sebekerga    54    

94

Все скопируем и вставим! (Буфер обмена в 1С 8.3.24)

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Рассмотрим новую возможность 8.3.24 и как её можно эффективно использовать

27.06.2023    15973    SeiOkami    31    

103
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. Поручик 4670 26.09.12 13:06 Сейчас в теме
Щас набегут местные умники и начнут грабить корованы размахивать Хрусталёвой с Радченко.
mistr00; anton448; Ali_q; user712426; usercool; nnn123; user717534; acanta; user958974; +9 Ответить
2. no_registration 26.09.12 14:30 Сейчас в теме
Спасибо. Полезная статья.
3. Daddysb 02.10.12 10:39 Сейчас в теме
4. FedorovEvg 153 05.10.12 16:54 Сейчас в теме
5. plastilin 8 07.10.12 00:25 Сейчас в теме
6. ZeroDM 14 08.10.12 08:37 Сейчас в теме
Тема хорошая, но раскрыта не до конца.

Во второй части, где описываются методы ДанныеФормыВзначение() и ЗначениеВДанныеФормы() не достаточно содержательно, описано:
- назначение процедур;
- почему или в каких случаях нужно использовать ДанныеФормыВзначение(), а не РеквизитФормыВЗначение() и в каких наоборот.
артем21; _DaFNa_; user712426; COMPER; GUDMAN; Azim_burkhanov; ks8585; Daynestro07; TeMochkiN; perepetulichka; +10 Ответить
41. user970589 10 23.01.20 02:28 Сейчас в теме
(6)возможно потому что статья переписана с https://helpf.pro/faq83/view/1579.html или наоборот?
smilemanrus; +1 Ответить
46. CratosX 112 30.09.21 20:43 Сейчас в теме
(41) по ссылке Дата: 20.08.2014, а эта статья от 26.09.2012 12:54
7. vladir 114 10.10.12 14:16 Сейчас в теме
(0) Спасибо, полезная информация.
8. FractonKireyev 11.10.12 19:10 Сейчас в теме
Согласен с ZeroDM - тема раскрыта не полностью. Кроме того описание скомкано: то-ли автору лень писать, то-ли не до конца понял о чём пишет...
tgg; kild; Serg_1C(M); +3 1 Ответить
9. klel 11.10.12 20:28 Сейчас в теме
Полезно и наглядно =) ОГРОМНЫЙ +
10. LexSeIch 210 21.03.13 05:47 Сейчас в теме
Мир этому дому.
Полезная статья для тех кто начинает программировать управляемые формы. Автору спасибо!
11. AVK_Alex 4 24.10.13 11:18 Сейчас в теме
Здравствуйте, коллеги!

Сначала немного лирики: у клиента (УТ11) скачет интернет (меняется IP / отключается). Пользователи дубасят документы (пусть будет РТУ). Кнопку "Записать" нажимать забывают (наверное, только на уровне Господа Бога этот вопрос еще не обсуждался). Работают тонким клиентом через веб-сервер (RDP нет). При отключении интернет клиент отваливается с потерей всего, что нажито непосильным трудом.

Задача: обеспечить минимальные потери данных при скачках интернета.

Решение выбрано такое:
1. При изменении ТЧ "Товары" сохранять объект целиком (документ РТУ) в регистре сведений. Записывать документ не подойдет, т.к. пользователь может отказаться от создания документа.
2. При записи / проведении / закрытии формы документа - удалять записи из регистра.
3. При старте 1С проверять, есть ли записи в регистре и восстанавливать их.

Трудности:
Сделано все, за исключением заполнения данных формы данными объекта при восстановлении.
- На клиенте есть восстановленный объект, есть форма этого объекта, могу её открыть, но не могу её заполнить.
- На сервере есть восстановленный объект, есть форма этого объекта, могу её заполнить, но не могу открыть или передать на клиент.

Варианты решения:
1. Заполнять на клиенте в цикле по одному реквизиту - как-то несерьезно.
2. Дорабатывать форму документа, чтобы при открытии она сама проверяла наличие записи в регистре - дополнительное изменение конфигурации (а такую практику восстановления планируется распространить и на прочие документы).
3. Сохранять непосредственно ТЧ "Товары" - проще восстанавливать, но шапка будет пустая...

Что посоветуете? Должен же быть какой-то встроенный заполнятор?

P.S. Кусок кода:

&НаКлиенте
Процедура ВосстановитьОбъект (СсылкаНаОбъект, ИмяФормы) //Ссылка на объект - измерение в регистре
	ВосстановленныйОбъект = ВосстановитьОбъектНаСервере (СсылкаНаОбъект); //Это восстановленный объект
	ПараметрыФормы = Новый Структура ("Объект", ВосстановленныйОбъект);   //Передавать через параметры не работает...
	Фрм = ПолучитьФорму(ИмяФормы, ПараметрыФормы);
	Фрм.Открыть();
КонецПроцедуры
Показать

jobkostya1c_ERP; +1 Ответить
12. gvk2009 451 25.10.13 10:18 Сейчас в теме
(11) AVK_Alex, в качестве "заполнятора" используйте процедуру глобального контекста КопироватьДанныеФормы. В вашем коде будет примерно так (при условии, что структуры "ВосстановленныйОбъект" и "Фрм.Объект" совпадают):

...
КопироватьДанныеФормы(ВосстановленныйОбъект, Фрм.Объект);
Фрм.Открыть();
13. AVK_Alex 4 25.10.13 12:41 Сейчас в теме
(12) gvk2009, так уже пробовал:
{ОбщаяФорма.ПУРУМ_НесохраненныеОбъекты.Форма(37)}: Ошибка при вызове метода контекста (КопироватьДанныеФормы)
КопированиеВыполнено = КопироватьДанныеФормы(ВосстановленныйОбъект, Фрм.Объект);
по причине:
Несоответствие типов (параметр номер '1')

Тут должен быть не ДокументОбъект, а ДанныеФормыСтруктураСКоллекцией; ДанныеФормыКоллекция; ДанныеФормыСтруктура

Но все равно спасибо за участие. Посмотрю версионирование в БСП (но там-то все в контексте формы объекта) - может, натолкнет на какую мысль...
14. gvk2009 451 25.10.13 13:01 Сейчас в теме
(13) AVK_Alex, а какой тип данных у ВосстановленныйОбъект?
Делаете ли в процедуре ВосстановитьОбъектНаСервере() перед передачей на Клиента преобразование объекта с помощью
ЗначениеВДанныеФормы?
16. AVK_Alex 4 25.10.13 14:49 Сейчас в теме
(14) gvk2009, тип данных ДокументОбъект
Код теперь выглядит так:
&НаКлиенте
Процедура ВосстановитьОбъект (СсылкаНаОбъект, ИмяФормы)
	ВосстановленныйОбъект = ВосстановитьОбъектНаСервере (СсылкаНаОбъект);
	Фрм = ПолучитьФорму(ИмяФормы);
	ЗначениеВРеквизитФормыНаСервере(ВосстановленныйОбъект, Фрм.Объект);
	Фрм.Открыть();
КонецПроцедуры

&НаСервере
Процедура ЗначениеВРеквизитФормыНаСервере (ВосстановленныйОбъект, ФормаОбъект)
	ЗначениеВДанныеФормы(ВосстановленныйОбъект, ФормаОбъект);	
КонецПроцедуры //Прикольно, сюда дохожу отладчиком. Дальше F10 и ошибка
Показать


{ОбщаяФорма.ПУРУМ_НесохраненныеОбъекты.Форма(37)}: Ошибка при установке значения атрибута контекста (Объект)
ЗначениеВРеквизитФормыНаСервере(ВосстановленныйОбъект, Фрм.Объект);
по причине:
Нельзя изменять поле, содержащее объект данных формы
20. gvk2009 451 26.10.13 18:46 Сейчас в теме
(16) AVK_Alex, вот код для примера. Я создала внешнюю обработку с реквизитом ДокСсылка (тип - ДокументСсылка).

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

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

Показать
21. AVK_Alex 4 28.10.13 10:13 Сейчас в теме
(20) gvk2009, Спасибо!

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

&НаСервереБезКонтекста
Процедура ЗаполнитьНаСервереБезКонтекста(ФрмОбъект, ВосстановленныйОбъект)
    ЗначениеВДанныеФормы(ВосстановленныйОбъект, ФрмОбъект);
КонецПроцедуры // ЗаполнитьНаСервереБезКонтекста()
Показать
30. CratosX 112 10.07.17 13:35 Сейчас в теме
(21) в процедуре ЗаполнитьНаСервереБезКонтекста заполняшка данных неочевидна

&НаСервереБезКонтекста
Процедура ЗаполнитьНаСервереБезКонтекста(ФрмОбъект, ВосстановленныйОбъект)
    ЗначениеВДанныеФормы(ВосстановленныйОбъект, ФрмОбъект);
    //   тут куски кода заполнения данных
КонецПроцедуры // ЗаполнитьНаСервереБезКонтекста()


Или пример кода с контекстным вызовом (работает на клиент-сервере, тонкий клиент):

&НаКлиенте
Процедура ОткрытьФормуНового(Команда)

    Форма = ПолучитьФорму("Документ.ПродажаТоваровУслуг.Форма.ФормаДокумента");
    ДанныеФормы = Форма.Объект;

    ЗаполнитьНаСервере(ДанныеФормы);

    КопироватьДанныеФормы(ДанныеФормы, Форма.Объект);
    Форма.Открыть();

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

&НаСервере
Процедура ЗаполнитьНаСервере(НовыйОбъект)

    НовыйОбъект.Контрагент = Справочники.Контрагенты.НайтиПоКоду("000000005");         

КонецПроцедуры
Показать
22. sss999 48 19.09.14 12:15 Сейчас в теме
(20) gvk2009, че то мне вообще этот код не понравился,как то он не соответствует концепции разделения на сервер и клиент,например как это можно получать объект на клиенте а потом передавать его через параметр,все должно на сервере получаться имхо
23. gvk2009 451 23.09.14 13:21 Сейчас в теме
(22) sss999, если получать объект на сервере по ссылке (реквизит формы Объект.Ссылка), то для этого потребуется контекст формы - это как раз случай использования "РеквизитФормыВЗначение()". А в том коде, на который ссылаетесь вы, контекст формы не используется. С Клиента на Сервер передается форма документа и документ со всеми своими реквизитами, помещенный в переменную. Но его тип - не ДокументОбъект! Именно поэтому его можно использовать на Клиенте. Если обратиться с справке 1С, то читаем:"Важно заметить, что для типов прикладных объектов (таких, как СправочникОбъект, например) форма будет реально использовать не прикладные, а специализированные типы данных, состав которых будет автоматически наполняться из указанных типов".
Предпочтительнее использовать компиляцию НаСервереБезКонтекста, потому что в этом случае объем передаваемых данных между Клиентом и Сервером значительно меньше.
32. RailMen 823 09.02.18 09:36 Сейчас в теме
(11) писать в регистр , а потом удалять записи - дичь. Сделай реквизит формы АдресВХранилище и всю структуру данных формы сохраняй во временное хранилище.
15. eeeio 123 25.10.13 14:17 Сейчас в теме
Вызов процедуры &НаСервереБезКонтекста
Обработать(КакаятоТаблицаФормы)...
вываливается с ошибкой.
Нормально отрабатывается вот так: Обработать(ЗНАЧ КакаятоТаблицаФормы)
17. AVK_Alex 4 25.10.13 14:52 Сейчас в теме
(15) eeeio, возможно, не совсем понимаю - а разве в форме после этого что-то поменяется?
18. eeeio 123 25.10.13 16:07 Сейчас в теме
19. AVK_Alex 4 25.10.13 17:23 Сейчас в теме
24. user_2010 871 10.04.15 12:11 Сейчас в теме
Спасибо - статья полезна!

Решаю такую задачу: на форму программно добавлен реквизит и его элемент.

Почему функция РеквизитФормыВЗначение не видит мой реквизит/элемент?
25. arancar 19 01.07.15 14:39 Сейчас в теме
Тема годная, только мне больше интересно насколько такие вызовы по переупаковке данных из одного типа в другой трудозатратны по времени исполнения?
Стоит ли при наличии двух форм документа (управляемой и обычной) помещать методы вида ПриИзмененииДоговора в модуль объекта и в управляемой форме шаманить во всех удобных и неудобных местах ДанныеФормыВЗначение -> ЗначениеВДанныеФормы? Или лучше продублировать тот де самый код в разных формах или придумать что-то более интересное?
26. Afa_fil 14.10.15 17:59 Сейчас в теме
Спасибо, полезная статья.
Я пыталась таким же образом преобразовывать не сам Объект формы, а его реквизиты.
Если у реквизита тип динамический список, то ни одна из этих процедур не срабатывает.
Если у реквизита тип таблица значений, то все хорошо получается.
27. progr-2008 118 18.09.16 23:01 Сейчас в теме
28. userGJ 26.10.16 17:20 Сейчас в теме
Спасибо за статью, очень помогла.
29. pavel_pss 289 16.12.16 17:51 Сейчас в теме
Всем привет. Помогите. При работе в тонком клиенте.

Есть обработка, на ней табличная часть и ТЧ. реквизит Док.ПоступлениеТовУслуг.

по кнопке наформе:

&НаКлиенте
Процедура ВыполнитьЗагрузку(Команда)
	
	Сообщить("Выполняется загрузка документов, подождите ...", СтатусСообщения.Внимание);  
	ВыполнитьЗагрузкуНаСервере(Элементы.Страницы.ТекущаяСтраница.Имя);
	Сообщить("Загрузка документов, выполнена", СтатусСообщения.Информация);

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

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


Показать


процедура ЗагрузитьПТУ - объявленна в модуле объекта.

Там идет загрузка внешних данных и создание нового или изменение существующего документа ПоступлениеТоваровУслуг.

Вопрос, если новый док, то все нормально, но если док уже есть и у него например меняется дата и док. записывается док. То пока я на сервере то дата встает правильная,
но когда возвращается в Процедура ВыполнитьЗагрузку(Команда), то в колонке ТЧ, дата остается старая.

Подскажите в чем мой косяк.

Лучше куском кода. Спасибо.

В толстом клиенте такой проблемы нет.
31. m_aster 111 02.12.17 19:39 Сейчас в теме
33. ybatiaev 58 09.04.18 18:57 Сейчас в теме
Если рассуждать с точки зрения здравого смысла... есть некая таблица на форме, то зачем мне надо что-то куда то преобразовывать? Могу я в цикле обработать всю ДанныеФормыКолекция? Могу! Для удобства могу вывести и ползунок. Это по нормальной логике.
Далее я таки в цикле перебираю друг-за-другом документы из коллекции, делаю что-то на сервере, возвращаю что-то на клиент, как вариант булевый РЕЗУЛЬТАТ, и вставляю его в поле коллекции. Часть вставляется, часть не вставляется.
Пришедшему с нормальных языков программирования тяжело к подобным "находкам" привыкнуть. Жесть, короче!!!
Никогда не понимал идею проводить пустые действия ...
VladC#; acanta; +2 Ответить
34. vlasenko_me 15.02.19 15:01 Сейчас в теме
У АВТОРА ЕСТЬ КОД:
&НаСервереБезКонтекста
Процедура ВыполнитьНаСервереБезКонтекста(ОснРеквизит)

ОбъектЗначение = ДанныеФормыВЗначение(ОснРеквизит, Тип("ДокументОбъект.АктСверкиВзаиморасчетов"));

//...Выполнение операций с Объектом "ОбъектЗначение"

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

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

НО:
ОснРеквизит да и вообще любой если передать в &НаСервереБезКонтекста то в результате будет " Ошибка при установке значения атрибута контекста (ОснРеквизит)
по причине:
Нельзя изменять поле, содержащее объект данных формы
35. gvk2009 451 04.04.19 13:01 Сейчас в теме
(34) Ваша ошибка, скорее всего, в том, что вы передаёте на сервер САМ ОБЪЕКТ. А надо объект сохранять в переменную и передавать на сервер эту переменную:
ОснРеквизит = Объект;
ВыполнитьНаСервереБезКонтекста(ОснРеквизит);
36. newvideo 26.04.19 16:33 Сейчас в теме
(35) А в чем будет разница если мы передаем Объект на СерверБезКонтекста и в случае если мы будем использовать просто НаСервере(с контекстом)?
42. snurk 9 05.04.20 02:05 Сейчас в теме
(36) При использовании НаСервере реквизиты формы передаются в подпрограмму на сервере неявно и доступны через контекст, а при использовании НаСервереБезКонтекста их приходится передавать явно, через параметры подпрограммы. При этом параметры, использующие передачу по ссылке (т.е. без ключевого слова "Знач" в заголовке подпрограммы) передаются не только в подпрограмму, но и обратно. Можно сказать, что после выполнения процедуры "ВыполнитьНаСервереБезКонтекста" ещё выполняется невидимый оператор присваивания, который устанавливает в фактический параметр возвращённое с сервера значение. Для переменных и для скалярных реквизитов (Число, Булево...) это нормально, а вот для составных реквизитов управляемой формы (т.е. ДанныеФормыКоллекция и т.д.) недопустимо.
37. user900973 13.06.19 10:29 Сейчас в теме
Добрый день! Помогите, плиз, новичку. Есть элемент справочника, на форме в качестве реквизита формы есть таблица. Есть регламент, методы исполняются на сервере. Подбираются измененные элементы из плана обмена, данные необходимо передать по АПИ. Не могу добраться из сервера к таблице, которая на форме. http://joxi.ru/823BZZjT9gWGRm
38. dreamcreal 30.06.19 14:18 Сейчас в теме
Вот этот кусок статьи не очень читабельный. Я его отформатировала...

"Где и когда его нужно использовать?
Метод РеквизитФормыВЗначение() необходим, если требуется из модуля формы вызвать стандартный метод объекта или метод (процедуру, функцию) из модуля объекта, из общего модуля.
Этот метод будет отрабатывать с данными, взятыми из формы, т.е. еще не записанными в базу.

Для того, чтобы затем измененные данные вернуть на форму, используется метод ЗначениеВРеквизитФормы()."

--->

Где и когда его нужно использовать?
Метод РеквизитФормыВЗначение() необходим, если требуется из модуля формы вызвать стандартный метод объекта или метод/процедуру/функцию из модуля объекта или из общего модуля.
Этот метод будет отрабатывать с данными, взятыми из формы (т.е. еще не записанными в базу).

Для того, чтобы затем измененные данные вернуть на форму, используется метод ЗначениеВРеквизитФормы().
ivnik; acanta; +2 Ответить
39. acanta 30.06.19 14:23 Сейчас в теме
(38) Круто. И почему это не пишут в синтакс помощнике?
vladisemen; dreamcreal; +2 Ответить
40. dreamcreal 30.06.19 14:28 Сейчас в теме
(39) Я вообще не понимала что эти два метода делают.
Иногда их встречала.
Вот решила поинтересоваться ими.
Кстати, что в СП о них пишут, не видела....
43. Lupeykin 5 20.08.20 07:48 Сейчас в теме
Без этих знаний, не возможно нормально написать дополнительную внешнюю обработку табличных частей.
44. Sikh 16.11.20 12:40 Сейчас в теме
Помогло когда понадобилось из формы обратиться к макету объекта.
45. ivanmeneger 12.05.21 22:08 Сейчас в теме
Я перелопатил весь интернет, просмотрел всё что выдал яндекс и гугл, ну ничего толком вразумительного по поводу РеквизитФормыВЗначение() блин везде пишут таким языком, что либо понять ну просто невозможно, два дня ушло в никуда. Используются настолько узкие термины, понять которые начинающему программисту, а тем более любителю как я, ну просто невозможно !!! Я попробую всё объяснить максимально просто, настолько, насколько это вообще возможно, чтобы читатель долго не мучился и получил желаемое. Если ты уже разобрался в этом механизме, то я тебя поздравляю, дай теперь и другим шанс !!
Короче. Ты решил сделать какую то обработку, прайс лист сгенерировать или как я например с сайтом решил свою 1С связать для разных целей. В общем изначально всё просто - ты создаешь обработку - потом создаешь форму - добавляешь кнопочки на неё. Дальше ты как во времена 1С 7 или 1С 8 до появления управляемых форм - решишь открыть модуль этой формы и в ней начнешь писать свой код - то запомни самое главное правило - так делать НЕЛЬЗЯ. Дело в том что ни справочники ни документы - короче почти ничего тебе из этой формы НЕДОСТУПНО, ну может не тебе а программе, но не суть. Главное что ты не можешь никак воздействовать на данные, менять их ну и всё в таком духе.
Само собой решение есть.
Ты должен свою программу перенести из Модуля Формы в Модуль объекта, понимаешь ?? !! То есть ты в Модуле формы должен сказать программе - что основной код у тебя написан в Модуле объекта - программа там код выполнит, там всё доступно, и дальше вернется обратно в Модуль формы и дальше, например сможет тебе что то сообщить или выдать, например табличку прайса ну и так далее. Ща покажу на картинке. Надеюсь так еще понятнее станет.
Показываю по шагам согласно картинке. Попробую всё прокомментировать.
&НаКлиенте  // Это начало начал.
Процедура ОбновитьСсылки(Команда) // Ну это просто кнопка из формы. Она работает на клиенте. 
	//Послать сразу отсюда 1Ску командой РеквизитФормыВЗначение("Объект");  - ТЫ НЕ МОЖЕШЬ!! 
        //А не можешь потому что РеквизитФормыВЗначение("Объект"); работает только НаСервере.
   Результат = ДанныеСсылки();  // Тут ты посылаешь программу НаСервер, после выполнения НаСервере - 
                                                       ///в переменной Результат - будут какие то данные, которые вернутся
   
   Сообщить(Результат);  //Можно посмотреть что у нас вернулось
КонецПроцедуры




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


А это просто код с Модуля объекта этой же тобою придуманной обработки
&НаСервере
Функция ОбновитьСсылку() Экспорт  //// Вот тут ОЧЕНЬ ВАЖНо ВСТАВИТЬ служебное слово Экспорт
                                                                 ///Это слово дает этой функции принимать скажем так эстафету, благодаря этому слову всё работает
 Переменная = "Я переменная пришла я с Модуля объекта";  //Это и есть твой код, работай со справочниками и документами, 
                                                                                                        ///Оле или ODBCб тут всё доступно и всё работает.
  Возврат Переменная;  /// Ну и всё наш текст полетел (экспортировался) обратно в модуль формы нашей в наСервере - 
                                        ///с наСервера она полетел НаКлиента - и дальше выведен в виде сообщения. Вот и всё !
КонецФункции
Показать

Я это всё понял именно так и именно так оно точно работает и точно выполняются все необходимые мне задачи. И я очень надеюсь, что и ты мой друг не будешь терять много времени на понимание этой, в принципе простой вещи, прочитаешь моё сообщение и у тебя сразу всё заработает. Ну и удачи тебе.
Прикрепленные файлы:
support; vis_tmp; nekiilik1c; Raf_f; user1823204; I_train; Vladimir_K1; userMKA; user591389_aska_rabota; Nikita15; +10 Ответить
47. Lakord 12.10.21 10:35 Сейчас в теме
Может кто подскажет как решить следующую проблему:

При заимствовании в расширение справочника Номенклатуры из типовой конфигурации УТ и добавлении в метаданные справочника своей табличной части Расш_Таблица сразу же возникает проблема при попытке в режиме предприятия скопировать уже существующий элемент справочника выдает ошибку:

Нельзя изменять поле, содержащее объект данных формы
{Справочник.Номенклатура.Форма.ФормаЭлемента.Форма(3702)}: ЗаполнитьЗначенияСвойств(Объект, ИсточникКопирования, , "ГруппаДоступа, ФайлКартинки, ФайлОписанияДляСайта,
{Справочник.Номенклатура.Форма.ФормаЭлемента.Форма(78)}: ЗаполнитьПоПараметрам();

по причине:
Ошибка установки значения свойства 'Расш_Таблица'
по причине:
Нельзя изменять поле, содержащее объект данных формы


Перебрасывает в Конфигураторе на:

ЗаполнитьЗначенияСвойств(Объект, ИсточникКопирования, , "ГруппаДоступа, ФайлКартинки, ФайлОписанияДляСайта,
|ДополнительныеРеквизиты, ДрагоценныеМатериалы, Код,
|ПометкаУдаления");

Можно ли добавленную табличную часть в модуле формы данными методами передать в создаваемый элемент справочника?
Оставьте свое сообщение