Открытие формы еще незаписанного документа 1С 8.2 Управляемое приложение

12.11.20

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

Недавно столкнулся с проблемой открытия формы еще не записанного в БД документа, много возился с этим. Решил обобщить все найденное, может кому-то сэкономит время.

Итак вопрос №1: Как открыть форму еще не записанного документа (не заполнить на основании) ?

Ответ: Чтобы открыть форму нам нужно связать ее с ссылкой объекта, но объект еще не записан. Многие пытаются использовать метод УстановитьСсылкуНового() но это не прокатывает. После долгих чтений я сделал вот так:

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

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

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

// Можно использовать безконтекстный вызов, оптимизируем передачу данных

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

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

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

Док = Документы.НашДокумент.СоздатьДокумент();

// Заполняем реквизиты объекта или другие действия ********

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

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

2. Как открыть форму уже записанного документа?

Здесь есть два метода ОткрытьФорму() или ОткрытьЗначение(). В обоих случаях нужно передавать ссылку на записанный документ.

 

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

СсылкаОбъекта = СоздатьНаСервере();
//1.
ОткрытьФорму("Документ.НашДокумент.Егоформа", Новый Структура("Ключ", СсылкаОбъекта)); // Через параметры мы передаем ссылку документа

//2.

ОткрытьЗначение(СсылкаОбъекта);

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

&НаСервере
Функция ЗаполнитьДокументНаСервере()

// Используем метод создать

НовыйОбъект = Документы.НашДокумент.СоздатьДокумент();

 // Заполняем его 

НовыйОбъект.Записать(); // Обязательно записываем

Возврат НовыйОбъект.Ссылка; //Возвращаем ссылку

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

На уникальность материла не претендую, сам только "начинающий" так что если что не так  - критикуйте!

 

См. также

Сервисы интеграции без Шины и интеграции

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

Пример использования «Сервисов интеграции» без подключения к Шине и без обменов.

13.03.2024    3169    dsdred    16    

65

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

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

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

24.01.2024    7365    YA_418728146    25    

69

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

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

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

11.12.2023    7687    dsdred    36    

115

1С-ная магия

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

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

06.10.2023    20047    SeiOkami    46    

124

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

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

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

14.09.2023    13972    human_new    27    

77

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

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

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

28.08.2023    10323    YA_418728146    7    

148

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

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

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

20.08.2023    6981    sebekerga    54    

99
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. bulpi 215 29.02.12 09:22 Сейчас в теме
Для того, чтобы открыть форму нового документа, достаточно использовать метод ОткрытьФорму. Все , что Вы написали, не нужно. Другое дело, если нужно ЗАПОЛНИТЬ эту форму. Так заголовок публикации тогда нужно поменять.
CepeLLlka; China_off; kandellaster; kyrasol; yuraskas; korzhishe; Arzhanov.AV; +7 5 Ответить
34. ui69 41 14.03.17 13:00 Сейчас в теме
(1) Считаю, что заголовок соответствует. Нашел и понял суть именно по тожу заголовку который указан сейчас: Открытие формы еще незаписанного документа.
gtrr34; dbachinsky; wolder; Aleskey_K; andogskiy; Andreyyy; uchenik; yaroslav.artem; maksimus753; Vlaloplo; chemezov; awp234; portalUg; freeek; nekit_rdx; Drivingblind; Rusena; user1053017; victorree; PLAstic; Dach; wowik; ErshKUS; sasha777666; Sherdrada; Monte Carlo; myoker; +27 Ответить
76. user1638771 10.01.24 16:55 Сейчас в теме
2. пользователь 29.02.12 10:33
Сообщение было скрыто модератором.
...
3. M-Mark-76 117 01.03.12 09:49 Сейчас в теме
Спасибо, вся описаная методика работает
4. serg_gres 153 01.03.12 22:55 Сейчас в теме
А я сделал через временное хранилище.
5. bulas 213 27.08.12 15:00 Сейчас в теме
Заполняем документ программно, а затем:
ФормаДокумента = ДокументОбъект.ПолучитьФорму();
ФормаДокумента.ОткрытьМодально();
Оставили в открытом документе еще "следы" и записываем(проводим).
7. via64 11.04.13 11:01 Сейчас в теме
(5) bulas,
Это работает только в толстом клиенте.
Merkalov; chemezov; PLAstic; Dach; pbahushevich; +5 Ответить
6. Igoryany4 26.10.12 14:14 Сейчас в теме
При выполнении строки:
Форма = ПолучитьФорму("Документы.НашДокумент.ФормаОбъекта");


возникает ошибка, исправленный вариант:
Форма = ПолучитьФорму("Документ.НашДокумент.ФормаОбъекта");
pbahushevich; +1 Ответить
8. nick_krsk 18 01.06.13 14:28 Сейчас в теме
Статья помогла решить задачу, спасибо!
Vin1s; asterisk; +2 Ответить
9. nixel 1416 12.06.13 12:31 Сейчас в теме
Печально... "Разработку управляемого интерфейса" проглядите. Там есть простой пример, как это сделать.
11. leemuar 13.11.13 15:29 Сейчас в теме
(9) nixel, на какой из 500 страниц?
Merkalov; kholkin; wowik; CratosX; +4 Ответить
12. nixel 1416 13.11.13 18:25 Сейчас в теме
(11) leemuar, из 600 :)
Извиняюсь, сейчас проглядел книгу, действительно там этого нет. Видимо идею брал из какого-то другого печатного источника.
В работе дабы не гонять большие массивы данных между клиентом и сервером использую такой подход:

Форма, с которой мы открываем незаписанную форму.
&НаКлиенте
Процедура ОткрытьЗаполненныйДокумент(Команда)
                Адрес = ПолучитьАдресНовогоДокумента(ЭтаФорма.УникальныйИдентификатор);
                Параметры = Новый Структура(“АдресХранилища”, Адрес);
                ОткрытьФорму(”Документ.Приказ.ФормаОбъекта”, Параметры, ЭтаФорма);
КонецПроцедуры

&НаСервереБезКонтекста
Функция ПолучитьАдресНовогоДокумента(УИД)
                ДокументОбъект = Документы.НашДокумент.СоздатьДокумент();
                ...
                code code code
                ...
                АдресХранилища  = ПоместитьВоВременноеХранилище(ДокументОбъект, УИД);

                Возврат АдресХранилища;
КонецФункции
Показать

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


Да, приходится незначительно залезать в форму объекта, но получается большой выигрыш по производительности и клиент-серверному взаимодействию.
kasper076; Tworozhok; starponyx; KilloN; improg; pavelpribytkin96; Jeka44; PLAstic; Vin1s; i.c.h; Xershi; Krio2; unichkin; kuza_87; klinval; Sergafan10; Union37; Zero_nv; Elvisnya; +19 Ответить
14. Elvisnya 21 28.07.14 12:51 Сейчас в теме
(12) nixel, спасибо за совет. В 8.3 скорее всего не будет работать, т.к. в 8.3 при помещении несериализуемого значения во временное хранилище возникает модульная ошибка, а ДокументОбъект как раз несереализуемый. Как вариант можно использовать структуру, взамен ДокументОбъект.
SkyHunter; +1 Ответить
41. Xershi 1493 08.10.17 17:16 Сейчас в теме
(14) так и есть:
АдресХранилища = ПоместитьВоВременноеХранилище(НовыйОбъект, УникальныйИд);

Ошибка при вызове метода контекста (ПоместитьВоВременноеХранилище)
АдресХранилища = ПоместитьВоВременноеХранилище(НовыйОбъект, УникальныйИд);
по причине:
Переданное значение не может быть помещено во временное хранилище

1С:Предприятие 8.3 (8.3.10.2466)

А метод автора сработал!

В своей публикации не знал как решить проблему не записанного битого объекта: https://infostart.ru/public/608150/
А теперь это стало возможно!
42. Xershi 1493 23.12.17 22:40 Сейчас в теме
(41) после тестов пришел к мнению, что открыть форму битой ссылки на УФ не возможно. Единственный вариант создавать произвольную форму, но смысла в этом нет, проще записать и открыть уже элемент!
57. Jeka44 23.03.20 13:55 Сейчас в теме
(41) Что бы не возникало такой ошибки во временное хранилище можно положить структуру, содержащую документОбъект, а не сам документ объект, например так:

Функция ПолучитьСсылкуНаДокумент(УИД)

НашДокументОбъект= Документы.НашДокумент.СоздатьДокумент();

НашДокументОбъект.Контрагент = Объект.Контрагент;

СтруктураДокумента = Новый Структура("ДокументОбъект", ДокументЗаписьВОчередь);

АдресХранилища = ПоместитьВоВременноеХранилище(СтруктураДокумента, УИД);

Возврат АдресХранилища;

КонецФункции //ПолучитьСсылкуНаДокумент
dbachinsky; kholkin; improg; +3 Ответить
58. Xershi 1493 23.03.20 14:13 Сейчас в теме
(57) а ДокументЗаписьВОчередь откуда?
59. Jeka44 23.03.20 15:02 Сейчас в теме
(58)
У меня так документ назывался, пропустил по невнимательности когда пример на инфостарт писал)
60. Xershi 1493 23.03.20 15:26 Сейчас в теме
(59) я так понял вы заменили данные объекта на данные этого объекта в структуре и тогда удалось на УФ открыть новый элемент, заполнить его данными удаленного, хотя какие данные. Речь идет об "УИД". И когда пользователь записал это, то ссылка перестала быть битой?
61. Jeka44 23.03.20 17:12 Сейчас в теме
(60) Нет, у меня не стояла задача воскресить битый документ, я решал задачу точно такую же, которая была в заголовке данной темы, а именно: "Открытие формы еще не записанного документа." Теперь подробности: Есть некая форма обработки, назовем ее "Рабочим местом". На этой форме рабочего места вводим какие-либо данные. Далее в этом же рабочем месте по нажатию кнопки "Создать Запись в очередь" программно создается Документ, как было видно ранее у меня он назывался "Запись в очередь". То есть у меня есть ДокументОбъект НЕ ЗАПИСАННОГО документа и мне нужно было открыть его заполненную форму, с чем данный способ прекрасно справился. УИД здесь - это уникальный идентификатор формы Рабочего места, нужен он для того чтобы "В случае, если передается УникальныйИдентификатор формы или адрес в хранилище, то значение будет автоматически удалено после закрытия этой формы" (читата из конфигуратора из описания метода ПоместитьВоВременноеХранилище)

P.S. Так же с этим справлялся метод "ОткрытьЗначение", но не совсем корректно, а именно он открывал форму по умолчанию, а по задаче нужно было открыть форму, не являющуюся формой по умолчанию.
62. Xershi 1493 23.03.20 18:54 Сейчас в теме
(61) а так просто открыть форму с данными это не проблема. Проблема именно, чтобы открыть с нужным УИД.
Автор описал, как заполнять объект данными.
71. KilloN 59 07.07.21 12:57 Сейчас в теме
Все же метод nixel предпочтительнее.
При создании на сервере такой большой поток различных заполнялок может быть.
Особенно дополнительные колонки в табличной части.

&НаСервере
Процедура _ПриСозданииНаСервереПеред(Отказ, СтандартнаяОбработка)
	
	Если Параметры.Свойство("АдресХранилища") И ЭтоАдресВременногоХранилища(Параметры.АдресХранилища) Тогда
	 	Структура = ПолучитьИзВременногоХранилища(Параметры.АдресХранилища);
		ЗначениеВРеквизитФормы(Структура.ДокументОбъект, "Объект");
		УдалитьИзВременногоХранилища(Параметры.АдресХранилища);
	КонецЕсли; 	
	
КонецПроцедуры
Показать
10. M.Shalimov 202 25.06.13 15:27 Сейчас в теме
Функция ЗаполнитьДокументНаСервере(ДанныеФормы);


В Вашем примере функция ничего не возвращает и ";" при определении излишни.
13. dachnik 26 13.12.13 13:03 Сейчас в теме
Спасибо, хоть ваш пример у меня и не сработал, но навел на правильную мысль.
15. Kuklachel 09.09.14 13:34 Сейчас в теме
Спасибо lobster, очень помогли разобраться!
16. t278 57 23.09.14 03:20 Сейчас в теме
в моём случае, нужно было открывать
мФорма= ПолучитьФорму("Документ.ПоступлениеТоваровУслуг.Форма.ФормаДокументаТовары");
mixha; Vida; +2 Ответить
50. Vida 15 29.01.19 23:35 Сейчас в теме
(16)
У меня заработало и как у вас и как у автора.
Странно...

Теперь проблема выбора.

ЧЯДНТ?

Автору СПАСИБО!
65. mixha 15.10.20 09:51 Сейчас в теме
(50)потому что вручную уже была открыта форма. Сам целый час промучился, пока не увидел (16) . И тоже думаю, че за говно, только что работало)))
17. kraynev-navi 649 27.02.15 09:07 Сейчас в теме
Подозреваю, что у последней функции в статье название должно быть все-таки СоздатьНаСервере()
18. volha-77 19 11.03.15 21:26 Сейчас в теме
Спасибо, очень нужная статья, все сработало и в 8.3
Vin1s; Vida; +2 Ответить
19. hiexe 01.04.15 14:08 Сейчас в теме
20. Sergus 09.04.15 15:11 Сейчас в теме
До недавнего времени все так и работало но вот сегодня все стало работать так как написал t278, нужно создавать конкретную форму.
51. Vida 15 29.01.19 23:38 Сейчас в теме
(20)
А что у вас изменилось? У меня работают оба варианта.
Платформа 8.3.13.1644
УНФ 1.5
21. prodines 107 10.04.15 14:49 Сейчас в теме
ПолучитьФорму - доступность "Толстый клиент"! Минусую публикацию как нерабочую.
starponyx; marku; +2 6 Ответить
49. Vida 15 29.01.19 23:30 Сейчас в теме
(21) Зачем пугаете?

ПолучитьФорму (GetForm)

Доступность:

Тонкий клиент, веб-клиент, мобильный клиент, толстый клиент, мобильное приложение(клиент).
Вызов метода выполняет обращение к серверу.
22. mirrr 90 23.04.15 15:22 Сейчас в теме
Отсутствует отображение для типа 'ДанныеФормыЭлементКоллекции'
Эта ошибка на строку ЗаполнитьДокументНаСервере(ДанныеФормы);
Версия 8.3. В чем причина?
23. sonGodv 43 29.04.15 21:14 Сейчас в теме
В моей ситуации не проходит не первый ни второй вариант.
В первом, документ Установки цен номенклатуры, не заполняется табличная часть, видимо надо вызывать еще процедуры из общих модулей
Во втором Документ можно записать, только если у пользователя есть полные права.
Мне нравиться больше второй вариант, но не нашел как обойти контроль прав пока.
Может кто сталкивался при записи программно с ограничениям по правам?
24. korppinen 70 10.06.15 12:49 Сейчас в теме
(23) sonGodv,
УстановитьПривилегированныйРежим(Истина);
48. serg-lom89 76 12.12.18 18:55 Сейчас в теме
(23)
Добрый
точно с таким же столкнулся((
не подскажете почему не заполняются ТЧ?
25. alexa191 19.07.15 18:23 Сейчас в теме
Благодарю, помогла статья
26. SunnyGirl 13.10.15 09:37 Сейчас в теме
Спасибо, статья помогла.
27. nikiforovvn 15.02.16 10:36 Сейчас в теме
28. KNM.Work 30.05.16 01:30 Сейчас в теме
29. tindir 21.08.16 18:54 Сейчас в теме
&НаКлиенте
Процедура Команда(Команда)

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

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

// Можно использовать безконтекстный вызов, оптимизируем передачу данных

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

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

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

Док = Документы.НашДокумент.СоздатьДокумент();

// Заполняем реквизиты объекта или другие действия ********

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

КонецФункции
Показать

В коде теперь ошибка - Нельзя изменять поле, содержащее объект данных формы....
Как на этом вывихе мозга можно разрабатывать....
30. sergoqwe 06.09.16 11:09 Сейчас в теме
(29) tindir,
&НаКлиенте 
Процедура Команда1(Команда) 

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

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

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

&НаСервере 
Функция ВидОперацииДокумента () 
Возврат Перечисления.ВидыОперацийРеализацияТоваров.Товары; 
КонецФункции 

Показать

Поправьте если что не правильно, только разбираюсь с этим выносом мозга 8.3
31. Meson 04.10.16 11:49 Сейчас в теме
Док = ДанныеФормыВЗначение(ДанныеФормы, Тип("ДокументОбъект.РеализацияТоваровУслуг"));
Док = Документы.РеализацияТоваровУслуг.СоздатьДокумент();

В чем смысл этих двух строк?
Vladimir-R; egor123456; +2 Ответить
32. user657734_YGREEN 12.01.17 23:58 Сейчас в теме
Все просто:
&НаКлиенте
Процедура СоздатьЗаявку(Команда)
	ПараметрыФормы	= новый Структура("Основание, Объект.Ссылка);
	ОткрытьФорму("Документ.ЗаказМатериалов.Форма.ФормаДокумента", ПараметрыФормы);
КонецПроцедуры


а теперь на сервере при открытии действуем как обычно при создании документа на основании:
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)

// ДанныеЗаполнения - это основание переданное в параметрах формы.
ЗЫ: см. справку 1с: Интерфейс (управляемый)->УправляемаяФорма
pridecom; @Fancy; user1067792; triviumfan; eruil; starponyx; i.c.h; Slypower; Erne100; CratosX; TelsDevelopUser; altu71; asp-1c; rusakov1969; kotlyar; Pr0glam3r; San4ez; marku; Aston1924; zhuravlev_as; +20 Ответить
33. zhuravlev_as 397 11.02.17 10:17 Сейчас в теме
(32) спасибо, этот вариант мне подошел

74. eruil 13.06.22 17:59 Сейчас в теме
(32) небольшое уточнение:
Процедура СоздатьЗаявку(Команда)
    ПараметрыФормы = Новый Структура("Основание", Объект.Ссылка);
    ОткрытьФорму("Документ.ЗаказМатериалов.Форма.ФормаДокумента", ПараметрыФормы); // .ФормаВыбора .ФормаОбъекта .ФормаСписка - задаваемые в конфигураторе или ваша форма - .Форма.ВашаФорма
КонецПроцедуры
35. LavinVladik 221 14.04.17 04:44 Сейчас в теме
вот еще один рабочий вариант,
взято от сюда http://devtrainingforum.v8.1c.ru/forum/thread.jsp?id=625538
&НаКлиенте
Процедура ОткрытьФормуНового(Команда)
 
               Форма = ПолучитьФорму("Документ.ПродажаТоваровУслуг.Форма.ФормаДокумента");
               ДанныеФормы = Форма.Объект;
               ЗаполнитьНаСервере(ДанныеФормы);
               КопироватьДанныеФормы(ДанныеФормы, Форма.Объект);
               Форма.Открыть();
 
КонецПроцедуры
 
&НаСервере
Процедура ЗаполнитьНаСервере(НовыйОбъект)
               НовыйОбъект.Контрагент = Справочники.Контрагенты.НайтиПоКоду("000000005");          
КонецПроцедуры

Показать
36. bobster123456 01.06.17 13:21 Сейчас в теме
(35) если нужный (основной) реквизит формы называется не "Объект", то кирдык. Зашёл сюда как раз в поисках решения.
37. mukhina 29.06.17 13:04 Сейчас в теме
Большое спасибо! Очень помогло при решении задачи по переводу внешней обработки по созданию нового документа ПТУ с 8.2 на 8.3.
Пример для Бухгалтерии 3.0 вместо
Форма = ПолучитьФорму("Документ.НашДокумент.ФормаОбъекта");
надо
Форма = ПолучитьФорму("Документ.ПоступлениеТоваровУслуг.Форма.ФормаДокументаТовары");
В этой форме есть реквизит Объект.
38. CratosX 112 10.07.17 13:27 Сейчас в теме
Для Расширения (тонкий клиент, клиент-сервер) помог такой код, взятый отсюда:

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

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

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

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

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

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

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

КонецПроцедуры
Показать
Mos; MishaG709; Euroset1; +3 Ответить
39. PavelTihonov 13.09.17 13:02 Сейчас в теме
40. SvetaS2014 08.10.17 15:37 Сейчас в теме
Добрый День!
возникла необходимость передачи данных на форму документа до момента его создания из другого документа. ИНТЕРФЕЙС ОБЫЧНЫЙ
есть две процедуры



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

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

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

// Заполняем реквизиты объекта или другие действия ********
		НовыйДокумент.Сумма_необходимая         =  СтрокаТабличнойЧасти.Сумма;
        НовыйДокумент.Дата               = ТекущаяДата();
Запрос=новый Запрос;    	
	
Запрос.Текст = 
"ВЫБРАТЬ
|      Номиналы_валют.Ссылка,
|      Номиналы_валют.Число
|ИЗ
|      Справочник.Номиналы_валют КАК Номиналы_валют";



Результат = Запрос.Выполнить().Выбрать();

Пока Результат.Следующий() цикл
НоваяСтрока =  НовыйДокумент.Купюры.Добавить();
НоваяСтрока.Номинал =Результат.Ссылка;
НоваяСтрока.СтоимостьКупюры = Результат.Число;
НоваяСтрока.Пачек =1;
НоваяСтрока.ШтукКупюр=100;
Стоимость=НоваяСтрока.СтоимостьКупюры* НоваяСтрока.ШтукКупюр* НоваяСтрока.Пачек;
КонецЦикла;	
	

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

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

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

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

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

КонецПроцедуры
Показать



ИСПОЛЬЗУЮ ТЕКСТ СТАТЬИ https://infostart.ru/public/118784/
НО У МЕНЯ ОБЫЧНЫЙ ИНТЕРФЕЙС
ПОЛУЧАЕМ ОШИБКУ НА СТРОКАХ
Код: [Выделить]
НовыйДокумент = ДанныеФормыВЗначение(ДанныеФормы, Тип("ДокументОбъект.Купюрник")); // Получаем объект из данных формы


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

Код: [Выделить]
   КопироватьДанныеФормы(ДанныеФормы.этотобъект, Форма.ЭтаФорма.ДокументОбъект.этотобъект);


ОШИБКА "НЕСООТВЕТСТВИЕ ТИПОВ, ХОТЯ В ОТЛАДЧИКЕ ВСЕ СОВПАДАЕТ "
Цитировать
{Документ.Касса.Форма.ФормаДокумента.Форма(529)}: Ошибка при вызове метода контекста (ДанныеФормыВЗначение)
НовыйДокумент = ДанныеФормыВЗначение(ДанныеФормы, Тип("ДокументОбъект.Купюрник")); // Получаем объект из данных формы ИЛИ
по причине:
Несоответствие типов (параметр номер '1')


ПРИЧЕМ НА ВСЕХ ТРЕХ СТРОКАХ.
как исправить?
44. Xershi 1493 24.12.17 21:08 Сейчас в теме
(40) вам не нужны танцы с бубном. Получайте новую ссылку о чем автор писал ранее! Это все для УФ нужно!
43. rutadmeen 80 24.12.17 20:24 Сейчас в теме
Действительно работает. Спасибо!
45. micha26 10.04.18 14:24 Сейчас в теме
ЗаполнитьДокументНаСервере(ДанныеФормы); // Заполняем документ на сервере

Если я правильно понимаю - НаКлиенте будет ругаться на отсутствие переменной ДанныеФормы.
47. micha26 10.04.18 15:24 Сейчас в теме
(45)а нет, это я ступил. Не будет ругаться.
46. user623969_dusa 10.04.18 14:29 Сейчас в теме
все равно идет обращение к серверу так почему сразу не предложить записать объект если надо открыть его форму как рекомендуется в универсальном решении, выигрыша нет - данные формы туда сюда гоняются если документ будет записываться еще раз на сервер полетят данные формы
можно использовать директиву НаСервере и не передавать параметром)
52. hydro2588_2015 14 14.06.19 19:40 Сейчас в теме
Может кому пригодится. Пункт 2. ОткрытьЗначение(Ссылка). У меня не работало в web (хотя справка говорила что все должно быть норм, ругалось на модальность окна), версия платформы 8.12. ОткрытьФорму() отработало как надо. Открывал документ ЗаказКлиента.
53. olbir 31.10.19 15:04 Сейчас в теме
54. user1053017 20.12.19 04:28 Сейчас в теме
55. Hans 3 20.12.19 09:59 Сейчас в теме
Все способы кривые и не универсальные, особенно для типовых. ПриСозданииНаСервере срабатывает раньше, чем вы заполняете форму. Поэтому все служебные реквизиты формы - Итоги документа и др, не расчитываются.
56. Hans 3 20.12.19 10:23 Сейчас в теме

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

	ОбъектФормы = Форма.Объект;
    ЗаполнитьРеализациюНаСервере(ОбъектФормы, АдресХранилища);
	КопироватьДанныеФормы(ОбъектФормы, Форма.Объект);
       // Не экспортная процедура
	Форма.ПриЧтенииСозданииНаСервере();
    Форма.Открыть();
		
КонецПроцедуры

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

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

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

Показать


Оказывается можно вызывать из вне, процедуры формы, которые не экспортные. Разрыв шаблона.
unknown181538; +1 Ответить
63. soulner 398 23.07.20 10:23 Сейчас в теме
Хорошая статья, но есть дополнение у меня.
1. хорошо бы менять признак модифицированности формы после заполнения объекта;
2. процедура ПолучитьФорму вызывает событие ПриСозданииНаСервере, а оно отрабатывает по пустому объекту, да объект формы потом заполняется, но отображение формы может быть некорректным.
64. GetNight 48 10.09.20 09:19 Сейчас в теме
Очень понравился тип Стурктура оператора Новый. Можно ссылку на описание?)

//1.
ОткрытьФорму("Документ.НашДокумент.Егоформа", Новый Стурктура("Ключ", СсылкаОбъекта)); // Через параметры мы передаем ссылку документа
66. TopZlodey 13 12.11.20 10:31 Сейчас в теме
Спасибо тебе добрый человек!
67. user1167610 17.12.20 16:05 Сейчас в теме
{Документ.РеализацияТоваровУслуг.Форма.ФормаДокумента.Форма(4531,5)}: Процедура или функция с указанным именем не определена (ЗаполнитьРеализациюНаСервере)
<<?>>ЗаполнитьРеализациюНаСервере(ОбъектФормы, АдресХранилища);
68. user1167610 17.12.20 16:11 Сейчас в теме
Подскажите как всунуть данные в эти реквизиты? В расшифровку платежа все ложится прекрасно, а если платеж по одной сделке - уже всю голову сломал - ни в какую
Прикрепленные файлы:
69. improg 647 15.02.21 14:17 Сейчас в теме
(12) (57) , спасибо помогло, хороший подход.
70. muzzombie 23.06.21 16:13 Сейчас в теме
&НаКлиенте
Процедура Команда(Команда)

Форма = ПолучитьФорму("Документ.НашДокумент.ФормаОбъекта");
ДанныеФормы = Форма.Объект; // Получаем объект формы в переменную


"Поле объекта не обнаружено (Объект)"


На толстом клиенте делаю.
72. sponchebob 20 13.07.21 08:34 Сейчас в теме
Спасибо, очень нужная статья, все сработало и в 8.3 для УТ 11. Статья прям помогла!
73. Unry 03.08.21 16:36 Сейчас в теме
У меня работает, но мне нужно открыть несколько документов, а открывается только последний. Как изменить код, чтобы несколько можно было открыть?
75. george30@mail.ru 13.05.23 15:48 Сейчас в теме
При таком варианте заполнения неудобно то, что процедура ПриСозданииНаСервере срабатывает при вызове ПолучитьФорму, когда в форме ещё нет никаких данных. Удобнее использовать обработчик заполнения в модуле формы, который можно настроить через расширение, а в метод ОткрытьФорму передать параметр "ЗначениеЗаполнения", которое и будет использоваться для заполнения в обработчике.
Оставьте свое сообщение