Зачастую работая в базе несколько лет, у контрагентов изначальные наименования приводятся к корректным, синхронизируясь с ЕГРЮЛ, или же у договора меняется имя на корректное. Или же вы объединяли дубли разных контрагентов, анализируя проводки документов, вам выводится именно ключ аналитики, это может сбивать вас с толку. Программистам / аналитикам или консультантам приходится видеть ключи аналитики со старыми наименованиями. Для этого есть такая маленькая обработка, обновляющая наименования ключей аналитики.
Это внешняя обработка, которая работает как регламентное задание, её можно прикрепить в справочник дополнительных отчётов и обработок, она будет работать как регламентное задание. Или же можно ее использовать просто через "Файл - Открыть" при необходимости.
Код обработки открытый, суть простая, сначала во всех справочниках выполняется поиск дублей с помощью типовых процедур, после корректируется наименование, используя стандартные принципы его формирования.
Обработка будет работать на ERP 2.4.ххх и ERP 2.5.7 - 2.5.8 гарантированно, имена процедур генерации имени оставлены оригинальные, так что даже при использовании поздней версии (когда ее выпустят) можно будет за пару минут модернизировать код.
Код:
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ПараметрыВыполненияКоманды) Экспорт
Справочники.КлючиАналитикиУчетаНаборов.ЗаменитьДублиКлючейАналитики();
Справочники.КлючиАналитикиУчетаНоменклатуры.ЗаменитьДублиКлючейАналитики();
Справочники.КлючиАналитикиУчетаПартий.ЗаменитьДублиКлючейАналитики();
Справочники.КлючиАналитикиУчетаПоПартнерам.ЗаменитьДублиКлючейАналитики();
// Вернуть нормальные имена АналитикаУчетаПоПартнерам
Запрос = Новый Запрос();
Запрос.Текст =
"ВЫБРАТЬ
| ДанныеСправочника.Ссылка КАК Ссылка,
| ДанныеСправочника.ПометкаУдаления КАК ПометкаУдаления,
| Аналитика.КлючАналитики КАК КлючАналитики,
| ДанныеРегистра.Партнер КАК Партнер,
| ДанныеРегистра.Организация КАК Организация,
| ДанныеРегистра.Контрагент КАК Контрагент,
| ДанныеРегистра.Договор КАК Договор,
| ДанныеРегистра.НаправлениеДеятельности КАК НаправлениеДеятельности
|ИЗ
| Справочник.КлючиАналитикиУчетаПоПартнерам КАК ДанныеСправочника
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АналитикаУчетаПоПартнерам КАК ДанныеРегистра
| ПО ДанныеСправочника.Ссылка = ДанныеРегистра.КлючАналитики
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.АналитикаУчетаПоПартнерам КАК Аналитика
| ПО ДанныеСправочника.Партнер = Аналитика.Партнер
| И ДанныеСправочника.Организация = Аналитика.Организация
| И ДанныеСправочника.Контрагент = Аналитика.Контрагент
| И ДанныеСправочника.Договор = Аналитика.Договор
| И ДанныеСправочника.НаправлениеДеятельности = Аналитика.НаправлениеДеятельности
|ГДЕ
| НЕ ДанныеРегистра.КлючАналитики ЕСТЬ NULL";
Результат = Запрос.Выполнить().Выбрать();
Пока Результат.Следующий() Цикл
СправочникОбъект = Результат.Ссылка.ПолучитьОбъект();
СправочникОбъект.Наименование = ПолучитьПолноеНаименованиеКлючаАналитики_АналитикаУчетаПоПартнерам(Результат);
Если СправочникОбъект.Наименование <> Результат.Ссылка.Наименование Тогда
Сообщить("АналитикаУчетаПоПартнерам --< " + Результат.Ссылка.Наименование);
Сообщить("АналитикаУчетаПоПартнерам --> " + СправочникОбъект.Наименование);
СправочникОбъект.Записать();
КонецЕсли;
КонецЦикла;
// АналитикаУчетаНоменклатуры
Запрос = Новый Запрос();
Запрос.Текст =
"ВЫБРАТЬ
| ДанныеСправочника.Ссылка КАК Ссылка,
| ДанныеСправочника.ПометкаУдаления КАК ПометкаУдаления,
| Аналитика.КлючАналитики КАК КлючАналитики,
| ДанныеРегистра.Номенклатура КАК Номенклатура,
| ДанныеРегистра.Характеристика КАК Характеристика,
| ДанныеРегистра.Серия КАК Серия,
| ДанныеРегистра.МестоХранения КАК МестоХранения,
| ДанныеРегистра.Назначение КАК Назначение,
| ДанныеРегистра.СтатьяКалькуляции КАК СтатьяКалькуляции
|ИЗ
| Справочник.КлючиАналитикиУчетаНоменклатуры КАК ДанныеСправочника
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АналитикаУчетаНоменклатуры КАК ДанныеРегистра
| ПО ДанныеСправочника.Ссылка = ДанныеРегистра.КлючАналитики
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.АналитикаУчетаНоменклатуры КАК Аналитика
| ПО ДанныеСправочника.Номенклатура = Аналитика.Номенклатура
| И ДанныеСправочника.Характеристика = Аналитика.Характеристика
| И ДанныеСправочника.Серия = Аналитика.Серия
| И ДанныеСправочника.МестоХранения = Аналитика.МестоХранения
| И ДанныеСправочника.Назначение = Аналитика.Назначение
| И ДанныеСправочника.СтатьяКалькуляции = Аналитика.СтатьяКалькуляции
|ГДЕ
| НЕ ДанныеРегистра.КлючАналитики ЕСТЬ NULL";
Результат = Запрос.Выполнить().Выбрать();
Пока Результат.Следующий() Цикл
СправочникОбъект = Результат.Ссылка.ПолучитьОбъект();
СправочникОбъект.Наименование = ПолучитьПолноеНаименованиеКлючаАналитики_АналитикаУчетаНоменклатуры(Результат);
Если СправочникОбъект.Наименование <> Результат.Ссылка.Наименование Тогда
Сообщить("АналитикаУчетаНоменклатуры --< " + Результат.Ссылка.Наименование);
Сообщить("АналитикаУчетаНоменклатуры --> " + СправочникОбъект.Наименование);
СправочникОбъект.Записать();
КонецЕсли;
КонецЦикла;
// АналитикаУчетаПартий
Запрос = Новый Запрос();
Запрос.Текст =
"ВЫБРАТЬ
| ДанныеСправочника.Ссылка КАК Ссылка,
| ДанныеСправочника.ПометкаУдаления КАК ПометкаУдаления,
| Аналитика.КлючАналитики КАК КлючАналитики,
| ДанныеРегистра.ГруппаФинансовогоУчета КАК ГруппаФинансовогоУчета,
| ДанныеРегистра.Поставщик КАК Поставщик,
| ДанныеРегистра.Контрагент КАК Контрагент,
| ДанныеРегистра.НалогообложениеНДС КАК НалогообложениеНДС,
| ДанныеРегистра.УдалитьСтавкаНДС КАК УдалитьСтавкаНДС,
| ДанныеРегистра.СтавкаНДС КАК СтавкаНДС,
| ДанныеРегистра.ВидЦенности КАК ВидЦенности,
| ДанныеРегистра.КодСтроки КАК КодСтроки
|ИЗ
| Справочник.КлючиАналитикиУчетаПартий КАК ДанныеСправочника
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АналитикаУчетаПартий КАК ДанныеРегистра
| ПО ДанныеСправочника.Ссылка = ДанныеРегистра.КлючАналитики
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.АналитикаУчетаПартий КАК Аналитика
| ПО ДанныеСправочника.ГруппаФинансовогоУчета = Аналитика.ГруппаФинансовогоУчета
| И ДанныеСправочника.Поставщик = Аналитика.Поставщик
| И ДанныеСправочника.Контрагент = Аналитика.Контрагент
| И ДанныеСправочника.НалогообложениеНДС = Аналитика.НалогообложениеНДС
| И ДанныеСправочника.СтавкаНДС = Аналитика.СтавкаНДС
| И ДанныеСправочника.ВидЦенности = Аналитика.ВидЦенности
| И ДанныеСправочника.КодСтроки = Аналитика.КодСтроки
|ГДЕ
| НЕ ДанныеРегистра.КлючАналитики ЕСТЬ NULL";
Результат = Запрос.Выполнить().Выбрать();
Пока Результат.Следующий() Цикл
СправочникОбъект = Результат.Ссылка.ПолучитьОбъект();
СправочникОбъект.Наименование = НаименованиеКлючаАналитики_АналитикаУчетаПартий(Результат);
Если СправочникОбъект.Наименование <> Результат.Ссылка.Наименование Тогда
Сообщить("АналитикаУчетаПартий --< " + Результат.Ссылка.Наименование);
Сообщить("АналитикаУчетаПартий --> " + СправочникОбъект.Наименование);
СправочникОбъект.Записать();
КонецЕсли;
КонецЦикла;
// АналитикаУчетаНаборов
Запрос = Новый Запрос();
Запрос.Текст =
"ВЫБРАТЬ
| ДанныеСправочника.Ссылка КАК Ссылка,
| ДанныеСправочника.ПометкаУдаления КАК ПометкаУдаления,
| Аналитика.КлючАналитики КАК КлючАналитики,
| ДанныеРегистра.НоменклатураНабора КАК НоменклатураНабора,
| ДанныеРегистра.ХарактеристикаНабора КАК ХарактеристикаНабора
|ИЗ
| Справочник.КлючиАналитикиУчетаНаборов КАК ДанныеСправочника
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АналитикаУчетаНаборов КАК ДанныеРегистра
| ПО ДанныеСправочника.Ссылка = ДанныеРегистра.КлючАналитики
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.АналитикаУчетаНаборов КАК Аналитика
| ПО ДанныеСправочника.НоменклатураНабора = Аналитика.НоменклатураНабора
| И ДанныеСправочника.ХарактеристикаНабора = Аналитика.ХарактеристикаНабора
|ГДЕ
| НЕ ДанныеРегистра.КлючАналитики ЕСТЬ NULL";
Результат = Запрос.Выполнить().Выбрать();
Пока Результат.Следующий() Цикл
СправочникОбъект = Результат.Ссылка.ПолучитьОбъект();
СправочникОбъект.Наименование = ПолучитьПолноеНаименованиеКлючаАналитики_АналитикаУчетаНаборов(Результат);
Если СправочникОбъект.Наименование <> Результат.Ссылка.Наименование Тогда
Сообщить("АналитикаУчетаНаборов --< " + Результат.Ссылка.Наименование);
Сообщить("АналитикаУчетаНаборов --> " + СправочникОбъект.Наименование);
СправочникОбъект.Записать();
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Функция ПолучитьПолноеНаименованиеКлючаАналитики_АналитикаУчетаПоПартнерам(МенеджерЗаписи)
Наименование = "";
МетаданныеИзмерения = Метаданные.РегистрыСведений.АналитикаУчетаПоПартнерам.Измерения;
Для Каждого Измерение Из МетаданныеИзмерения Цикл
// Получим представление значения, которое указано в измерении регистра сведений.
ТекстЗначения = Строка(МенеджерЗаписи[Измерение.Имя]);
Если Не ПустаяСтрока(ТекстЗначения) Тогда
Наименование = Наименование + ТекстЗначения + "; ";
КонецЕсли;
КонецЦикла;
Если Прав(Наименование, 2) = "; " Тогда
Наименование = Лев(Наименование, СтрДлина(Наименование) - 2);
КонецЕсли;
Возврат Наименование;
КонецФункции
Функция ПолучитьПолноеНаименованиеКлючаАналитики_АналитикаУчетаНоменклатуры(МенеджерЗаписи)
Возврат СокрЛП(МенеджерЗаписи.Номенклатура) + "; "
+ ?(ЗначениеЗаполнено(МенеджерЗаписи.Характеристика), СокрЛП(МенеджерЗаписи.Характеристика) + "; ", "")
+ ?(ЗначениеЗаполнено(МенеджерЗаписи.Серия), СокрЛП(МенеджерЗаписи.Серия) + "; ", "")
+ ?(ЗначениеЗаполнено(МенеджерЗаписи.Назначение), СокрЛП(МенеджерЗаписи.Назначение) + "; ", "")
+ ?(ЗначениеЗаполнено(МенеджерЗаписи.СтатьяКалькуляции), СокрЛП(МенеджерЗаписи.СтатьяКалькуляции) + "; ", "")
+ СокрЛП(МенеджерЗаписи.МестоХранения);
КонецФункции
Функция НаименованиеКлючаАналитики_АналитикаУчетаПартий(СтруктураРеквизитовКлюча)
Наименование = "";
Если ЗначениеЗаполнено(СтруктураРеквизитовКлюча.ГруппаФинансовогоУчета) Тогда
Наименование = Наименование + НСтр("ru = 'Группа';
|en = 'Group'") + ": " + СтруктураРеквизитовКлюча.ГруппаФинансовогоУчета + "; ";
КонецЕсли;
Если ЗначениеЗаполнено(СтруктураРеквизитовКлюча.Поставщик) Тогда
Наименование = Наименование + НСтр("ru = 'Поставщик';
|en = 'Vendor'") + ": " + СтруктураРеквизитовКлюча.Поставщик + "; ";
КонецЕсли;
Если ЗначениеЗаполнено(СтруктураРеквизитовКлюча.Контрагент) Тогда
Наименование = Наименование + НСтр("ru = 'Контрагент';
|en = 'Counterparty'") + ": " + СтруктураРеквизитовКлюча.Контрагент + "; ";
КонецЕсли;
Если ЗначениеЗаполнено(СтруктураРеквизитовКлюча.НалогообложениеНДС) Тогда
Наименование = Наименование + НСтр("ru = 'Налогообложение НДС';
|en = 'VAT taxation'") + ": " + СтруктураРеквизитовКлюча.НалогообложениеНДС + "; ";
КонецЕсли;
Если ЗначениеЗаполнено(СтруктураРеквизитовКлюча.СтавкаНДС) Тогда
Наименование = Наименование + НСтр("ru = 'Ставка НДС';
|en = 'VAT rate'") + ": " + СтруктураРеквизитовКлюча.СтавкаНДС + "; ";
КонецЕсли;
Если ЗначениеЗаполнено(СтруктураРеквизитовКлюча.ВидЦенности) Тогда
Наименование = Наименование + НСтр("ru = 'Вид ценности';
|en = 'Asset tax class'") + ": " + СтруктураРеквизитовКлюча.ВидЦенности + "; ";
КонецЕсли;
Если ЗначениеЗаполнено(СтруктураРеквизитовКлюча.КодСтроки) Тогда
Наименование = Наименование + НСтр("ru = 'Код строки (продукция)';
|en = 'Line code (manufactured products)'") + ": " + СтруктураРеквизитовКлюча.КодСтроки;
КонецЕсли;
Наименование = СокрЛП(Наименование);
Если Прав(Наименование, 1) = ";" Тогда
Наименование = СокрЛП(Сред(Наименование, 1, СтрДлина(Наименование) - 1));
КонецЕсли;
Если НЕ ЗначениеЗаполнено(Наименование) Тогда
Наименование = "<>";
КонецЕсли;
Возврат Наименование;
КонецФункции
Функция ПолучитьПолноеНаименованиеКлючаАналитики_АналитикаУчетаНаборов(МенеджерЗаписи)
Возврат СокрЛП(МенеджерЗаписи.НоменклатураНабора) + "; "
+ ?(ЗначениеЗаполнено(МенеджерЗаписи.ХарактеристикаНабора), СокрЛП(МенеджерЗаписи.ХарактеристикаНабора), "");
КонецФункции
Чтобы было понимание, насколько это актуально, вот, например, из демоверсии ERP 2.5.8 часть результата выполнения обработки, видно, что было и что стало.
Изначально, разумеется, рекомендуется посмотреть на результат на тестовой базе. Но обработка работает по типовым принципам, и шанс сбоя ничтожен.