Обезличивание данных. Скрытие конфиденциальной информации. Нужна помощь
Здравствуйте, дорогие друзья форумчане! Я уже писал про это пару тем назад, но тема стала неинтересной никому и поэтому упала вниз, без ответов. Я в данный момент учусь 1С в копании, будучи на практике. И передо мной стоит задача сделать ОбщуюКоманду, которая при нажатии обезличит все данные и в справочниках и в документах и вообще везде. То есть после нажатия все данные должны превратиться во что-то по типу "Наименование1, Наименование2 и тд...." Я прекрасно знаю, что есть уже готовые обработки для данной задачи, но мне же поставили задачу сделать то самому в виде команды, чтобы была кнопка, при нажатии на которую произойдёт выше сказанное. Прошу вас помочь мне с решением данной задачи. Можете хотя бы в виде тегов написать план действий, который нужно сделать, что добиться этого. Заранее огромное спасибо. Буду очень благодарен!
Пока что я создал общую команду, в которой решил обойти метаданные.
Пока что я создал общую команду, в которой решил обойти метаданные.
Найденные решения
Если вдруг кому-то будет нужно, то вот решение данной задачи. Я внес пару изменений и вот, что получилось в итоге. И это работает. Я отказался от массива и решил менять наименования сразу же.
Для Каждого МетаданноеСправочника Из Метаданные.Справочники Цикл
Имя = МетаданноеСправочника.Имя;
Счетчик = 1;
Выборка = Справочники[Имя].Выбрать();
Пока Выборка.Следующий() Цикл
Спровочник = Выборка.ПолучитьОбъект();
Для Каждого Реквизит Из МетаданноеСправочника.СтандартныеРеквизиты Цикл
Если Реквизит.Имя = "Наименование" Тогда
Спровочник[Реквизит.Имя] = МетаданноеСправочника.Имя + " " + Счетчик;
КонецЕсли;
КонецЦикла;
Для Каждого Реквизит Из МетаданноеСправочника.Реквизиты Цикл
Если ТипЗнч(Спровочник[Реквизит.Имя]) = Тип("Строка") И ЗначениеЗаполнено(Спровочник[Реквизит.Имя]) Тогда
Спровочник[Реквизит.Имя] = Реквизит.Имя + " " + Счетчик;
КонецЕсли;
КонецЦикла;
Для Каждого МетаданныеТабличнаяЧасть Из МетаданноеСправочника.ТабличныеЧасти Цикл
Для Каждого СтрокаТабличнойЧасти Из Спровочник[МетаданныеТабличнаяЧасть.Имя] Цикл
Если ТипЗнч(Спровочник[Реквизит.Имя]) = Тип("Строка") И ЗначениеЗаполнено(Спровочник[Реквизит.Имя]) Тогда
Спровочник[Реквизит.Имя] = Реквизит.Имя + " " + Счетчик;
КонецЕсли;
КонецЦикла;
КонецЦикла;
Спровочник.ОбменДанными.Загрузка = Истина;
Спровочник.Записать();
Счетчик = Счетчик + 1;
КонецЦикла;
КонецЦикла;
ПоказатьОстальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
Например так:
Процедура УбитьВсе()
Для Каждого мСпр Из Метаданные.Справочники Цикл
Выборка = Справочники[мСпр.Имя].Выбрать();
Пока Выборка.Следующий() Цикл
мОбъект = Выборка.ПолучитьОбъект();
МассивСтандартныхРеквизитов = Новый Массив;
Если мСпр.ДлинаКода > 0 Тогда
МассивСтандартныхРеквизитов.Добавить(Новый Структура("Имя", "Код"));
КонецЕсли;
Если мСпр.ДлинаНаименования > 0 Тогда
МассивСтандартныхРеквизитов.Добавить(Новый Структура("Имя", "Наименование"));
КонецЕсли;
ОчиститьДанные(мОбъект, МассивСтандартныхРеквизитов);
ОчиститьДанные(мОбъект, мСпр.Реквизиты);
Для Каждого мТабЧасть Из мСпр.ТабличныеЧасти Цикл
Для Каждого СтрокаТЧ Из мОбъект[мТабЧасть.Имя] Цикл
ОчиститьДанные(мОбъект, мТабЧасть.Реквизиты);
КонецЦикла;
КонецЦикла;
мОбъект.ОбменДанными.Загрузка = Истина;
мОбъект.Записать();
КонецЦикла;
КонецЦикла;
КонецПроцедуры
Процедура ОчиститьДанные(мОбъект, НаборРеквизитов)
Для Каждого мРеквизит Из НаборРеквизитов Цикл
Если ТипЗнч(мОбъект[мРеквизит.Имя]) = Тип("Строка") Тогда
мОбъект[мРеквизит.Имя] = "авбгд";
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Показать
(34)
Что из этого у меня должно обрабатываться на сервере, а что на клиенте?
Процедура ОчиститьДанные(мОбъект, НаборРеквизитов)
Для Каждого мРеквизит Из НаборРеквизитов Цикл
Если ТипЗнч(мОбъект[мРеквизит.Имя]) = Тип("Строка") Тогда
мОбъект[мРеквизит.Имя] = "авбгд";
КонецЕсли;
КонецЦикла;
КонецПроцедуры
ПоказатьДля Каждого мРеквизит Из НаборРеквизитов Цикл
Если ТипЗнч(мОбъект[мРеквизит.Имя]) = Тип("Строка") Тогда
мОбъект[мРеквизит.Имя] = "авбгд";
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Что из этого у меня должно обрабатываться на сервере, а что на клиенте?
(34)
Друг, ещё раз привет! Я попробовал код, написанный тобою. Изменил только пару названий для удобства, но всё равно у меня не работает. И не выдает ошибку, а просто кнопка не работает.
Друг, ещё раз привет! Я попробовал код, написанный тобою. Изменил только пару названий для удобства, но всё равно у меня не работает. И не выдает ошибку, а просто кнопка не работает.
&НаКлиенте
Процедура КнопкаСмерти(Команда)
КнопкаСмертиНаСервере();
КонецПроцедуры
&НаСервере
Процедура КнопкаСмертиНаСервере()
Для Каждого МетаданноеСправочника Из Метаданные.Справочники Цикл
Выборка = Справочники[МетаданноеСправочника.Имя].Выбрать();
Пока Выборка.Следующий() Цикл
МетаданноеОбъект = Выборка.ПолучитьОбъект();
МассивСтандартныхРеквизитов = Новый Массив;
Если МетаданноеСправочника.ДлинаКода > 0 Тогда
МассивСтандартныхРеквизитов.Добавить(Новый Структура("Имя", "Код"));
КонецЕсли;
Если МетаданноеСправочника.ДлинаНаименования > 0 Тогда
МассивСтандартныхРеквизитов.Добавить(Новый Структура("Имя", "Наименование"));
КонецЕсли;
ОчиститьДанные(МетаданноеОбъект, МассивСтандартныхРеквизитов);
ОчиститьДанные(МетаданноеОбъект, МетаданноеСправочника.Реквизиты);
МетаданноеОбъект.ОбменДанными.Загрузка = Истина;
МетаданноеОбъект.Записать();
КонецЦикла;
КонецЦикла;
КонецПроцедуры
&НаСервере
Процедура ОчиститьДанные(МетаданноеОбъект, НаборРеквизитов)
Для Каждого МетаданноеРеквизит Из НаборРеквизитов Цикл
Если ТипЗнч(МетаданноеОбъект[МетаданноеРеквизит.Имя]) = Тип("Строка") Тогда
МетаданноеОбъект[МетаданноеРеквизит.Имя] = "авбгд";
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Показать
(15)Этой бородатой байке уже много лет. Уже раз пять её слышал. Каждый 1сник должен рассказать историю о том как он в "суровые 90-е" ходил обслуживать компании где в серверной сидел специально обученный человек который должен был прострелить жёсткие диски при первом же шухере при первой опасности.
Только организации в этих историях меняются то банк, то строительная компания, то вот уже оптовка алкогольная...
1сный фольклор такой.
Только организации в этих историях меняются то банк, то строительная компания, то вот уже оптовка алкогольная...
1сный фольклор такой.
(42)
С огнестрельным оружием не всё так просто, там и правила хранения и тд.
Сейчас используются электромагнитные устройства которые по нажатию на кнопку удаляют данные с диска или тонкие клиенты и сервер в другой стране. Когда то давно слышал что некие умельцы делали специальное отверстие в крышке жёсткого диска и приделывали пиропатрон который по нажатию на кнопку выстреливал во внутрь жёсткого диска абразивный металлический порошок, но это то же на уровне байки про охранника в серверной.
Или Поставить триггер, который по кнопке из 1С включает привод нажатия на курок ружья :о)))
С огнестрельным оружием не всё так просто, там и правила хранения и тд.
Сейчас используются электромагнитные устройства которые по нажатию на кнопку удаляют данные с диска или тонкие клиенты и сервер в другой стране. Когда то давно слышал что некие умельцы делали специальное отверстие в крышке жёсткого диска и приделывали пиропатрон который по нажатию на кнопку выстреливал во внутрь жёсткого диска абразивный металлический порошок, но это то же на уровне байки про охранника в серверной.
(26)
&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
ОбработкаКомандыНаСервере();
КонецПроцедуры
&НаСервере
Процедура ОбработкаКомандыНаСервере(ПараметрКоманды, ПараметрыВыполненияКоманды)
МассивОбъектов = Новый Массив;
МассивОбъектов.Добавить("Справочники");
Для каждого Элем из МассивОбъектов Цикл
Для Каждого ТекОбъект из Метаданные[Элем] Цикл
Наименование = ТипСправочника + " " + Сч;
КонецЦикла;
КонецЦикла;
КонецПроцедуры
Не судите строго, я только учусь. Вот такого плана код мне нужен в Общей Команде?
&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
ОбработкаКомандыНаСервере();
КонецПроцедуры
&НаСервере
Процедура ОбработкаКомандыНаСервере(ПараметрКоманды, ПараметрыВыполненияКоманды)
МассивОбъектов = Новый Массив;
МассивОбъектов.Добавить("Справочники");
Для каждого Элем из МассивОбъектов Цикл
Для Каждого ТекОбъект из Метаданные[Элем] Цикл
Наименование = ТипСправочника + " " + Сч;
КонецЦикла;
КонецЦикла;
КонецПроцедуры
Не судите строго, я только учусь. Вот такого плана код мне нужен в Общей Команде?
Ребят, я доработал код и привел его к такому виду, но у меня идет не переименование названий, а просто рядом приписываются какие-то рандомные цифры. Я так понял, что это из-за того, что у меня берутся в массив не наименования реквизитов, а их синоним, но я не знаю, как это можно изменить.
&НаКлиенте
Процедура КомандаСмерти(Команда)
КомандаСмертиНаСервере();
КонецПроцедуры
&НаСервере
Процедура КомандаСмертиНаСервере()
Для каждого МетаданныеСправочника Из Метаданные.Справочники Цикл
МассивСтандартныхРеквизитов = Новый Массив;
Для каждого НаименованияРеквизита Из МетаданныеСправочника.Реквизиты Цикл
МассивСтандартныхРеквизитов.Добавить(Новый Структура("Имя", НаименованияРеквизита.Имя));
КонецЦикла;
Выборка = Справочники[МетаданныеСправочника.Имя].Выбрать();
Пока Выборка.Следующий() Цикл
МетаданноеОбъект = Выборка.ПолучитьОбъект();
ОбезличиваниеДанных(МетаданноеОбъект, МассивСтандартныхРеквизитов);
ОбезличиваниеДанных(МетаданноеОбъект, МетаданныеСправочника.Реквизиты);
КонецЦикла;
КонецЦикла;
КонецПроцедуры
&НаСервере
Процедура ОбезличиваниеДанных(МетаданноеОбъект, СтандартныеРеквизиты)
х = 1;
Для Каждого МетаданноеРеквизит Из СтандартныеРеквизиты Цикл
Если ТипЗнч(МетаданноеОбъект[МетаданноеРеквизит.Имя]) = Тип("Строка") Тогда
МетаданноеОбъект[МетаданноеРеквизит.Имя] = МетаданноеРеквизит.Имя + х;
х = х + 1
КонецЕсли;
КонецЦикла;
МетаданноеОбъект.Записать();
КонецПроцедуры
Показать
(47) Ужас.
Тебе надо переименовать просто наименования всех элементов и групп справочников. А не их реквизитов... Тебе не надо бегать по всем реквизитам, зачем?
PS. Прошу прощения у гуру за использование выборки менеджера, но это нагляднее просто.
Тебе надо переименовать просто наименования всех элементов и групп справочников. А не их реквизитов... Тебе не надо бегать по всем реквизитам, зачем?
Для Каждого МД Из Метаданные.Справочники Цикл
Выборка = Справочники[ МД.Имя].Выбрать();
Счетчик = 0;
Пока Выборка.Следующий() Цикл
СпрОбъект = Выборка.ПолучитьОбъект();
СпрОбъект.Наименование = "Наименование " + XMLСтрока(Счетчик);
СпрОбъект.ОбменДанными.Загрузка = Истина;
СпрОбъект.Записать();
Счетчик = Счетчик + 1;
КонецЦикла;
КонецЦикла;
ПоказатьPS. Прошу прощения у гуру за использование выборки менеджера, но это нагляднее просто.
(49)
Дорогой друг, я не проверял твой способ, но что-то мне кажется, что у тебя будет переименовка всех элементов справочников в "Наименование". А в моём же случае, мне надо, чтобы, если это, допустим справочник Сотрудники, то было "Сотрудник 1, Сотрудник 2 и тд."...
Для Каждого МД Из Метаданные.Справочники Цикл
ИмяТаблицы = МД.Имя;
Выборка = Справочники[ИмяТаблицы].Выбрать();
Счетчик = 0;
Пока Выборка.Следующий() Цикл
СпрОбъект = Выборка.ПолучитьОбъект();
СпрОбъект.Наименование = "Наименование " + XMLСтрока(Счетчик);
СпрОбъект.ОбменДанными.Загрузка = Истина;
СпрОбъект.Записать();
КонецЦикла;
КонецЦикла;
ИмяТаблицы = МД.Имя;
Выборка = Справочники[ИмяТаблицы].Выбрать();
Счетчик = 0;
Пока Выборка.Следующий() Цикл
СпрОбъект = Выборка.ПолучитьОбъект();
СпрОбъект.Наименование = "Наименование " + XMLСтрока(Счетчик);
СпрОбъект.ОбменДанными.Загрузка = Истина;
СпрОбъект.Записать();
КонецЦикла;
КонецЦикла;
Дорогой друг, я не проверял твой способ, но что-то мне кажется, что у тебя будет переименовка всех элементов справочников в "Наименование". А в моём же случае, мне надо, чтобы, если это, допустим справочник Сотрудники, то было "Сотрудник 1, Сотрудник 2 и тд."...
(54) Ничего ты никому не должен. Ты волен обращаться к чему угодно.
Открой синтакс-помощник, пройди по "Общие объекты - Работа с объектами метаданных - Объекты метаданных - Объект метаданных: Справочник - Свойства" и решай, что тебе больше подходит. Вполне возможно, что это и ОсновноеПредставление.
Открой синтакс-помощник, пройди по "Общие объекты - Работа с объектами метаданных - Объекты метаданных - Объект метаданных: Справочник - Свойства" и решай, что тебе больше подходит. Вполне возможно, что это и ОсновноеПредставление.
(49)
Привет ещё раз. Я тут подумал ещё раз над всем, что Вы посоветовали сделать. Но тут есть один момент. Допустим, если в базе есть не только Наименование, но есть ещё Наименование 2 или Наименование на английском, тогда Ваша процедура не работает. Я в принципе только поэтому и создавал массив с реквизитами всеми, чтобы потом их обрабатывать. Вот, что в итоге у меня получилось:
Да, процедура щас не работает почему-то, думаю щас над этим. Но логически, я всё же думаю, что так будет лучше. Да, я в этот раз отказался от массива, но всё равно обращаюсь ко всем реквизитам, а не конкретно к Наименованию
Привет ещё раз. Я тут подумал ещё раз над всем, что Вы посоветовали сделать. Но тут есть один момент. Допустим, если в базе есть не только Наименование, но есть ещё Наименование 2 или Наименование на английском, тогда Ваша процедура не работает. Я в принципе только поэтому и создавал массив с реквизитами всеми, чтобы потом их обрабатывать. Вот, что в итоге у меня получилось:
Процедура КомандаСмертиНаСервере()
Для Каждого МетаданноеСправочника Из Метаданные.Справочники Цикл
Имя = МетаданноеСправочника.Имя;
х = 1;
Выборка = Справочники[Имя].Выбрать();
Пока Выборка.Следующий() Цикл
Спровочник = Выборка.ПолучитьОбъект();
Для Каждого Реквизит Из МетаданноеСправочника.Реквизиты Цикл
Если Реквизит.Имя = "Наименование" Тогда
Спровочник[Реквизит.Имя] = МетаданноеСправочника + " " + х;
ИначеЕсли ТипЗнч(Спровочник[Реквизит.Имя]) = Тип("Строка") Тогда
Спровочник[Реквизит.Имя] = Реквизит + " " + х;
КонецЕсли;
КонецЦикла;
Спровочник.Записать();
х = х + 1;
КонецЦикла;
КонецЦикла;
КонецПроцедуры
ПоказатьДа, процедура щас не работает почему-то, думаю щас над этим. Но логически, я всё же думаю, что так будет лучше. Да, я в этот раз отказался от массива, но всё равно обращаюсь ко всем реквизитам, а не конкретно к Наименованию
(60)
Допустим, если в базе есть не только Наименование, но есть ещё Наименование 2 или Наименование на английском, тогда Ваша процедура не работает.
Как и ваша. Тем более, что я не собирался за вас сделать всю работу. Я лишь показал более правильный скелет алгоритма работы с метаданными и ссылками.
Да, процедура щас не работает почему-то, думаю щас над этим.
Удачи!
Если вдруг кому-то будет нужно, то вот решение данной задачи. Я внес пару изменений и вот, что получилось в итоге. И это работает. Я отказался от массива и решил менять наименования сразу же.
Для Каждого МетаданноеСправочника Из Метаданные.Справочники Цикл
Имя = МетаданноеСправочника.Имя;
Счетчик = 1;
Выборка = Справочники[Имя].Выбрать();
Пока Выборка.Следующий() Цикл
Спровочник = Выборка.ПолучитьОбъект();
Для Каждого Реквизит Из МетаданноеСправочника.СтандартныеРеквизиты Цикл
Если Реквизит.Имя = "Наименование" Тогда
Спровочник[Реквизит.Имя] = МетаданноеСправочника.Имя + " " + Счетчик;
КонецЕсли;
КонецЦикла;
Для Каждого Реквизит Из МетаданноеСправочника.Реквизиты Цикл
Если ТипЗнч(Спровочник[Реквизит.Имя]) = Тип("Строка") И ЗначениеЗаполнено(Спровочник[Реквизит.Имя]) Тогда
Спровочник[Реквизит.Имя] = Реквизит.Имя + " " + Счетчик;
КонецЕсли;
КонецЦикла;
Для Каждого МетаданныеТабличнаяЧасть Из МетаданноеСправочника.ТабличныеЧасти Цикл
Для Каждого СтрокаТабличнойЧасти Из Спровочник[МетаданныеТабличнаяЧасть.Имя] Цикл
Если ТипЗнч(Спровочник[Реквизит.Имя]) = Тип("Строка") И ЗначениеЗаполнено(Спровочник[Реквизит.Имя]) Тогда
Спровочник[Реквизит.Имя] = Реквизит.Имя + " " + Счетчик;
КонецЕсли;
КонецЦикла;
КонецЦикла;
Спровочник.ОбменДанными.Загрузка = Истина;
Спровочник.Записать();
Счетчик = Счетчик + 1;
КонецЦикла;
КонецЦикла;
Показать
(63)Через цикл со стандартными реквизитами я меняю наименование, через условие если. Так как наименование как раз и хранится в стандартных реквизитах. А в цикле с обычными реквизитами, я ставлю условие Если = Тип("Строка"), так как в добавленных мною реквизитах наименования нет и там надо проверять по типу.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот