Всё дерево объектов в 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С для реализации своих проектов! Если в коде имеются баги (ошибки), просьба сообщить об этом, написав в комментариях ниже.
Свежие комментарии