1С. Перенос движений регистров в SQL версии.

Mar 27, 2010 12:01

Возникла необходимость создать в 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)

Ну и самое последнее - вечером запустил "Тестирование и исправление" для выравнивания остатков по регистру с учетом новых движений.

sql,

Previous post Next post
Up