Перейти к содержимому

Как получить значение поля формы 1с

  • автор:

Почему не получается получить значение реквизита формы в 1С?

Я сделал форму, добавил реквизит пользователей из справочника пользователей и создал поле выбора с типом справочника пользователей. Мне нужно получить значение этого реквизита в модуле формы, но в строке, где я его получаю, выходит ошибка:

Ошибка при вызове метода контекста (РеквизитФормыВЗначение) :РеквизитПользователя = РеквизитФормыВЗначение("Пользователь"); // :ТабДокумент = СформироватьМакетНаСервере(); по причине: Недопустимое значение параметра (параметр номер '1') 

Как это можно исправить? Вот сам код:

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

Вот форма со свойствами поля: И свойства реквизита:

Как обработать выбор значения в поле ввода и кроме выбранной ссылки получить еще и некоторые ее реквизиты?

При выборе ссылочного значения в поле ввода иногда возникает необходимость специальным образом обработать выбирамемое значение.

Например, в документе, нужно выбрать поставщика. Но нужно вмешаться в процесс выбора значения и кроме ссылки на поставщика получить еще и другую информацию о поставщике. Например, его полное наименование и ИНН, которые являются реквизитами поставщика.

Для того, чтобы вмешаться в процесс выбора значения используется событие ОбработкаВыбора() элемента формы Поле . Это событие поставляется расширением поля формы для поля ввода. Обработчик этого события имеет такой синтаксис: ОбработкаВыбора(, , ).

Во втором параметре ( ВыбранноеЗначение ) платформа передает в обработчик то значение, которое выбрал пользователь. В данном случае это будет ссылка на поставщика. Но проблема заключается в том, что обработчик ОбработкаВыбора() исполняется на клиенте, то есть объявление процедуры выглядит так:

&НаКлиенте
Процедура ОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)

А на клиенте возможности ссылки очень сильно ограничены. В частности, от нее нельзя через точку получить значения реквизитов.

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

&НаКлиенте При этом следует иметь ввиду два момента:

  • Во-первых, для получения реквизитов используется неконтекстный серверный вызов ( &НаСервереБезКонтекста ). Это важно, т.к. в этом обработчике нельзя использовать контекстные серверные вызовы ( &НаСервере ).
  • Во-вторых, любое обращение к серверу требует дополнительных ресурсов системы и может замедлять работу пользователя, особенно в случае подключения по низкоскоростному каналу связи. Поэтому нужно прежде всего внимательно оценить, а так ли необходимо в этом месте получать реквизиты ссылки или можно обойтись без этого? И если нужно получать несколько реквизитов и при этом используется какой-то сложный алгоритм – нужно постараться реализовать его так, чтобы все необходимые данные получить за один серверный вызов, вернуть их на клиента и на клиенте только поместить их в нужные поля формы, не проводя каких-то сложных вычислений.

Подробнее об использовании события ОбработкаВыбора() можно прочитать в синтакс-помощнике: Интерфейс (управляемый) — Поле формы — Расширение поля ввода — События .

Как записать полученное значение в поле ввода?

Получаю «Код», хочу записать в «Реквизит1». А свойства наподобие текста найти не могу. Как записать значение и потом его извлечь из поля ввода?

  • Вопрос задан более двух лет назад
  • 1141 просмотр

Комментировать
Решения вопроса 1
программист, архитектор, аналитик

Как записать значение и потом его извлечь из поля ввода?

Нужно не записывать и извлекать из поля ввода, а записывать и извлекать из реквизита, с которым связано поле ввода. Поле ввода — это элемент графического интерфейса, чтобы пользователь мог манипулировать значениями реквизитов. Программно работаем напрямую:

или если это не реквизит формы, а реквизит объекта:

Ответ написан более двух лет назад
Комментировать
Нравится 1 Комментировать
Ответы на вопрос 2

fosihas

Автоматизации учета на 1С.

ps:
есть такая штука отладчик, можно посмотреть какое значение имеет данный реквизит

Как легко можно получить значение поля объекта в 1С?

2 ноября, 2016 — Полезное, Функции & Процедуры — Метки: 1С, Обработки, Функции — нет комментариев

Всё дерево объектов в 1С Предприятие имеет вложенную структуру. Например, справочник «Номенклатура» имеет в своём составе поле «Номенклатурная группа». Справочник «Номенклатурные группы», в свою очередь имеет в своём составе другие поля и т.д. Вся иерархия данных обеспечивает простой, понятный и структурированных подход к их использованию. Для того, чтобы обратиться к тем или иным данным из этой иерархии программисту требуется писать запросы или использовать цикл, причём в каждой конкретной ситуации код 1С будет разным.

2016-10-30_20-00-34

Я предлагаю вашему вниманию одну универсальную функцию, которая обращается к необходимым данным с помощью строки, содержащей путь к этим данным.

Предположим есть объект – элемент справочника «Контрагенты». Нам нужно обратиться к вложенным данным и получить элемент справочника «Контактные лица». Мы сможем это сделать через связку: Контрагент – ОсновноеКонтактноеЛицо – КонтактноеЛицо.

Обращение к функции будет следующим:

ПолучитьЗначениеПоляОбъекта(Контрагент, "Контрагент.ОсновноеКонтактноеЛицо.КонтактноеЛицо", "Контрагент");

ПолучитьЗначениеПоляОбъекта(Контрагент, «Контрагент.ОсновноеКонтактноеЛицо.КонтактноеЛицо», «Контрагент»);

Вот сама функция:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
// Получает значение поля по его пути. // // Параметры: // Объект - - Произвольный объект системы, содержащий структуру вложенных полей; // Путь - - Строка, содержащая путь к заданному полю объекта. Наименования вложенных полей разделены между собой символом ".". // К примеру, путь: "Контрагент.ОсновноеКонтактноеЛицо.КонтактноеЛицо"; // НаименованиеОбъекта - - Строка, содержащая имя объекта. Если этот параметр пустой, то путь не содержит наименования самого объекта. // К примеру, строка: "Контрагент". // // Возвращаемое значение: // - Заданное поле объекта. // Функция ПолучитьЗначениеПоляОбъекта(Объект, Путь = "", НаименованиеОбъекта = "") Экспорт Если ТипЗнч(Путь) = Тип("Строка") Тогда ПутьМассив = РазобратьСтрокуВМассивПоРазделителю(Путь, "."); Иначе ПутьМассив = Путь; КонецЕсли; НачальныйИндекс = ?(ЗначениеЗаполнено(СокрЛП(НаименованиеОбъекта)) ИЛИ (ПутьМассив.Количество() > 0 И ПустаяСтрока(СокрЛП(ПутьМассив[0]))), 1, 0); Поле = Неопределено; Если (НачальныйИндекс = 0) ИЛИ ((НачальныйИндекс = 1) И (ПутьМассив.Количество() > 0) И (ПутьМассив[0] = НаименованиеОбъекта)) Тогда Поле = Объект; Для Индекс = НачальныйИндекс По ПутьМассив.Количество()-1 Цикл Элемент = ПутьМассив[Индекс]; Попытка Поле = Поле[Элемент]; Исключение Поле = Неопределено; Прервать; КонецПопытки; КонецЦикла КонецЕсли; Возврат Поле; КонецФункции;

// Получает значение поля по его пути. // // Параметры: // Объект — — Произвольный объект системы, содержащий структуру вложенных полей; // Путь — — Строка, содержащая путь к заданному полю объекта. Наименования вложенных полей разделены между собой символом «.». // К примеру, путь: «Контрагент.ОсновноеКонтактноеЛицо.КонтактноеЛицо»; // НаименованиеОбъекта — — Строка, содержащая имя объекта. Если этот параметр пустой, то путь не содержит наименования самого объекта. // К примеру, строка: «Контрагент». // // Возвращаемое значение: // — Заданное поле объекта. // Функция ПолучитьЗначениеПоляОбъекта(Объект, Путь = «», НаименованиеОбъекта = «») Экспорт Если ТипЗнч(Путь) = Тип(«Строка») Тогда ПутьМассив = РазобратьСтрокуВМассивПоРазделителю(Путь, «.»); Иначе ПутьМассив = Путь; КонецЕсли; НачальныйИндекс = ?(ЗначениеЗаполнено(СокрЛП(НаименованиеОбъекта)) ИЛИ (ПутьМассив.Количество() > 0 И ПустаяСтрока(СокрЛП(ПутьМассив[0]))), 1, 0); Поле = Неопределено; Если (НачальныйИндекс = 0) ИЛИ ((НачальныйИндекс = 1) И (ПутьМассив.Количество() > 0) И (ПутьМассив[0] = НаименованиеОбъекта)) Тогда Поле = Объект; Для Индекс = НачальныйИндекс По ПутьМассив.Количество()-1 Цикл Элемент = ПутьМассив[Индекс]; Попытка Поле = Поле[Элемент]; Исключение Поле = Неопределено; Прервать; КонецПопытки; КонецЦикла КонецЕсли; Возврат Поле; КонецФункции;

А вот вспомогательные функции:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
// Разбирает строку в массив подстрок по разделителю. // При этом пробелы между подстроками не учитываются. // // Параметры: // Стр - исходная строка; // СтрРазделитель - разделитель, по умолчанию ","; // ИгнорироватьПустые - игнорировать ли пустые места между разделителями. // // Возвращаемое значение: // Массив строк // Функция РазобратьСтрокуВМассивПоРазделителю(Знач Стр, СтрРазделитель = ",", ИгнорироватьПустые = Ложь) Экспорт Результат = Новый Массив; ВхождениеРазделителя = Найти(Стр, СтрРазделитель); Пока ВхождениеРазделителя <> 0 Цикл ЧастьДоРазделителя = СокрЛП(Лев(Стр, ВхождениеРазделителя - 1)); Если НЕ (ИгнорироватьПустые И ПустаяСтрока(ЧастьДоРазделителя)) Тогда Результат.Добавить(ЧастьДоРазделителя); КонецЕсли; Стр = СокрЛП(Сред(Стр, ВхождениеРазделителя + 1)); ВхождениеРазделителя = Найти(Стр, СтрРазделитель); КонецЦикла; Если НЕ (ИгнорироватьПустые И ПустаяСтрока(Стр)) Тогда Результат.Добавить(СокрЛП(Стр)); КонецЕсли; Возврат Результат; КонецФункции;

// Разбирает строку в массив подстрок по разделителю. // При этом пробелы между подстроками не учитываются. // // Параметры: // Стр — исходная строка; // СтрРазделитель — разделитель, по умолчанию «,»; // ИгнорироватьПустые — игнорировать ли пустые места между разделителями. // // Возвращаемое значение: // Массив строк // Функция РазобратьСтрокуВМассивПоРазделителю(Знач Стр, СтрРазделитель = «,», ИгнорироватьПустые = Ложь) Экспорт Результат = Новый Массив; ВхождениеРазделителя = Найти(Стр, СтрРазделитель); Пока ВхождениеРазделителя <> 0 Цикл ЧастьДоРазделителя = СокрЛП(Лев(Стр, ВхождениеРазделителя — 1)); Если НЕ (ИгнорироватьПустые И ПустаяСтрока(ЧастьДоРазделителя)) Тогда Результат.Добавить(ЧастьДоРазделителя); КонецЕсли; Стр = СокрЛП(Сред(Стр, ВхождениеРазделителя + 1)); ВхождениеРазделителя = Найти(Стр, СтрРазделитель); КонецЦикла; Если НЕ (ИгнорироватьПустые И ПустаяСтрока(Стр)) Тогда Результат.Добавить(СокрЛП(Стр)); КонецЕсли; Возврат Результат; КонецФункции;

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
// Определяет относится ли данный объект к одному из типов: Число, Строка, Булево, Дата, УникальныйИдентификатор. // // Параметры: // Объект - произвольный объект данных // // Возвращаемое значение: // Истина - простой тип; Ложь - составной тип. // Функция ЭтоПростойТипДанных(Объект) Экспорт Возврат (ТипЗнч(Объект) = Тип("Число") ИЛИ ТипЗнч(Объект) = Тип("Строка") ИЛИ ТипЗнч(Объект) = Тип("Дата") ИЛИ ТипЗнч(Объект) = Тип("Булево") ИЛИ ТипЗнч(Объект) = Тип("УникальныйИдентификатор")); КонецФункции;

// Определяет относится ли данный объект к одному из типов: Число, Строка, Булево, Дата, УникальныйИдентификатор. // // Параметры: // Объект — произвольный объект данных // // Возвращаемое значение: // Истина — простой тип; Ложь — составной тип. // Функция ЭтоПростойТипДанных(Объект) Экспорт Возврат (ТипЗнч(Объект) = Тип(«Число») ИЛИ ТипЗнч(Объект) = Тип(«Строка») ИЛИ ТипЗнч(Объект) = Тип(«Дата») ИЛИ ТипЗнч(Объект) = Тип(«Булево») ИЛИ ТипЗнч(Объект) = Тип(«УникальныйИдентификатор»)); КонецФункции;

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
// По заданному объекту находит его принадлежность к определённому классу метаданных. // // Параметры: // Данные - Произвольное значение - Передаваемый объект; // Запрос - - // Истина - Класс метаданных будет использоваться в запросе, // Ложь - Класс метаданных будет использоваться в коде. // По умолчанию этот параметр задан "Истина". // // Возвращаемое значение: // - Название класса метаданных. // Функция ВернутьИмяТипаДанных(Данные, Запрос = Истина) Экспорт ТипДанных = ТипЗнч(Данные); ОбъектМетаданных = Метаданные.НайтиПоТипу(ТипДанных); ИмяКоллекции = ""; Если ОбъектМетаданных <> Неопределено Тогда ПолноеИмяМетаданных = ОбъектМетаданных.ПолноеИмя(); МассивСтр = РазобратьСтрокуВМассивПоРазделителю(ПолноеИмяМетаданных, ".", Истина); ИмяКоллекции = ?(МассивСтр.Найти("ТабличнаяЧасть") = Неопределено, Лев(ПолноеИмяМетаданных, Найти(ПолноеИмяМетаданных, ".")-1), "ТабличнаяЧасть"); КонецЕсли; ИмяТипаДанных = ИмяКоллекции; Если ИмяКоллекции = "Справочник" Тогда ИмяТипаДанных = ?(Запрос, "Справочник", "Справочники"); ИначеЕсли ИмяКоллекции = "ПланСчетов" Тогда ИмяТипаДанных = ?(Запрос, "ПланСчетов", "ПланыСчетов"); ИначеЕсли ИмяКоллекции = "Перечисление" Тогда ИмяТипаДанных = ?(Запрос, "Перечисление", "Перечисления"); ИначеЕсли ИмяКоллекции = "Документ" Тогда ИмяТипаДанных = ?(Запрос, "Документ", "Документы"); ИначеЕсли ИмяКоллекции = "ПланВидовХарактеристик" Тогда ИмяТипаДанных = ?(Запрос, "ПланВидовХарактеристик", "ПланыВидовХарактеристик"); ИначеЕсли ИмяКоллекции = "ПланВидовРасчета" Тогда ИмяТипаДанных = ?(Запрос, "ПланВидовРасчета", "ПланыВидовРасчета"); ИначеЕсли ИмяКоллекции = "Отчет" Тогда ИмяТипаДанных = ?(Запрос, "Отчет", "Отчеты"); КонецЕсли; Возврат ИмяТипаДанных; КонецФункции;

// По заданному объекту находит его принадлежность к определённому классу метаданных. // // Параметры: // Данные — Произвольное значение — Передаваемый объект; // Запрос — — // Истина — Класс метаданных будет использоваться в запросе, // Ложь — Класс метаданных будет использоваться в коде. // По умолчанию этот параметр задан «Истина». // // Возвращаемое значение: // — Название класса метаданных. // Функция ВернутьИмяТипаДанных(Данные, Запрос = Истина) Экспорт ТипДанных = ТипЗнч(Данные); ОбъектМетаданных = Метаданные.НайтиПоТипу(ТипДанных); ИмяКоллекции = «»; Если ОбъектМетаданных <> Неопределено Тогда ПолноеИмяМетаданных = ОбъектМетаданных.ПолноеИмя(); МассивСтр = РазобратьСтрокуВМассивПоРазделителю(ПолноеИмяМетаданных, «.», Истина); ИмяКоллекции = ?(МассивСтр.Найти(«ТабличнаяЧасть») = Неопределено, Лев(ПолноеИмяМетаданных, Найти(ПолноеИмяМетаданных, «.»)-1), «ТабличнаяЧасть»); КонецЕсли; ИмяТипаДанных = ИмяКоллекции; Если ИмяКоллекции = «Справочник» Тогда ИмяТипаДанных = ?(Запрос, «Справочник», «Справочники»); ИначеЕсли ИмяКоллекции = «ПланСчетов» Тогда ИмяТипаДанных = ?(Запрос, «ПланСчетов», «ПланыСчетов»); ИначеЕсли ИмяКоллекции = «Перечисление» Тогда ИмяТипаДанных = ?(Запрос, «Перечисление», «Перечисления»); ИначеЕсли ИмяКоллекции = «Документ» Тогда ИмяТипаДанных = ?(Запрос, «Документ», «Документы»); ИначеЕсли ИмяКоллекции = «ПланВидовХарактеристик» Тогда ИмяТипаДанных = ?(Запрос, «ПланВидовХарактеристик», «ПланыВидовХарактеристик»); ИначеЕсли ИмяКоллекции = «ПланВидовРасчета» Тогда ИмяТипаДанных = ?(Запрос, «ПланВидовРасчета», «ПланыВидовРасчета»); ИначеЕсли ИмяКоллекции = «Отчет» Тогда ИмяТипаДанных = ?(Запрос, «Отчет», «Отчеты»); КонецЕсли; Возврат ИмяТипаДанных; КонецФункции;

На основе этого кода была создана простая обработка доступа к данным, которую можно скачать по ссылке ниже.

2016-10-30_20-13-11

  • Выбираете объект (справочник или документ)
  • Задаёте путь к данным
  • Нажимаете кнопку «Выполнить»
  • Получаете доступ к объекту данных.

Смело используйте этот код 1С для реализации своих проектов! Если в коде имеются баги (ошибки), просьба сообщить об этом, написав в комментариях ниже.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *