Изначально было всего 2 строчки:
И эту ересь в УП теперь на кучу строк нужно переписать.
В общих модулях имеется 2 функции, выполняемые — одна на сервере, другая на клиенте.
В функцию выполняющуюся на клиенте приходит ссылка документа (ссылка может быть всегда разной, т.к. разные документы используют функцию). Обращаюсь у серверу для получения по ссылке объекта. Далее — возвращаю структуру с свойствами обратно в функцию. Ссылка на объект имеется так же в структуре, т.к. есть необходимость потом изменить объект. По ссылке нужно так же получить форму на клиенте. Код:
Не могу разобраться в получении формы по ссылке.
2 ответа 2
работает только на Клиенте. На Сервере какие формы? ))
В управляемом приложении при создании формы объект (ДокументОбъект) преобразуется в ДанныеФормыСтруктура и уничтожается. Далее объект можно получить только преобразовав реквизит формы «Объект» в значение (метод РеквизитФормыВЗначение). Тогда получим снова ДокументОбъект. Который можно модифицировать и затем преобразовать обратно в реквизит формы (метод ЗначениеВРеквизитФормы). Если открыть форму по ссылке и отдельно от формы получить объект, модифицировать и записать, то в форме уже ничего изменить не получится, т.к. версия данных объекта формы будет не совпадать с версией объекта в БД. (почитайте про объектные блокировки 1С. https://infostart.ru/public/543218/)
Всё ещё ищете ответ? Посмотрите другие вопросы с метками 1с или задайте свой вопрос.
Похожие
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
дизайн сайта / логотип © 2019 Stack Exchange Inc; пользовательское содержимое попадает под действие лицензии cc by-sa 4.0 с указанием ссылки на источник. rev 2019.11.15.35459
В 1С Предприятии 8.2 для этих целей существует два возможных сценария работы:
- открыть форму нового документа и предоставить пользователю самому интерактивно записать данные объекта в базу данных.
- создать новый документ программно, программно заполнить его данными и программно записать. Затем, если нужно, показать его пользователю.
В первом сценарии проще всего использовать метод глобального контекста ОткрытьФорму() . Это можно сделать на клиенте.
При этом создается новый документ и открывается для редактирования основная форма этого документа.
Если нужно какое-то предварительное заполнение документа начальными данными, то это можно сделать либо с помощью свойств реквизитов документа ЗначениеЗаполнения , ЗаполнятьИзДанныхЗаполнения либо в обработчике события документа ОбработкаЗаполнения . Подробнее об этом событии можно посмотреть в вопросе Как при открытии формы определить, что создается новый элемент?.
Во втором случае можно программно создать документ на сервере, заполнить данными, если это нужно в обработчике события ОбработкаЗаполнения , записать, и передать ссылку на новый документ в метод глобального контекста ОткрытьЗначение() , который откроет форму этого документа. Например:
Подробнее об использовании методов ОткрытьЗначение() и ОткрытьФорму() можно прочитать в синтакс-помощнике: Глобальный контекст — Процедуры и функции для интерактивной работы .
Если реквизит объекта «вытащен» на форму, то реквизит формы можно получить через объект ЭлементыФормы , который содержит коллекцию элементов формы, сканируя ее в цикле:
Этот цикл позволяет просмотреть имена а так же типы всех реквизитов формы, в том числе такие реквизиты как надписи, командные панели и тд.
Реквизиты формы могут быть различных типов. Поставив фильтр в виде типа реквизита мы можем просмотреть реквизиты определенного типа.
Если реквизит формы имеет тип «ТабличноеПоле», то можно такой элемент просканировать во вложенном цикле и узнать имена колонок таблицы:
Как получить значение отдельного реквизита формы?
Чаще требуется получать не массив реквизитов формы, а значение отдельных конкретных реквизитов формы. Например реквизиты «Шапки» или «Подвала» формы документа.
Реквизиты шапки могут иметь различные типы: Дата, СправочникСсылка, ЧекБокс, элемент раскрывающегося списка и др.
Доступ к табличной части формы через объект
Доступ к табличной части формы (например: Товары) можно получить через объект:
Здесь ДокОбъект.Товары — это табличная часть «Товары» объекта. Далее в цикле табличная часть построчно сканируется!
В каждой итерации цикла можно получить доступ к любому полю строки указав через точку имя этого поля:
Доступ к табличной части формы через ЭлементыФормы
Табличная часть объекта и табличная часть формы объекта — это не одно и то же!
Для того, чтобы код работал правильно, надо чтобы колонка формы табчасти объекта в свойстве данные ссылалась на реквизит табличной части объекта. Этим определяется тип колонки таб части формы.
То есть должна быть установлена связь между реквизитом табчасти объекта и реквизитом табчасти формы. Форм у объекта метаданных может быть много мы знаем. Табличную часть формы объекта можно получить через объект ЭлементыФормы :
Объект ЭлементыФормы используется для доступа к элементам управления, расположенным на форме, в частности к таб части документа.
Результат для документа Авансовый отчет:
Это табличное поле!! Товары
Количество строк: 4
Женские ботфорты коричневые
Ботинки женские демисезонные
Ботинки женские натуральная кожа
Женские босоножки
Если надо получить значение всех колонок всех строк, то организуем дважды вложенный цикл:
Во внешнем цикле сканируются строки, во внутреннем — колонки:
Результат для документа Авансовый отчет:
Это табличное поле!! ВыданныеАвансы
=======================
НомерСтроки 1
ДокументАванса Расходный кассовый ордер ТК000000004 от 15.02.2007 19:24:03
СуммаДокументаАванса 300
ВалютаДокументаАванса USD
Выдано 300
Сумма 174
Такое двойное сканирование удобно использовать для быстрой проверки того, что все колонки таб части формы имеют связь с реквизитами таб части объекта. Если такой связи у какой-либо колонки нет, система сгенерирует ошибку.