Задача:
Изменить валюту ведения учёта в работающей базе "Управление небольшой фирмой, редакция 1.4 (1.4.9.43)".
Размышления:
Чтобы изменить валюту штатным образом, нужно распровести все документы, поменять значение константы ВалютаУчета и провести документы заново. И это самый правильный путь! В теории. На практике же, во-первых, нужно распроводить/проводить в обратном/прямом хронологическом порядке (а штатного механизма для этого я не нашёл), а во-вторых, даже при распроведении в обратном хронологическом порядке есть очень большая вероятность нарваться на ошибки вида "не хватает остатка на складе" или "нет возможности зафиксировать взаиморасчеты с контрагентом". Ну и конечно же дополнительным "осложнением" может стать отслеживание, чтобы случайно не перемешать в базе документы трёх групп: проведённые, непроведённые и помеченные на удаление.
В общем, решил пойти "другим путём" (с).
Посмотрел, какие проверки выполняются программой при попытке изменить константу ВалютаУчета: в общей форме ФормаНастройкиДеньги есть Функция ОтказИзменитьВалютаУчета(), в которой идёт проверка наличия движений по жёстко прошитому списку "суммовых" регистров. Значит, если очистить эти движения, то можно будет поменять константу (документы при этом останутся как бы "проведёнными", но без движений). А после этого можно выполнить групповое перепроведение с помощью штатной обработки, чтобы восстановить движения документов.
Решение:
ВНИМАНИЕ: Использование описанной ниже методики потенциально может нарушить работоспособность вашей базы! Если Вы решите воспользоваться данной методикой (на свой страх и риск!). то не забудьте, по крайней мере, сделать резервную копию базы данных!
Написал соответствующую обработку. В ней три кнопки: "Удалить" (удаляет движения документов), "Открыть форму настройки" (открывает форму настроек раздела "Деньги", в которой нужно изменить валюту ведения учёта) и "Открыть форму перепроведения" (открывает штатную форму обработки "Групповое перепроведение документов", в которой нужно выполнить перепроведение всех-всех-всех документов за все-все-все годы). Нажимать кнопки нужно в этой же последовательности.
Код модуля формы (GPLv3 или выше):
&НаСервере
Процедура УдалитьНаСервере()
СписокРегистров = Новый СписокЗначений;
СписокРегистров.Добавить("ВнеоборотныеАктивы");
СписокРегистров.Добавить("ДенежныеСредства");
СписокРегистров.Добавить("ДоходыИРасходы");
СписокРегистров.Добавить("ДоходыИРасходыКассовыйМетод");
СписокРегистров.Добавить("ДоходыИРасходыНераспределенные");
СписокРегистров.Добавить("ДоходыИРасходыОтложенные");
СписокРегистров.Добавить("Закупки");
СписокРегистров.Добавить("ЗапасыПереданные");
СписокРегистров.Добавить("ЗапасыПринятые");
СписокРегистров.Добавить("НачисленияИУдержания");
СписокРегистров.Добавить("ПланыПродаж");
СписокРегистров.Добавить("ПлатежныйКалендарь");
СписокРегистров.Добавить("Продажи");
СписокРегистров.Добавить("РасчетыПоНалогам");
СписокРегистров.Добавить("РасчетыСПерсоналом");
СписокРегистров.Добавить("РасчетыСПодотчетниками");
СписокРегистров.Добавить("РасчетыСПокупателями");
СписокРегистров.Добавить("РасчетыСПоставщиками");
СписокРегистров.Добавить("ФинансовыйРезультат");
СписокРегистров.Добавить("Запасы");
Для каждого ЭлемСЗ Из СписокРегистров Цикл
ЭлемСЗ.Представление = "РегистрНакопления";
КонецЦикла;
СписокРегистров.Добавить("Управленческий", "РегистрБухгалтерии");
НачатьТранзакцию();
Для каждого ЭлемСЗ Из СписокРегистров Цикл
ИмяРег = ЭлемСЗ.Значение;
ТипРег = ЭлемСЗ.Представление;
Если ТипРег = "РегистрНакопления" Тогда
ТекРегистр = РегистрыНакопления[ИмяРег];
ИначеЕсли ТипРег = "РегистрБухгалтерии" Тогда
ТекРегистр = РегистрыБухгалтерии[ИмяРег];
Иначе
Сообщить("Неподдерживаемый тип регистра: " + ТипРег);
Продолжить;
КонецЕсли;
НаборЗаписей = ТекРегистр.СоздатьНаборЗаписей();
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| Регистратор
|ИЗ
| " + ТипРег + "." + ИмяРег;
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
НаборЗаписей.Отбор.Регистратор.Установить(Выборка.Регистратор);
НаборЗаписей.Очистить();
НаборЗаписей.Записать(Истина);
КонецЦикла;
КонецЦикла;
ЗафиксироватьТранзакцию();
КонецПроцедуры
&НаКлиенте
Процедура Удалить(Команда)
УдалитьНаСервере();
СообщениеПользователю = Новый СообщениеПользователю;
СообщениеПользователю.Текст = "Движения удалены!";
СообщениеПользователю.Сообщить();
КонецПроцедуры
&НаКлиенте
Процедура ОткрытьФормуНастройки(Команда)
ОткрытьФорму("Обработка.ПанельАдминистрированияУНФ.Форма.РазделДеньги");
КонецПроцедуры
&НаКлиенте
Процедура ОткрытьФормуПерепроведения(Команда)
ОткрытьФорму("Обработка.ГрупповоеПерепроведениеДокументов.Форма");
КонецПроцедуры
Для ленивых прикрепил обработку.