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

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

В обработке:
- Выбираете объект (справочник или документ)
- Задаёте путь к данным
- Нажимаете кнопку «Выполнить»
- Получаете доступ к объекту данных.
Смело используйте этот код 1С для реализации своих проектов! Если в коде имеются баги (ошибки), просьба сообщить об этом, написав в комментариях ниже.


Свежие комментарии