Статьи‎ > ‎

Изменение свойства передопределенности


Введение

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

  • Справочников;
  • Планов видов характеристик;
  • Планов счетов;
  • Планов видов расчетов;

Зачастую решение о том что " ...а объект все таки лучше сделать предопределенным.." встает, когда необходимо явно обратится к элементу в модуле, использовать поиск по коду или по другим реквизитам, в данном случае не очень корректно, поскольку конфигурация ставится зависимой от данных, а не наоборот. Свойство "Предопределенный" присутствующее в метаданных предназначено только для чтения, каких либо методов позволяющих сделать из обычного элемента предопределенный на момент написания этой статьи не существует, а очень бы хотелось!!

В данной статье мы опишем как всего в несколько действий сделать, один или несколько (хоть все) элементов справочника предопределенными.


Что характеризует элемент как предопределенный?

Хоть и в таблицах СУБД присутствует поле _IsMetaData оно лишь является источником данных для свойства Предопределенный.

Мы конечно можем записать в это поле 0х01. Однако это решит только вопорос пометки удаления (ее нельзя будет установить). Обратится к элементы по имени (Справочник.Ваюты.Рубли) мы конечно же не сможем.

Поле _IsMetaData является скорее следствием. Причины же кроются куда глубже. Пречисление всех предопределенных объектов хранится в таблице конфигурации (Config). В записях с FileName XXXXXX-XXXX-XXXX-XXXXXXXX.1c


Открыв эту запись мы увидим текст примерно следующего содержания:

{0,
{0,
{6,
{0,"",
{"Pattern",
{"#",AE135932-4F94-44DF-92C1-C91F15A92848}
},""},
{1,"",
{"Pattern",
{"B"}
},""},
{2,"",
{"Pattern",
{"#",AE135932-4F94-44DF-92C1-C91F15A92848}
},""},
{3,"",
{"Pattern",
{"S"}
},""},
{4,"",
{"Pattern",
{"S"}
.......

о структуре итих записей я и расскажу.

Формат этих записей не так страшен как кажется. Я бы даже сказал более. "...это формат великолепен". Но, что бы Вам было более понятно, начну с рассмотрения сквозного примера.


От теории к практике

Итак нашей задачей будет изменение типа предопределенности для 2 элементов справочники валюты.

Использовать будем конструктор и групповую обработку, результатов запроса.

С помощью Конструктора открываем файл запросов. Напомню что Ei должен быть версии 1.0.9 и выше, в предыдущих версиях, настройки групповой обработки хранились отдельно от файлов запроса. В данном контексте групповая обработка, это самое основное.


На первом этапе, нашей задачей, будет получить набор однотипных объектов, которые мы хотим сделать предопределенными.

Я в данном случае использовал просто запрос.

Сделаем теперь USD. и рубли предопределенными элементами, для этого перейдем на закладку групповая обработка и отметим наших "жертв".


Для каждого элемента справочника, претендующего на роль предопределенного элемента, выполняются следующий набор обработок. Эти обработки имеют общие параметры и с помощью этих параметров одна обработок может предавать значения другой обработке. Теперь немого о них.


Как я уже говорил - формат хранения предопределенных данных просто великолепен. Великолепие его заключается в том что по средствам небольших текстовых преобразований и функции ЗначениеИзСтрокиВнутр(), мы получим дерево значений, где в качестве строк будут фигурировать предопределенные элементы. Остается только делом техники добавить туда нужны нам строки, преобразовать обратно в текст и запаковать в таблицу ConfigSave с изменением версии.


Что же делает пакет?

1. ПолучениеДереваПредопрЗначений - по типу данных определяет запись в таблице Config. Получает хранящиеся в ней данные преобразовывает их к дереву значений и полученные дерево сохраняет в параметрах "ПредопрЗначения"(поскольку данная фукнция обращается к СУБД в параметрах должна быть верна указана Строка соединения). Обработка выполняется только один раз для первой обрабатываемой строки результатов запроса.

ЕслиОбработкаСоединения()Тогда
Параметры.ИдМетаданных=ПолучитьИД_ИзСсылки(Метаданные.НайтиПоТипу(ТипЗнч(объект)))+".1c";
Параметры.СтруктураЗаписи=вПолучитьСтруктуруЗаписи(Параметры.ИдМетаданных);
Для каждого Элемент из Параметры.СтруктураЗаписи.Содержание Цикл
Если ТипЗнч(Элемент.Значение)=Тип("ТекстовыйДокумент")Тогда
Параметры.ПредопрЗначения=ЗначениеИзСтрокиВнутр("{""#"",e603c0f2-92fb-4d47-8f38-a44a381cf235"+Сред(Элемент.Значение.ПолучитьТекст(),3));
Если Не ТипЗнч(Параметры.ПредопрЗначения)=Тип("ДеревоЗначений") Тогда
ВызватьИсключение "Ожидается дерево значений";
КонецЕсли;
КонецЕсли;
КонецЦикла;
Иначе
ВызватьИсключение "Не удалось подключится к СУБД";
КонецЕсли;

2. ДобавлениеЭлемента - добавляет строки в дерево значений. Основное здесь то что для разных типов приладных объектов сосотав возможных определяемых данных разный, для Справчника например это только:

  • Ссылка на объект БД;
  • Признак группы;
  • Имя;
  • Код;
  • Наименование;

Для ПВХ к этому набору добавляется еще и Тип, Для планов счетов еще таблицы Видов субконто и признаков учета, и так далее.

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

Если не ТипЗнч(Параметры.ПредопрЗначения)=Тип("ДеревоЗначений") Тогда
ВызватьИсключение "Для объекта метаданных, не существует записи предопределенных данных";
КонецЕсли;
НовыйПредопредОбъект=Параметры.ПредопрЗначения.Строки[0].Строки.Добавить();
НовыйПредопредОбъект[0]=ЗначениеИзСтрокиВнутр("{""#"",ae135932-4f94-44df-92c1-c91f15a92848,{1,"+Объект.Ссылка.УникальныйИдентификатор()+"}}"); //ID элемента базы данных
НовыйПредопредОбъект[1]=Ложь; //Это группа
НовыйПредопредОбъект[2]=ЗначениеИзСтрокиВнутр("{""#"",ae135932-4f94-44df-92c1-c91f15a92848,{1,"+Новый УникальныйИдентификатор+"}}"); //ID предопределенного элемента
НовыйПредопредОбъект[3]=СтрЗаменить(Объект.Наименование," ",""); //Имя, без пробелов и спец символов + кончно еще не помешала бы проверка на уникальность
НовыйПредопредОбъект[4]=Объект.Код; //Код
НовыйПредопредОбъект[5]=Объект.Наименование; //Наименование

3. СохранниеИзменений - последняя обработка сохраняет внесенные изменения. Преобразовывает дерево значений к текстовому формату и запсывает измененную запись в таблицу ConfigSave с изменением версии. Обработка выполняется только один раз, для последней обрабатываемой строки результатов запроса.

Представление=СтрЗаменить(ЗначениеВСтрокуВнутр(Параметры.ПредопрЗначения),"{""#"",e603c0f2-92fb-4d47-8f38-a44a381cf235","{0");
Параметры.СтруктураЗаписи.Содержание.Очистить();
ТекстовыйДокумент=Новый ТекстовыйДокумент();
ТекстовыйДокумент.УстановитьТекст(Представление);
Параметры.СтруктураЗаписи.Содержание.Добавить(ТекстовыйДокумент);
вСохранитьСтруктуруЗаписи(Параметры.СтруктураЗаписи,"ConfigSave",Истина);


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

Скачать настройку можно здесь


Comments