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

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

2016-10-30_20-00-34

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

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

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

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
32
33
34
35
36
37
38
39
// Получает значение поля по его пути.
//
// Параметры:
// 	Объект - <Произвольный> - Произвольный объект системы, содержащий структуру вложенных полей;
//	Путь - <Строка> - Строка, содержащая путь к заданному полю объекта. Наименования вложенных полей разделены между собой символом ".".
//		К примеру, путь: "Контрагент.ОсновноеКонтактноеЛицо.КонтактноеЛицо";
//	НаименованиеОбъекта - <Строка> - Строка, содержащая имя объекта. Если этот параметр пустой, то путь не содержит наименования самого объекта.
//		К примеру, строка: "Контрагент".
//
// Возвращаемое значение:
//	<Произвольный> - Заданное поле объекта.	
//
Функция ПолучитьЗначениеПоляОбъекта(Объект, Путь = "", НаименованиеОбъекта = "") Экспорт
 
	Если ТипЗнч(Путь) = Тип("Строка") Тогда
		ПутьМассив = РазобратьСтрокуВМассивПоРазделителю(Путь, ".");
	Иначе
		ПутьМассив = Путь;
	КонецЕсли;
	НачальныйИндекс = ?(ЗначениеЗаполнено(СокрЛП(НаименованиеОбъекта)) ИЛИ (ПутьМассив.Количество() > 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));
		ВхождениеРазделителя = Найти(Стр, СтрРазделитель);
	КонецЦикла;
 
	Если НЕ (ИгнорироватьПустые И ПустаяСтрока(Стр)) Тогда
		Результат.Добавить(СокрЛП(Стр));
	КонецЕсли;
 
	Возврат Результат;	
КонецФункции;
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), "ТабличнаяЧасть");
	КонецЕсли;
 
	ИмяТипаДанных = ИмяКоллекции;
	Если ИмяКоллекции = "Справочник" Тогда
		ИмяТипаДанных = ?(Запрос, "Справочник", "Справочники");
	ИначеЕсли ИмяКоллекции = "ПланСчетов" Тогда
		ИмяТипаДанных = ?(Запрос, "ПланСчетов", "ПланыСчетов");
	ИначеЕсли ИмяКоллекции = "Перечисление" Тогда
		ИмяТипаДанных = ?(Запрос, "Перечисление", "Перечисления");
	ИначеЕсли ИмяКоллекции = "Документ" Тогда
		ИмяТипаДанных = ?(Запрос, "Документ", "Документы");
	ИначеЕсли ИмяКоллекции = "ПланВидовХарактеристик" Тогда
		ИмяТипаДанных = ?(Запрос, "ПланВидовХарактеристик", "ПланыВидовХарактеристик");
	ИначеЕсли ИмяКоллекции = "ПланВидовРасчета" Тогда
		ИмяТипаДанных = ?(Запрос, "ПланВидовРасчета", "ПланыВидовРасчета");
	ИначеЕсли ИмяКоллекции = "Отчет" Тогда
		ИмяТипаДанных = ?(Запрос, "Отчет", "Отчеты");
	КонецЕсли;
 
	Возврат ИмяТипаДанных;
КонецФункции;

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

2016-10-30_20-13-11

В обработке:

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

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

Скачать