Сервисные функции работы с Категориями и Свойствами

В пополнение копилки фрагментов кода предлагаю сервисные функции Получения и Установки категории объекта для 1С8.х., а также аналогичную работу со Свойствами.

Часто в процессе написания обработок обмена данными между разнородными системами, для анализа дополнительных реквизитов и свойств объектов в процессе выполнения множества операций обработки данных желательно наличие сервисных функций по чтению (установке) Категорий и Свойств. Для подобных нужд встроил в конфигурацию собственный модуль с подобными Функциями.

Функции работы с категориями работают на типовых УТ (вероятно, должны работать в УПП и др.).

Мои Функции работы со свойствами рассчитаны на модифицированный механизм Свойств и нет смысла выкладывать. В Свойства добавлены новые виды Объектов (в частности ДоговорыКонтрагентов) и новые виды Значений (Сертификаты, ДоговорыКонтрагента и др.). Переделывать под Типовую или делать полностью Универсальной пока руки не дошли…

P.S. В коде использована глобальная функция, присутствующая не во всех конфигурациях «ЗначениеНеЗаполнено(Значение)», соответственно её надо будет воссоздать или заменить на аналог в тексте.

По просьбам публики… сам текст Функций

Для справки во вложении Функции работы со Свойствами (Свойства в моей УТ расширены, добавлены носители свойств и виды значений)

 

//НВЮ/ Получает заказанную Категорю Объекта
//
// Параметры
//  Эл  – СправочникСсылка/ДокументСсылка – для получения Категории
//  НаименованиеСвойства  – Строка_50 – Наименование получаемой Категории
//                          Предопределённый или ссылка Спр.Категории
// Возвращаемое значение:
//   Значение заказанной Категории (Булево или Неопределено-если ошибка)
//
Функция ПолучитьКатегориюОбъекта(Эл, НаименованиеКатегории) Экспорт
Если Эл = Неопределено Тогда// Объект не указан
Возврат Неопределено;
ИначеЕсли ЗначениеНеЗаполнено(Эл) Тогда // Объект не указан
Возврат Неопределено;
КонецЕсли;
Если ТипЗнч(НаименованиеКатегории) = Тип("СправочникСсылка.КатегорииОбъектов") Тогда
ТребСвойство = НаименованиеКатегории;
Иначе
ТребСвойство = Справочники.КатегорииОбъектов.НайтиПоНаименованию(НаименованиеКатегории);
ЕслиНе ЗначениеЗаполнено(ТребСвойство) Тогда
Возврат Неопределено;
КонецЕсли;
КонецЕсли;
КатОбъ=РегистрыСведений.КатегорииОбъектов.СоздатьНаборЗаписей();
КатОбъ.Отбор.Объект.Значение=Эл;
КатОбъ.Отбор.Объект.Использование = Истина;
КатОбъ.Отбор.Категория.Значение=ТребСвойство;
КатОбъ.Отбор.Категория.Использование = Истина;
КатОбъ.Прочитать();
Возврат КатОбъ.Количество()=1; // Истина=Категория имелось, Ложь=Категории нет
КонецФункции// ПолучитьКатегориюОбъекта()

//НВЮ/ Устанавливает Категорию Номенклатуры/Контрагента/Документа
//
// Параметры
//  НазвКат  – – Наименование устанавливаемой Категории
//                Предопределенная или Ссылка Спр.Категории
//  ТекЗнКат  – – Значение устанавливаемой Категории
//  Эл  – – Носитель Категории
//         или – Носитель Категории
//
Процедура УстановитьКатегориюОбъекта(НазвКат, ТекЗнКат=Истина, Эл) Экспорт
Если ТипЗнч(НазвКат) = Тип("СправочникСсылка.КатегорииОбъектов") Тогда
ТекСвойство = НазвКат;
Иначе
ТекСвойство = Справочники.КатегорииОбъектов.НайтиПоНаименованию(НазвКат);
ЕслиНе ЗначениеЗаполнено(ТекСвойство) Тогда
Возврат;
КонецЕсли;
КонецЕсли;
КатОбъ=РегистрыСведений.КатегорииОбъектов.СоздатьНаборЗаписей();
КатОбъ.Отбор.Объект.Значение=Эл.Ссылка;
КатОбъ.Отбор.Объект.Использование = Истина;
КатОбъ.Отбор.Категория.Значение=ТекСвойство;
КатОбъ.Отбор.Категория.Использование = Истина;
КатОбъ.Прочитать();
ЗнСвва=Неопределено;
Если КатОбъ.Количество()>0 И Не ТекЗнКат Тогда// Категория Установлена, надо удалить
КатОбъ.Очистить();
КатОбъ.Записать();
ИначеЕсли КатОбъ.Количество()=0 И ТекЗнКат Тогда // Категория отсутствует, надо создать
НовЗапись=КатОбъ.Добавить();
НовЗапись.Объект=Эл.Ссылка;
НовЗапись.Категория=ТекСвойство;
КатОбъ.Записать();
Иначе// Категория актуальна
//Ничего не меняем
КонецЕсли;
КонецПроцедуры// Установка Категории

// 14.10.2024/ Функции Чтения и Установки Свойств переписаны и оптимизированы на случай произвольного расширения допустимых типов Свойств и их Значений. Для функции «УстановитьСвойствоОбъекта()» допавлена Опция «АвтоСоздание»… Тестировалась и отлаживалась в основном на УТ_10.3, но механизм свойств однотипен практически во всех конфигурациях 1С8 — следовательно применим к большинству конфигураций.

7 Comments

  1. saiten

    Скучно… В архиве текстовый файл. Так, может, лучше вывести функции прямо в тексте публикации? А то так и тянется рука к минусу. К тому же:

    1. Функция ЗначениеНеЗаполнено(…) будет работать только в 8.0, для 8.1 и 8.2 надо её заменить на НЕ ЗначениеЗаполнено(…). Если очень уж хочется, чтоб работало и там — и там, то можно написать что-нибудь типа

    Заполнено = ложь;

    Попытка

    Выполнить(«Заполнено = НЕ ЗначениеНеЗаполнено(…)»);

    Исключение

    Выполнить(«Заполнено = ЗначениеЗаполнено(…)»);

    КонецПопытки;

    Если НЕ Заполнено Тогда …

    2. Имена переменных по три буквы от слова — жесть.

    3. В функцию установки свойства неплохо бы добавить флаг создания свойства с данным именем, если оно не найдено.

    Reply
  2. V.Nikonov

    (1) Вообще то

    1) функция ЗначениеНеЗаполнено(…) не является Системной и прописана в Общем модуле.

    2) Нечего возразить. Вот только для переменных живых в единственной функции лень писать длинные имена и несколько раз их повторять по ходу написания модуля.

    3) Не знаю что на меня нашло? Может Мани захотелось…. Пожалуй, пойду пользователям на встречу. Есть опасность насоздавать слишком много «Ошибочных» категорий, но желающие могут рискнуть самостоятельно подправить под себя АвтоСоздание Категорий.

    Reply
  3. saiten

    (2)

    Есть опасность насоздавать слишком много «Ошибочных» категорий, но желающие могут рискнуть самостоятельно подправить под себя АвтоСоздание Категорий.

    Риск, в общем-то, минимальный. Проще, имхо, ошибиться, вбив в базу имя категории, отличное от того, что передается в функцию. Хотя, автосоздание, конечно неоднозначный вопрос, это да. Для себя выработал такой принцип: свойства (ну, и категории), подразумевающие интерактивное заполнение перед применением, создаются при первом запуске, а предназначенные чисто для программных нужд — при первом обращении на чтение или запись.

    Reply
  4. V.Nikonov

    (3) В моей практике чаще не в новой ИБ, а после изменения методик учета. Соответственно завожу либо предопределённые Свойства/Категории, либо ручками готовлю почву… И только потом начинается автообмен.

    Reply
  5. v_id

    Спасибо! А тоже самое, но для свойств можно?

    Reply
  6. V.Nikonov

    (5) Так как моя конфигурация УТ подверглась значительным модификациям, в частности существенно изменены свойства, то публиковать текст моих функций нецелесообразно. Переписывать функции под типовую конфигурацию за спасибо — пока нет времени. Возможно, в будущем, когда появится время или появится Заказчик, готовый оплатить хотя бы часть работ…

    Reply
  7. w22u

    Эти сервисные функции были использованы для заранее созданной категории «Проверено» для всех документов в двух обработках для УТ 10.3 http://infostart.ru/public/115655/

    Reply

Leave a Comment

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