Возникла необходимость создать в 1С новые регистры. Все бы ничего, но пользователи (читай руководство) потребовали привязать движения к документам закрытого периода и при этом главным условием было - не перепроводить документы.
Как это я сделал? Да легко! ;)
Во первых добавил нужный регистр и внес изменения в модули документов для выполнения движений по новому регистру.
Создал копию рабочей базы 1С на другом сервере (copybase).
Далее в файле 1Cv7.DDS нашел какие таблицы соответствуют новым регистрам.
Одна таблица хранит остатки (RG63673), вторая - движения регистра (RA63673).
Далее в копии провел документы закрытого периода (а как же иначе получить движение?) и выгрузил движения в файл. Для этого воспользовался утилитой MS SQL bcp.exe
bcp "select * from copybase..RG63673 queryout c:\RG63673.txt -c -CRAW -SserverSQL -Usa -Ppassword
bcp "select * from copybase..RA63673 queryout c:\RA63673.txt -c -CRAW -SserverSQL -Usa -Ppassword
Если в рабочей базе захотите оставить движения текущих документов (т.е. в рабочей базе уже текущим месяцем проводят документы и делают движения), то нужно выгружать не все движение. Для этого нужно добавить условия.
Например движения и остатки за февраль 2010 года.
bcp "select * from copybase..RG63673 where (copybase..RG63673.PERIOD='2010-02-01') OR (copybase..RG63673.PERIOD='2010-03-01')" queryout c:\RG63673.txt -c -CRAW -SserverSQL -Usa -Ppassword
В регистре движения все не так просто, если нужно удалить движение за период. В таблице нет данных о периоде, но есть ссылка на документ.По этому дату движения вытащил из документа (таблица _1sjourn)
bcp "select * from copybase..RA63673 where (copybase..RA63673.iddoc IN (select IDDOC FROM copybase.._1sjourn where (left(copybase.._1sjourn.DATE_TIME_IDDOC,8)<='20100228') AND (left(copybase.._1sjourn.DATE_TIME_IDDOC,8)>='20100201')))" queryout c:\RA63673.txt -c -CRAW -SserverSQL -Usa -Ppassword
Удалил существующие остатки перед загрузкой в рабочей базе (если за период, то и удалять нужно не все движения). Запустил Query Analyzer и выплнил удаление остатков:
use workbase
delete from RG63673
если только остатки февраль и март 2010 года:
delete from RG63673 where (workbase..PERIOD='2010-02-01') OR (workbase..PERIOD='2010-03-01')
Тоже самое по регистру движений:
delete from RA63673
если только движение за февраль 2010:
delete from RA63673 where (RA63673.iddoc IN (select IDDOC FROM _1sjourn where (left(_1sjourn.DATE_TIME_IDDOC,8)<='20100228') AND (left(_1sjourn.DATE_TIME_IDDOC,8)>='20100201')))
Далее загрузил выгруженные ранее движения и остатки по этому регистру.
bulk insert RA63673 from '\\MyComp\c$\RA63673.txt' with (codepage='RAW')
bulk insert RG63673 from '\\MyComp\c$\RG63673.txt' with (codepage='RAW')
В журнале документов установил признак движения по регистру! Иначе движение кагбэ есть, но в то же время кагбэ и нет... :)
update _1sjourn set RF63673='1' where iddoc in (select iddoc from RA63673)
Ну и самое последнее - вечером запустил "Тестирование и исправление" для выравнивания остатков по регистру с учетом новых движений.