Итак вопрос №1: Как открыть форму еще не записанного документа (не заполнить на основании) ?
Ответ: Чтобы открыть форму нам нужно связать ее с ссылкой объекта, но объект еще не записан. Многие пытаются использовать метод УстановитьСсылкуНового() но это не прокатывает. После долгих чтений я сделал вот так:
&НаКлиенте
Процедура Команда(Команда)
Форма = ПолучитьФорму(«Документ.НашДокумент.ФормаОбъекта»);
ДанныеФормы = Форма.Объект; // Получаем объект формы в переменную
ЗаполнитьДокументНаСервере(ДанныеФормы); // Заполняем документ на сервере
КопироватьДанныеФормы(ДанныеФормы, Форма.Объект); // копируем наш объект в объект формы и далее открываем ее
Форма.Открыть();
КонецПроцедуры
// Можно использовать безконтекстный вызов, оптимизируем передачу данных
&НаСервереБезКонтекста
Функция ЗаполнитьДокументНаСервере(ДанныеФормы);
Док = ДанныеФормыВЗначение(ДанныеФормы, Тип(«ДокументОбъект.НашДокумент»)); // Получаем объект из данных формы ИЛИ
Док = Документы.НашДокумент.СоздатьДокумент();
// Заполняем реквизиты объекта или другие действия ********
ЗначениеВДанныеФормы(Док,ДанныеФормы); // Кладем обратно в объект формы уже созданный документ
КонецФункции
2. Как открыть форму уже записанного документа?
Здесь есть два метода ОткрытьФорму() или ОткрытьЗначение(). В обоих случаях нужно передавать ссылку на записанный документ.
&НаКлиенте
Процедура Команда(Команда)
СсылкаОбъекта = СоздатьНаСервере();
//1.
ОткрытьФорму(«Документ.НашДокумент.Егоформа», Новый Стурктура(«Ключ», СсылкаОбъекта)); // Через параметры мы передаем ссылку документа
//2.
ОткрытьЗначение(СсылкаОбъекта);
КонецПроцедуры
&НаСервере
Функция ЗаполнитьДокументНаСервере()
// Используем метод создать
НовыйОбъект = Документы.НашДокумент.СоздатьДокумент();
// Заполняем его
НовыйОбъект.Записать(); // Обязательно записываем
Возврат НовыйОбъект.Ссылка; //Возвращаем ссылку
КонецФункции
На уникальность материла не претендую, сам только «начинающий» так что если что не так — критикуйте!
Для того, чтобы открыть форму нового документа, достаточно использовать метод ОткрытьФорму. Все , что Вы написали, не нужно. Другое дело, если нужно ЗАПОЛНИТЬ эту форму. Так заголовок публикации тогда нужно поменять.
Спасибо, вся описаная методика работает
А я сделал через временное хранилище.
Заполняем документ программно, а затем:
ФормаДокумента = ДокументОбъект.ПолучитьФорму();
ФормаДокумента.ОткрытьМодально();
Оставили в открытом документе еще «следы» и записываем(проводим).
При выполнении строки:
возникает ошибка, исправленный вариант:
(5) bulas,
Это работает только в толстом клиенте.
Статья помогла решить задачу, спасибо!
В Вашем примере функция ничего не возвращает и «;» при определении излишни.
(9) nixel, на какой из 500 страниц?
(11) leemuar, из 600 🙂
Извиняюсь, сейчас проглядел книгу, действительно там этого нет. Видимо идею брал из какого-то другого печатного источника.
В работе дабы не гонять большие массивы данных между клиентом и сервером использую такой подход:
Форма, с которой мы открываем незаписанную форму.
Показать
Форма открываемого объекта
Да, приходится незначительно залезать в форму объекта, но получается большой выигрыш по производительности и клиент-серверному взаимодействию.
Спасибо, хоть ваш пример у меня и не сработал, но навел на правильную мысль.
(12) nixel, спасибо за совет. В 8.3 скорее всего не будет работать, т.к. в 8.3 при помещении несериализуемого значения во временное хранилище возникает модульная ошибка, а ДокументОбъект как раз несереализуемый. Как вариант можно использовать структуру, взамен ДокументОбъект.
Спасибо lobster, очень помогли разобраться!
в моём случае, нужно было открывать
мФорма= ПолучитьФорму(«Документ.ПоступлениеТоваровУслуг.Форма.ФормаДокументаТовары«);
Подозреваю, что у последней функции в статье название должно быть все-таки СоздатьНаСервере()
Спасибо, очень нужная статья, все сработало и в 8.3
Спасибо, помогли
До недавнего времени все так и работало но вот сегодня все стало работать так как написал t278, нужно создавать конкретную форму.
Отсутствует отображение для типа ‘ДанныеФормыЭлементКоллекции’
Эта ошибка на строку ЗаполнитьДокументНаСервере(ДанныеФормы);
Версия 8.3. В чем причина?
В моей ситуации не проходит не первый ни второй вариант.
В первом, документ Установки цен номенклатуры, не заполняется табличная часть, видимо надо вызывать еще процедуры из общих модулей
Во втором Документ можно записать, только если у пользователя есть полные права.
Мне нравиться больше второй вариант, но не нашел как обойти контроль прав пока.
Может кто сталкивался при записи программно с ограничениям по правам?
(23) sonGodv,
УстановитьПривилегированныйРежим(Истина);
Благодарю, помогла статья
Спасибо, статья помогла.
Большое спасибо!
Спасибо!
Показать
В коде теперь ошибка — Нельзя изменять поле, содержащее объект данных формы….
Как на этом вывихе мозга можно разрабатывать….
(29) tindir,
Показать
Поправьте если что не правильно, только разбираюсь с этим выносом мозга 8.3
Док = Документы.РеализацияТоваровУслуг.СоздатьДокумент();
В чем смысл этих двух строк?
Все просто:
а теперь на сервере при открытии действуем как обычно при создании документа на основании:
// ДанныеЗаполнения — это основание переданное в параметрах формы.
ЗЫ: см. справку 1с: Интерфейс (управляемый)->УправляемаяФорма
(32) спасибо, этот вариант мне подошел
(1) Считаю, что заголовок соответствует. Нашел и понял суть именно по тожу заголовку который указан сейчас: Открытие формы еще незаписанного документа.
вот еще один рабочий вариант,
http://devtrainingforum.v8.1c.ru/forum/thread.jsp?id=625538
взято от сюда
Показать
(35) если нужный (основной) реквизит формы называется не «Объект», то кирдык. Зашёл сюда как раз в поисках решения.
Большое спасибо! Очень помогло при решении задачи по переводу внешней обработки по созданию нового документа ПТУ с 8.2 на 8.3.
Пример для Бухгалтерии 3.0 вместо
Форма = ПолучитьФорму(«Документ.НашДокумент.ФормаОбъекта»);
надо
Форма = ПолучитьФорму(«Документ.ПоступлениеТоваровУслуг.Форма.ФормаДокументаТовары»);
В этой форме есть реквизит Объект.
Для Расширения (тонкий клиент, клиент-сервер) помог такой код, взятыйотсюда :
Показать
Пост, помог спасибо.
(14) так и есть:
АдресХранилища = ПоместитьВоВременноеХранилище(НовыйОбъект, УникальныйИд);
по причине:
Переданное значение не может быть помещено во временное хранилище
1С:Предприятие 8.3 (8.3.10.2466)
А метод автора сработал!
В своей публикации не знал как решить проблему не записанного битого объекта:https://infostart.ru/public/608150/
А теперь это стало возможно!
(41) после тестов пришел к мнению, что открыть форму битой ссылки на УФ не возможно. Единственный вариант создавать произвольную форму, но смысла в этом нет, проще записать и открыть уже элемент!
Действительно работает. Спасибо!
(40) вам не нужны танцы с бубном. Получайте новую ссылку о чем автор писал ранее! Это все для УФ нужно!
Если я правильно понимаю — НаКлиенте будет ругаться на отсутствие переменной ДанныеФормы.
все равно идет обращение к серверу так почему сразу не предложить записать объект если надо открыть его форму как рекомендуется в универсальном решении, выигрыша нет — данные формы туда сюда гоняются если документ будет записываться еще раз на сервер полетят данные формы
можно использовать директиву НаСервере и не передавать параметром)
(45)а нет, это я ступил. Не будет ругаться.
(23)
Добрый
точно с таким же столкнулся((
не подскажете почему не заполняются ТЧ?
(21) Зачем пугаете?
ПолучитьФорму (GetForm)
Доступность:
Тонкий клиент, веб-клиент, мобильный клиент, толстый клиент, мобильное приложение(клиент).
Вызов метода выполняет обращение к серверу.
(16)
У меня заработало и как у вас и как у автора.
Странно…
Теперь проблема выбора.
ЧЯДНТ?
Автору СПАСИБО!
(20)
А что у вас изменилось? У меня работают оба варианта.
Платформа 8.3.13.1644
УНФ 1.5
Может кому пригодится. Пункт 2. ОткрытьЗначение(Ссылка). У меня не работало в web (хотя справка говорила что все должно быть норм, ругалось на модальность окна), версия платформы 8.12. ОткрытьФорму() отработало как надо. Открывал документ ЗаказКлиента.
Спасибо!