Здравствуйте, дорогие друзья форумчане! Я уже писал про это пару тем назад, но тема стала неинтересной никому и поэтому упала вниз, без ответов. Я в данный момент учусь 1С в копании, будучи на практике. И передо мной стоит задача сделать ОбщуюКоманду, которая при нажатии обезличит все данные и в справочниках и в документах и вообще везде. То есть после нажатия все данные должны превратиться во что-то по типу "Наименование1, Наименование2 и тд...." Я прекрасно знаю, что есть уже готовые обработки для данной задачи, но мне же поставили задачу сделать то самому в виде команды, чтобы была кнопка, при нажатии на которую произойдёт выше сказанное. Прошу вас помочь мне с решением данной задачи. Можете хотя бы в виде тегов написать план действий, который нужно сделать, что добиться этого. Заранее огромное спасибо. Буду очень благодарен!

Пока что я создал общую команду, в которой решил обойти метаданные.
---
Если вдруг кому-то будет нужно, то вот решение данной задачи. Я внес пару изменений и вот, что получилось в итоге. И это работает. Я отказался от массива и решил менять наименования сразу же.

```1c
    Для Каждого МетаданноеСправочника Из Метаданные.Справочники Цикл
    Имя = МетаданноеСправочника.Имя;
    Счетчик = 1;
    Выборка = Справочники[Имя].Выбрать();
    Пока Выборка.Следующий() Цикл
    Спровочник = Выборка.ПолучитьОбъект();
    Для Каждого Реквизит Из МетаданноеСправочника.СтандартныеРеквизиты Цикл
    Если Реквизит.Имя = "Наименование" Тогда
    Спровочник[Реквизит.Имя] = МетаданноеСправочника.Имя + " " + Счетчик;
    КонецЕсли;
    КонецЦикла;

    Для Каждого Реквизит Из МетаданноеСправочника.Реквизиты Цикл
    Если ТипЗнч(Спровочник[Реквизит.Имя]) = Тип("Строка") И ЗначениеЗаполнено(Спровочник[Реквизит.Имя]) Тогда
    Спровочник[Реквизит.Имя] = Реквизит.Имя + " " + Счетчик;
    КонецЕсли;
    КонецЦикла;

    Для Каждого МетаданныеТабличнаяЧасть Из МетаданноеСправочника.ТабличныеЧасти Цикл
    Для Каждого СтрокаТабличнойЧасти Из Спровочник[МетаданныеТабличнаяЧасть.Имя] Цикл
    Если ТипЗнч(Спровочник[Реквизит.Имя]) = Тип("Строка") И ЗначениеЗаполнено(Спровочник[Реквизит.Имя]) Тогда
    Спровочник[Реквизит.Имя] = Реквизит.Имя + " " + Счетчик;
    КонецЕсли;
    КонецЦикла;
    КонецЦикла;
    Спровочник.ОбменДанными.Загрузка = Истина;
    Спровочник.Записать();
    Счетчик = Счетчик + 1;
    КонецЦикла;
    КонецЦикла;
```
---
Например так:

```1c
    Процедура УбитьВсе()

    Для Каждого мСпр Из Метаданные.Справочники Цикл
    Выборка = Справочники[мСпр.Имя].Выбрать();
    Пока Выборка.Следующий() Цикл

    мОбъект = Выборка.ПолучитьОбъект();

    МассивСтандартныхРеквизитов = Новый Массив;
    Если мСпр.ДлинаКода > 0 Тогда
    МассивСтандартныхРеквизитов.Добавить(Новый Структура("Имя", "Код"));
    КонецЕсли;
    Если мСпр.ДлинаНаименования > 0 Тогда
    МассивСтандартныхРеквизитов.Добавить(Новый Структура("Имя", "Наименование"));
    КонецЕсли;
    ОчиститьДанные(мОбъект, МассивСтандартныхРеквизитов);

    ОчиститьДанные(мОбъект, мСпр.Реквизиты);

    Для Каждого мТабЧасть Из мСпр.ТабличныеЧасти Цикл
    Для Каждого СтрокаТЧ Из мОбъект[мТабЧасть.Имя] Цикл
    ОчиститьДанные(мОбъект, мТабЧасть.Реквизиты);
    КонецЦикла;
    КонецЦикла;

    мОбъект.ОбменДанными.Загрузка = Истина;
    мОбъект.Записать();

    КонецЦикла;
    КонецЦикла;

    КонецПроцедуры

    Процедура ОчиститьДанные(мОбъект, НаборРеквизитов)

    Для Каждого мРеквизит Из НаборРеквизитов Цикл

    Если ТипЗнч(мОбъект[мРеквизит.Имя]) = Тип("Строка") Тогда

    мОбъект[мРеквизит.Имя] = "авбгд";

    КонецЕсли;

    КонецЦикла;

    КонецПроцедуры
```
---
Что из этого у меня должно обрабатываться на сервере, а что на клиенте?
---
Чуть больше, чем всё.
---
на клиенте у вас данных нет. Они все на сервере.
---
Ну если в 1С такому не учат, то я не знаю, простите...
---
Друг, ещё раз привет! Я попробовал код, написанный тобою. Изменил только пару названий для удобства, но всё равно у меня не работает. И не выдает ошибку, а просто кнопка не работает.

```1c
    &НаКлиенте
    Процедура КнопкаСмерти(Команда)

    КнопкаСмертиНаСервере();

    КонецПроцедуры

    &НаСервере
    Процедура КнопкаСмертиНаСервере()

    Для Каждого МетаданноеСправочника Из Метаданные.Справочники Цикл
    Выборка = Справочники[МетаданноеСправочника.Имя].Выбрать();
    Пока Выборка.Следующий() Цикл

    МетаданноеОбъект = Выборка.ПолучитьОбъект();

    МассивСтандартныхРеквизитов = Новый Массив;
    Если МетаданноеСправочника.ДлинаКода > 0 Тогда
    МассивСтандартныхРеквизитов.Добавить(Новый Структура("Имя", "Код"));
    КонецЕсли;
    Если МетаданноеСправочника.ДлинаНаименования > 0 Тогда
    МассивСтандартныхРеквизитов.Добавить(Новый Структура("Имя", "Наименование"));
    КонецЕсли;
    ОчиститьДанные(МетаданноеОбъект, МассивСтандартныхРеквизитов);

    ОчиститьДанные(МетаданноеОбъект, МетаданноеСправочника.Реквизиты);

    МетаданноеОбъект.ОбменДанными.Загрузка = Истина;
    МетаданноеОбъект.Записать();

    КонецЦикла;
    КонецЦикла;

    КонецПроцедуры

    &НаСервере
    Процедура ОчиститьДанные(МетаданноеОбъект, НаборРеквизитов)

    Для Каждого МетаданноеРеквизит Из НаборРеквизитов Цикл

    Если ТипЗнч(МетаданноеОбъект[МетаданноеРеквизит.Имя]) = Тип("Строка") Тогда

    МетаданноеОбъект[МетаданноеРеквизит.Имя] = "авбгд";

    КонецЕсли;

    КонецЦикла;

    КонецПроцедуры
```
---
Для начала надо определить данные, которые надо обезличить.
Далее искать по метаданным эти реквизиты (в шапке и в табличных частях) и заменять по алгоритму, опять же для каждых данных свой алгоритм.
---
Он не поставил задачу обезличить их на всегда, а только видимость определенного пользователя
---
Навсегда. Мне надо создать, так скажем, кнопку смерти, которая просто навсегда переименует все данные
---
А не проще по кнопке смерти затирать данные базы полностью, это будет надежнее
---
Если это просто задача для тренировки, то да - тренируйтесь.
Но, у вас наверняка делаются бекапы базы этой? В них эта кнопка так же должна удалить\обезличить всю инфу?
---
(2)
Он не поставил задачу обезличить их на всегда, а только видимость определенного пользователя
Найти в теме автора, сообщение о том что данные надо только скрыть для одного пользователя или вернуть их к исходному состоянию по нажатию другой кнопки.
---
Так у него в вопросе вообще мало информации, чтобы и эти варианты исключать из условия задачи, может проще дождаться его уточнений, а не спамить советы по неполному тз?
---
Каким образом определить какие данные? Мне надо, чтобы все данные в базе стали таковыми. Допустим, если это справочник Контрагенты, то все контрагенты там должны стать: Контрагент 1, Контрагент 2.
---
ИНН...
---
Чушь не неси. Обезличить данные для одного пользователя конечно можно, но это уже не команда и не обработка, а переписать конфигурацию. Задача именно обезличить базу, такое например надо, если надо отдать базу на тестирование или разработку.
---
И как потом после тестирования вернуть данные назад? Ведь если алгоритм в "твоей чуши" задан в программном модуле, то его можно и отчитать имея доступ к базе полный
---
Никак. А зачем? Обезличивается передаваемая копия...
---
Если бы была такая задача, то 1С здесь вообще не нужен. Просто воспользоваться программой по затиранию данных или грохнуть диск.
---
В 90е годы в одной оптовке, торгующей алкоголем видел в серверной охранника с пушкой, который должен был в случае маски-шоу стрелять в винт сервера.
---
Вопрос как отреагировать должны на стрельбу маски? ))
---
Этой бородатой байке уже много лет. Уже раз пять её слышал. Каждый 1сник должен рассказать историю о том как он в "суровые 90-е" ходил обслуживать компании где в серверной сидел специально обученный человек который должен был прострелить жёсткие диски при первом же шухере при первой опасности.
Только организации в этих историях меняются то банк, то строительная компания, то вот уже оптовка алкогольная...

1сный фольклор такой.
---
Там проще не стрелка, а хорошего бегуна нанимать, выдернул и в бега )
---
"Летящий мяч быстрее бегущего футболиста" (С) Из кина какого-то...
---
Стрелять по стреляющему в диск быстрее будут, чем по бегущему- таких полномочий точно в ордере нет, а вот при стрельбе- они появятся )
---
Зато у бегущего диск целый, не простреленный.
Это просто вопрос цели и средств.
Не всегда те, кому интересен диск - это люди с ордерами.
---
Те кто без ордеров работали по схеме джип-тетрадка-сейф, дисками они не пользовались и их не читали )
---
Если только наименования, то просто. Обойти все справочники и переименовать так
Наименование = ТипСправочника + " " + Сч;

Но как намекнули выше, есть и другие данные. ИНН, контактная информация, комментарии, дополнительные сведения.
---
И как ты их потом возвращать к начальному состоянию будешь? Обратным алгоритмом? А тот от кого пытались скрыть информацию этот алгоритм не способен отчитать будет? )
---
Элементарно... Или вообще не надо возвращать (обезличили копию для передачи на тестирование)... Или из секретных бэкапов по ссылкам (ссылки же не изменяются при изменении реквизитов)...
---
А ни как, это делается для того что бы не создавать демо базу.
В любом случае такая операция не возвратима, если в базе не ведется версионирование и это обойти можно.
---
Если ведется версионирование, то какое это "скрытие" данных? )
---
Одна строчка для убийства регистра версий.
---
Ещё лежат бекапы где-то...
---
Видимо и бекапы надо убить кнопкой, раз скрыть надо окончательно и от всех
---
И диск отформатировать низкоуровневым форматом сразу тогда, что бы не восстановили.
Или Поставить триггер, который по кнопке из 1С включает привод нажатия на курок ружья :о))) Что бы быстро и надежно))) И охранник не нужен...
---
Или Поставить триггер, который по кнопке из 1С включает привод нажатия на курок ружья :о)))
С огнестрельным оружием не всё так просто, там и правила хранения и тд.

Сейчас используются электромагнитные устройства которые по нажатию на кнопку удаляют данные с диска или тонкие клиенты и сервер в другой стране. Когда то давно слышал что некие умельцы делали специальное отверстие в крышке жёсткого диска и приделывали пиропатрон который по нажатию на кнопку выстреливал во внутрь жёсткого диска абразивный металлический порошок, но это то же на уровне байки про охранника в серверной.
---
Так же в уже отдаленные времена у одних клиентов серверная стояла в газельке у офиса))).
Тут короче баек множество)))
---
у одних клиентов серверная стояла в газельке у офиса
О-о-о... ithappens подъехал
---
микроволновка надежнее
---
Перестань спамить тему не по делу.
---
Аналогичное пожелание
---
Перед тем как называть другие сообщения спамом, надо сначала более детально с ТЗ вопрошающего ознакомится, чтобы считать только свои советы истиной
---
И опять Вы пишите, лишь бы написать, но не читаете. Читайте сообщение (5)
---
Если навсегда, то зачем алгоритмы? Просто любые содержательные поля и значения заменить на любое значение
---
&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)

 ОбработкаКомандыНаСервере();

КонецПроцедуры

&НаСервере
Процедура ОбработкаКомандыНаСервере(ПараметрКоманды, ПараметрыВыполненияКоманды)

  МассивОбъектов = Новый Массив;
     МассивОбъектов.Добавить("Справочники");

     Для каждого Элем из МассивОбъектов Цикл
   Для Каждого ТекОбъект из Метаданные[Элем] Цикл
    Наименование = ТипСправочника + " " + Сч;
   КонецЦикла;
  КонецЦикла;

КонецПроцедуры

Не судите строго, я только учусь. Вот такого плана код мне нужен в Общей Команде?
---
Ребят, я доработал код и привел его к такому виду, но у меня идет не переименование названий, а просто рядом приписываются какие-то рандомные цифры. Я так понял, что это из-за того, что у меня берутся в массив не наименования реквизитов, а их синоним, но я не знаю, как это можно изменить.

```1c
    &НаКлиенте
    Процедура КомандаСмерти(Команда)

    КомандаСмертиНаСервере();

    КонецПроцедуры

    &НаСервере
    Процедура КомандаСмертиНаСервере()

    Для каждого МетаданныеСправочника Из Метаданные.Справочники Цикл

    МассивСтандартныхРеквизитов = Новый Массив;

    Для каждого НаименованияРеквизита Из МетаданныеСправочника.Реквизиты Цикл

    МассивСтандартныхРеквизитов.Добавить(Новый Структура("Имя", НаименованияРеквизита.Имя));

    КонецЦикла;

    Выборка = Справочники[МетаданныеСправочника.Имя].Выбрать();
    Пока Выборка.Следующий() Цикл

    МетаданноеОбъект = Выборка.ПолучитьОбъект();

    ОбезличиваниеДанных(МетаданноеОбъект, МассивСтандартныхРеквизитов);
    ОбезличиваниеДанных(МетаданноеОбъект, МетаданныеСправочника.Реквизиты);

    КонецЦикла;

    КонецЦикла;

    КонецПроцедуры

    &НаСервере
    Процедура ОбезличиваниеДанных(МетаданноеОбъект, СтандартныеРеквизиты)

    х = 1;

    Для Каждого МетаданноеРеквизит Из СтандартныеРеквизиты Цикл

    Если ТипЗнч(МетаданноеОбъект[МетаданноеРеквизит.Имя]) = Тип("Строка") Тогда

    МетаданноеОбъект[МетаданноеРеквизит.Имя] = МетаданноеРеквизит.Имя + х;

    х = х + 1

    КонецЕсли;

    КонецЦикла;

    МетаданноеОбъект.Записать();

    КонецПроцедуры
```
---
Ужас.
Тебе надо переименовать просто наименования всех элементов и групп справочников. А не их реквизитов... Тебе не надо бегать по всем реквизитам, зачем?

```1c
    Для Каждого МД Из Метаданные.Справочники Цикл
    Выборка = Справочники[ МД.Имя].Выбрать();
    Счетчик = 0;
    Пока Выборка.Следующий() Цикл
    СпрОбъект = Выборка.ПолучитьОбъект();
    СпрОбъект.Наименование = "Наименование " + XMLСтрока(Счетчик);
    СпрОбъект.ОбменДанными.Загрузка = Истина;
    СпрОбъект.Записать();
    Счетчик = Счетчик + 1;
    КонецЦикла;
    КонецЦикла;
```

PS. Прошу прощения у гуру за использование выборки менеджера, но это нагляднее просто.
---
Для Каждого МД Из Метаданные.Справочники Цикл
    ИмяТаблицы = МД.Имя;
    Выборка = Справочники[ИмяТаблицы].Выбрать();
    Счетчик = 0;
    Пока Выборка.Следующий() Цикл
        СпрОбъект = Выборка.ПолучитьОбъект();
        СпрОбъект.Наименование = "Наименование " + XMLСтрока(Счетчик);
        СпрОбъект.ОбменДанными.Загрузка = Истина;
        СпрОбъект.Записать();
    КонецЦикла;
КонецЦикла;

Дорогой друг, я не проверял твой способ, но что-то мне кажется, что у тебя будет переименовка всех элементов справочников в "Наименование". А в моём же случае, мне надо, чтобы, если это, допустим справочник Сотрудники, то было "Сотрудник 1, Сотрудник 2 и тд."...
---
Ну так замени
```1c
    СпрОбъект.Наименование = "Наименование " + XMLСтрока(Счетчик);
```
 на
```1c
    СпрОбъект.Наименование = МД.Синоним + XMLСтрока(Счетчик);
```
---
СпрОбъект.Наименование = МД.Синоним + XMLСтрока(Счетчик);

А если мне нужно не синоним, а само наименование. Потому что допустим справочник Валюты. Мне нужно, чтобы было Валюта 1, а не Валюты 1. Можно так?
---
Можно так? Можно. Я не против. Если не нравится синоним - выбери любой свойство из метаданных, и используй именно его.
---
Это значит, что я должен обращаться к Представлению объекта?
То есть МД.Представление, до этого предварительно определив, что такое МД.Представление?
---
Ничего ты никому не должен. Ты волен обращаться к чему угодно.
Открой синтакс-помощник, пройди по "Общие объекты - Работа с объектами метаданных - Объекты метаданных - Объект метаданных: Справочник - Свойства" и решай, что тебе больше подходит. Вполне возможно, что это и ОсновноеПредставление.
---
Привет ещё раз. Я тут подумал ещё раз над всем, что Вы посоветовали сделать. Но тут есть один момент. Допустим, если в базе есть не только Наименование, но есть ещё Наименование 2 или Наименование на английском, тогда Ваша процедура не работает. Я в принципе только поэтому и создавал массив с реквизитами всеми, чтобы потом их обрабатывать. Вот, что в итоге у меня получилось:

```1c
    Процедура КомандаСмертиНаСервере()

    Для Каждого МетаданноеСправочника Из Метаданные.Справочники Цикл
    Имя = МетаданноеСправочника.Имя;
    х = 1;
    Выборка = Справочники[Имя].Выбрать();
    Пока Выборка.Следующий() Цикл
    Спровочник = Выборка.ПолучитьОбъект();
    Для Каждого Реквизит Из МетаданноеСправочника.Реквизиты Цикл
    Если Реквизит.Имя = "Наименование" Тогда
    Спровочник[Реквизит.Имя] = МетаданноеСправочника + " " + х;
    ИначеЕсли ТипЗнч(Спровочник[Реквизит.Имя]) = Тип("Строка") Тогда
    Спровочник[Реквизит.Имя] = Реквизит + " " + х;
    КонецЕсли;
    КонецЦикла;
    Спровочник.Записать();
    х = х + 1;
    КонецЦикла;

    КонецЦикла;

    КонецПроцедуры
```

Да, процедура щас не работает почему-то, думаю щас над этим. Но логически, я всё же думаю, что так будет лучше. Да, я в этот раз отказался от массива, но всё равно обращаюсь ко всем реквизитам, а не конкретно к Наименованию
---
Допустим, если в базе есть не только Наименование, но есть ещё Наименование 2 или Наименование на английском, тогда Ваша процедура не работает. Как и ваша. Тем более, что я не собирался за вас сделать всю работу. Я лишь показал более правильный скелет алгоритма работы с метаданными и ссылками.
Да, процедура щас не работает почему-то, думаю щас над этим. Удачи!
---
А кому в итоге зачтут практику и заплатят зарплату?
---
Ну человек хотя бы пытается что-то сделать самостоятельно. Добрался даже до коллекции метаданных.
---
ну то есть это = "на экзамене он даже взял ручку в руки".
Непонятно.
---
Я сегодня добрый зачем-то ))) Но, это ненадолго...
---
Если вдруг кому-то будет нужно, то вот решение данной задачи. Я внес пару изменений и вот, что получилось в итоге. И это работает. Я отказался от массива и решил менять наименования сразу же.

```1c
    Для Каждого МетаданноеСправочника Из Метаданные.Справочники Цикл
    Имя = МетаданноеСправочника.Имя;
    Счетчик = 1;
    Выборка = Справочники[Имя].Выбрать();
    Пока Выборка.Следующий() Цикл
    Спровочник = Выборка.ПолучитьОбъект();
    Для Каждого Реквизит Из МетаданноеСправочника.СтандартныеРеквизиты Цикл
    Если Реквизит.Имя = "Наименование" Тогда
    Спровочник[Реквизит.Имя] = МетаданноеСправочника.Имя + " " + Счетчик;
    КонецЕсли;
    КонецЦикла;

    Для Каждого Реквизит Из МетаданноеСправочника.Реквизиты Цикл
    Если ТипЗнч(Спровочник[Реквизит.Имя]) = Тип("Строка") И ЗначениеЗаполнено(Спровочник[Реквизит.Имя]) Тогда
    Спровочник[Реквизит.Имя] = Реквизит.Имя + " " + Счетчик;
    КонецЕсли;
    КонецЦикла;

    Для Каждого МетаданныеТабличнаяЧасть Из МетаданноеСправочника.ТабличныеЧасти Цикл
    Для Каждого СтрокаТабличнойЧасти Из Спровочник[МетаданныеТабличнаяЧасть.Имя] Цикл
    Если ТипЗнч(Спровочник[Реквизит.Имя]) = Тип("Строка") И ЗначениеЗаполнено(Спровочник[Реквизит.Имя]) Тогда
    Спровочник[Реквизит.Имя] = Реквизит.Имя + " " + Счетчик;
    КонецЕсли;
    КонецЦикла;
    КонецЦикла;
    Спровочник.ОбменДанными.Загрузка = Истина;
    Спровочник.Записать();
    Счетчик = Счетчик + 1;
    КонецЦикла;
    КонецЦикла;
```
---
А зачем цикл по стандартным реквизитам, если нужно только наименование?
---
Через цикл со стандартными реквизитами я меняю наименование, через условие если. Так как наименование как раз и хранится в стандартных реквизитах. А в цикле с обычными реквизитами, я ставлю условие Если = Тип("Строка"), так как в добавленных мною реквизитах наименования нет и там надо проверять по типу.