1с как обойти реквизиты формы
gvk2009 подробно и доходчиво описал разницу методов, за что ему огромное спасибо:
В Синтаксис-Помощнике очень скупо написано о процедуре ДанныеФормыВЗначение(), чуть побольше - о РеквизитФормыВЗначение(). И совсем нет примеров использования. Попробуем с этим разобраться.
РеквизитФормыВЗначение()
Является методом управляемой формы, компилируется только &НаСервере, контекст формы является для него необходимым, поэтому компиляция &НаСервереБезКонтекста недоступна. На клиенте не работает, поскольку в результате получаем прикладной объект.
Где и когда его нужно использовать?
Метод РеквизитФормыВЗначение() необходим, если требуется из модуля формы вызвать стандартный метод объекта или метод (процедуру, функцию) из модуля объекта, из общего модуля.
Этот метод будет отрабатывать с данными, взятыми из формы, т.е. еще не записанными в базу.
Для того, чтобы измененные данные вернуть на форму, используется метод ЗначениеВРеквизитФормы().
Вторым параметром метода РеквизитФормыВЗначение является тип значения. Это необязательный параметр. Если обрабатываемый реквизит не является составным типом, то тип будет автоматически получен из реквизита формы. Иначе генерируется исключение времени выполнения.
В указанных выше случаях метод РеквизитФормыВЗначение() похож на метод ПолучитьОбъект(). Разница в том, что первый получает объект, заполненный данными формы, а второй - объект с данными из базы.
ДанныеФормыВзначение()
В отличие от метода управляемой формы РеквизитФормыВЗначение(), процедура глобального контекста ДанныеФормыВЗначение() может работать без контекста формы, но именно поэтому, в частности, ей необходимо указывать тип конвертируемых данных.
Обратной процедурой является ЗначениеВДанныеФормы().
В этом примере на форме отображен набор записей регистра бухгалтерии. При отработке процедуры, активность набора меняется только на форме, в базе при этом ничего не происходит. Активность у набора записей регистра в базе поменяется только после выполнения операции Записать.
В этом примере на клиент возвращается ОснРеквизит, содержащий измененные данные. Но его еще нужно "запихать" в отображаемую форму. Для этого используем процедуру глобального контекста КопироватьДанныеФормы().
В большинстве случаев процедуры ДанныеФормыВзначение() и РеквизитФормыВЗначение() взаимозаменяемы. При этом РеквизитФормыВЗначение проще в использовании. Но если требуется использование &НаСервереБезКонтекста - тогда только ДанныеФормыВЗначение.
(1) А что есть ОбъектБД? Что значит, не работает, какую ошибку выдает?
Для ссылочных типов вместо НайтиПоТипу можно использовать ОбъектБД.Метаданные()
(2) Либо Документ.Ссылка либо Справочник Ссылка (составной тип на форме).
: Преобразование значения к типу Число не может быть выполненоСообщить(Реквизит + " clear">ВнешняяОбработка.ВнешняяОбработка2.Форма.Форма.Форма(6)>
Сообщить("" + Реквизит.Имя + " clear">
листинг 3.17. Использование итератора «Для Каждого»
(5) Нет, к реквизиту можно обратиться или через точку, или через квадратные скобки. Так что вот такой код точно сработает для ссылочных типов:Для Каждого Реквизит Из ОбъектБД.Метаданные().Реквизиты Цикл Сообщить(Реквизит.Имя + " clear">
(6) Спасибо. Заработало. но не до конца одупляю почему ваш код отрабатывает а мой нет. (8) Потому что у вас переменная Реквизит. А это не строка, а ОбъектМетаданных. У меня Реквизит.Имя - а это уже строка (10) все просто.Сообщить(Реквизит + " +" может быть использован как в сложении, так и в конкатенации строк.
Реквизит это не строка. Платформа пытается привести к числу. Тоже не получается. Вот и ошибка: "Преобразование значения к типу Число не может быть выполнено"
Когда ставим "" + Реквизит, то уже объект Реквизит платформой неявно приводится к строке. Вот и отрабатывает.
Или сразу указываем "Реквизит.Имя". Это уже строка и конкатенация строк отрабатывает штатно.
(10)
Следите за пальцами
Реквизит - тип ОбъектМетаданных
"" + Реквизит - тип Строка, т.к при сложении все преобразуется к типу первого слагаемого
Реквизит.Имя - тип Строка
А сложение Реквизит + " clear">
(1) вообще-то этого достаточно:Сообщить(""+Реквизит + " clear"> Все дошло. Ругался он не на ОбъектБД[Реквизит.Имя] а на Реквизит + " clear"> Кроме реквизитов есть еще коллекция "СтандартныеРеквизиты" (17) много чего есть, только не доступные через метаданные объекта.
Реквизиты, ТабличныеЧасти и СтандартныеРеквизиты доступны. Общие резквизиты - нет.
"вончо" написал. даже работает)
Процедура ТыкНаСервере(ОбъектБД) МетаданныеОбъектБД = Метаданные.НайтиПоТипу(ТипЗнч(ОбъектБД)); Для Каждого Реквизит Из МетаданныеОбъектБД.Реквизиты Цикл Сообщить(""+Реквизит + " = " + ОбъектБД[Реквизит.Имя]); КонецЦикла; Для Каждого ТЧ Из ОбъектБД.Метаданные().ТабличныеЧасти Цикл Сообщить(""+ТЧ); НомерСтроки = 1; Для Каждого Строка Из ОбъектБД[ТЧ.Имя] Цикл Для Каждого Реквизит Из ТЧ.Реквизиты Цикл Сообщить("Строка номер " + НомерСтроки + " " + Реквизит + " timeline-seperator text-center text-primary no-margin no-border"> Показать
В обычном приложении у элемента формы 1С 8.3 было свойство "Значение", доступное как для чтения, так и для записи. Какой аналог в управляемом приложении?
Элементы формы 1С 8.3 могут содержать реквизиты двух видов: реквизиты объекта 1С и реквизиты формы.
Красным помечен реквизит объекта 1С Контрагент, а зеленым – реквизит формы в 1С.
Интерактивно выберем эти элементы в пользовательском режиме 1С и попробуем прочитать их «программно» кнопкой «Прочитать».
Если читать значения реквизитов в клиентской процедуре, то код для 1С Предприятия будет следующий:
Все бы хорошо: мы получили на клиенте значения реквизитов объекта 1С и формы, но – не значения элементов формы 1С. На клиенте значение элементов формы 1С получить нельзя.
2. Как получить значения из элементов формы 1С
Чтобы получить значения из элементов формы 1С, нам потребуется серверный вызов:
Именно на сервере у элемента формы 1С 8.3 становится доступно свойство ПутьКДанным, по которому его можно извлечь либо из Объекта, который имеет тип ДанныеФормыСтруктура:
…либо из Формы, которая имеет тип ФормаКлиентскогоПриложения:
Форма и ее элементы не видны на сервере без контекста. То есть код для 1С:Предприятия выдаст множество ошибок.
Также Форму нельзя передать как параметр в процедуру и функцию на сервер или в общий модуль.
Еще хочется разобрать момент, когда нам возможно увидеть состояние различающихся значений в элементе форме 1С и в объекте. Это возможно в событии элемента ОбработкаВыбора.
Например, при значении поля Контрагент - Ассоль, мы выбрали контрагента Бакалея:
В связи с развитием системы расширений многие разработчики 1С сталкиваются с проблемой: если форма захвачена и на ней произведены изменения, то после обновления в основной конфигурации формы, эти изменения не будут отражены на захваченной форме. Получается, что форму после обновления надо каждый раз проверять. Это трудно и "убивает" все плюсы расширения. Но из любой непростой ситуации есть выход, если знать, где его искать. Можно захватить форму в расширение и не изменять её, а все новые реквизиты добавить программно. Тогда при обновлении формы в основной конфигурации 1С 8.3, форма измениться в расширении, и добавленные реквизиты будут корректно отображаться в ней.
В этой статье я постараюсь собрать все основные методы создания реквизитов на форме.
1. Добавляем реквизит
Начнем с самого простого. Мы добавили реквизит "МоеРасширение_НаименованиеНаАнглийском" в справочник контрагентов.
Для того, чтобы вывести его на форму програмно, пишем код процедуры "МоеРасширение_ПриСозданииНаСервереПосле" (Отказ, Стандартная Обработка).
НовыйЭлемент = Элементы.Добавить ("МоеРасширение_НаименованиеНаАнглийском", Тип("ПолеФормы"));
НовыйЭлемент.ПутьКДанным = "Объект. МоеРасширение_НаименованиеНаАнглийском";
Теперь мы добавим на форму реквизит, которого нет в конфигурации. Например, выведем на форму текущую задолженность: реквизит "МоеРасширение_ТекущаяЗадолженность".
Сначала создадим реквизит:
ДобавляемыеРеквизиты = Новый Массив;
НовыйРеквизит = Новый РеквизитФормы("МоеРасширение_ТекущаяЗадолженность"), Новый ОписаниеТипов ("Число", "Текущая задолженность");
Затем выведем его на форму таким же образом, как и добавленный в конфигурацию реквизит, разница только в поле "ПутьКДанным" – здесь мы пишем наименование только что созданного реквизита:
НовыйЭлемент = Элементы.Добавить("МоеРасширение_НаименованиеНаАнглийском", Тип("ПолеФормы"));
Теперь переместим наши реквизиты под поле "Полное наименование". Для этого надо определить на форме место добавления, в нашем случаем – над группой "ГруппаКолонки":
Для того, чтобы отрабатывались процедуры событий для этих реквизитов, можем указать действия:
Элементы. МоеРасширение_ТекущаяЗадолженность.УстановитьДействие("ПриИзменении", "МоеРасширение_РасшифроватьЗадолженность").
2. Добавление кнопки
Для того, чтобы произвести добавление кнопки на форму, сначала надо програмно добавить команду.
НоваяКоманда.Заголовок = "Показать ОСВ".
ВАЖНО!! В поле действие пишется имя процедуры.
Теперь добавляем саму кнопку:
НоваяКнопка = Элементы.Добавить("МоеРасширение_Кнопка_ПоказатьОСВ", Тип("КнопкаФормы"));
3. Добавление группы
Для добавления группы переместим кнопку к полю "Текущая задолженность". На этом этапе нам надо создать группу и переместить в нее уже созданные наши элементы.
Создаем группу и помещаем ее под наименованием. Затем переносим в нее реквизит "Текущая задолженность" и кнопку "Показать ОСВ":
НоваяГруппа =Элементы.Добавить("МоеРасширение_ГруппаЗадолженность", Тип("ГруппаФормы"));
4. Добавляем табличную часть 1С
Добавим к контрагенту табличную часть 1С "МоеРасширение_Номенклатура" с реквизитом "Номенклатура" и выведем ее на форму.
Сначала мы добавляем табличную часть на форму, после чего описываем все колонки, которые должны отображаться на форме.
ВАЖНО! При создании реквизитов таблицы родителем указывается реквизит формы "Табличная часть".
НоваяТабличнаяЧасть = Элементы.Добавить("МоеРасширение_ТаблицаНоменклатура", Тип("ТаблицаФормы"));
НовыйРеквизитТабличнойЧасти = Элементы.Добавить("МоеРасширение_Номенклатура", Тип("ПолеФормы"),НоваяТабличнаяЧасть);
Используя этот базовый набор, можно изменить любую форму программно. И при обновлениях форма всегда будет подстраиваться под выбранный алгоритм. Если форма поменяется глобально, то расширение выдаст ошибку. Тогда, переписав несколько строчек кода, мы снова получим рабочую форму. Это быстрее и проще, чем каждый раз анализировать диалоговую форму.
Читайте также:
- Как построить график в полярных координатах в excel
- Какие виды гиперссылок может содержать гипертекст в текстовом документе ms word
- Положение о бухгалтерском учете word
- В прошлый раз программа была завершена некорректно и сейчас будут исправлены ошибки
- Samsung positioning что это за программа и нужна ли она на андроид