Загрузка остатков из 1С6

Часто при организации обмена данными с 1С6 требуется наладить перенос проводок из 1С6 за период.
Но тут же возникает вопрос и о переносе начальных остатков.
Так вот, если разработан механизм загрузки движений из 1с6 из файла проводок 1
sboper
.dbf, то можно просто сэмулировать файл 1sboper.dbf, но в нем оставить только проводки с нулевым счетом и загрузить этот файл на дату загрузки остатков.
Таким образом не придется делать дополнительный механизм. Единственное - нужно свернуть остатки в 1
sboper
.dbf. Как это сделать - эта статья.

Для получения остатков нам нужно прочитать все движения исходного файла 1sboper.dbf, а потом просто свернуть их по счету и субконто.
Единственно, что счет в 1С6 содержит еще штамп даты, который нужно удалить.
Проводки формируем в корреспонденции со счетом 00.
Каталог - это каталог, где хранится исходный файл: 1
sboper.dbf
КаталогЗагр - это каталог, куда помещается файл результата с остатками: 1
sboper.dbf

6 ноября 2008 года я проверил этот код, все сворачивается идеально и совпадает с обороткой в 1С6. Рекомендую.

Меня спрашивали - почему я не сконвертировал данные в 1С7, а оттуда в 1С8 или выгрузить из 1С7.
Дело в том, что баз 1С6 много (50 штук), проще считать данные из
DBF, т.к. квалификации операторов не хватит конвертировать базы из 1С6 в 1С7.
Кроме того, у нас нет лицензий на 1С7, да и 1С7 я уже три года не занимался, неохота вспоминать.

Смотрим код:

        БД_dbf = Новый XBase;
        БД_dbf.Кодировка = КодировкаXBase.OEM;
        БД_dbf.ОткрытьФайл(Каталог+"\1SBOPER.dbf");
        
        флОтладка = ложь;      
        
        ТЗ = Новый ТаблицаЗначений;
        ТЗ.Колонки.Добавить("Schet");
        ТЗ.Колонки.Добавить("Subkonto");
        ТЗ.Колонки.Добавить("OPERVAL");
        ТЗ.Колонки.Добавить("OPERSUM");       
        ТЗ.Колонки.Добавить("OPERSUMV");      
        ТЗ.Колонки.Добавить("OPERKOL");          
        ТЗ.Индексы.Добавить("Schet,Subkonto");
        
        Счетчик = 0;
        флБДПервая = истина;
        Пока НЕ БД_dbf.ВКонце() И (флБДПервая ИЛИ БД_dbf.Следующая())  Цикл 
               флБДПервая = ложь;             
               ОбработкаПрерыванияПользователя();
               
               Счетчик = Счетчик + 1;
               
               Если Счетчик % 100 = 0 Тогда
                       Состояние("Загрузка для свертки остатков " + Счетчик);
               КонецЕсли;
               
               Если Дата(БД_dbf.OPERDATA) > КонецДня(ДатаОстатков) Тогда
                       Продолжить;
               КонецЕсли;
               
               Если СтрЧислоВхождений(Строка(БД_dbf.OPERNO), "D") > 0 Тогда
                       Продолжить;
               КонецЕсли;                                                    
               
               //  Загрузка дебета            
               НоваяСтрокаТЗ                  = ТЗ.Добавить();                      
               НоваяСтрокаТЗ.Schet    = СокрЛП(БД_dbf.OPERIND1);          
               //Убиваем лишние 8 символов в коде счета
               НоваяСтрокаТЗ.Schet    = Лев(НоваяСтрокаТЗ.Schet, СтрДлина(НоваяСтрокаТЗ.Schet)-8);          
               НоваяСтрокаТЗ.Subkonto         = БД_dbf.SPSKNO1;    
               НоваяСтрокаТЗ.OPERVAL  = БД_dbf.OPERVAL;           
               НоваяСтрокаТЗ.OPERSUM  = БД_dbf.OPERSUM;           
               НоваяСтрокаТЗ.OPERSUMV = БД_dbf.OPERSUMV;          
               НоваяСтрокаТЗ.OPERKOL  = БД_dbf.OPERKOL;              
               
               //  Загрузка кредита   
               НоваяСтрокаТЗ                  = ТЗ.Добавить();
               НоваяСтрокаТЗ.Schet    = СокрЛП(БД_dbf.OPERIND2);
               НоваяСтрокаТЗ.Schet    = Лев(НоваяСтрокаТЗ.Schet, СтрДлина(НоваяСтрокаТЗ.Schet)-8);          
               НоваяСтрокаТЗ.Subkonto         = БД_dbf.SPSKNO2;
               НоваяСтрокаТЗ.OPERVAL  = БД_dbf.OPERVAL;
               НоваяСтрокаТЗ.OPERSUM  = -БД_dbf.OPERSUM;
               НоваяСтрокаТЗ.OPERSUMV = -БД_dbf.OPERSUMV;
               НоваяСтрокаТЗ.OPERKOL  = -БД_dbf.OPERKOL;
               
        КонецЦикла; 
        
        БД_dbf.ЗакрытьФайл();
        ТЗ.Свернуть("Schet,Subkonto,OPERVAL","OPERSUM,OPERSUMV,OPERKOL");
        // Создание нового файла dbf   
        БД_dbf.Поля.Добавить("OPERSOD", "S", 50);
        БД_dbf.Поля.Добавить("SPSKNO1", "S", 20);
        БД_dbf.Поля.Добавить("SPSKNO2", "S", 20);
        БД_dbf.Поля.Добавить("OPERSUM", "N",  14, 2);
        БД_dbf.Поля.Добавить("OPERSUMV","N",  14, 2);
        БД_dbf.Поля.Добавить("OPERKOL", "N",  14, 3);
        БД_dbf.Поля.Добавить("OPERVAL", "S",  3);
        БД_dbf.Поля.Добавить("OPERDATA","D",   ); 
        БД_dbf.Поля.Добавить("OPERWPNO","S",  2); 
        БД_dbf.Поля.Добавить("OPERFL",  "S",  1); 
        БД_dbf.Поля.Добавить("OPERV",   "S",  2);  
        БД_dbf.Поля.Добавить("OPERNO",  "S", 12); 
        БД_dbf.Поля.Добавить("OPERS",   "S",  1); 
        БД_dbf.Поля.Добавить("OPERSP",  "S",  5);
        БД_dbf.Поля.Добавить("OPERIND1","S", 15);
        БД_dbf.Поля.Добавить("OPERIND2","S", 15);  
        БД_dbf.Поля.Добавить("OPERID",  "S", 12);
        БД_dbf.Поля.Добавить("OPERN",   "S",  5);
        
        БД_dbf.Кодировка = КодировкаXBase.OEM;
        
        БД_dbf.СоздатьФайл(КаталогЗагр + "\1SBOPER.dbf",);    
        БД_dbf.АвтоСохранение = Истина; 
        
        
        
        
        Сч = 0;
        
        Для  Каждого СтрокаТЗ Из ТЗ Цикл 
               //Пропускаем мусор...
               Если СтрокаТЗ.OPERSUM = 0 И  СтрокаТЗ.OPERSUMV = 0 И СтрокаТЗ.OPERKOL = 0 Тогда
                       Продолжить;
               КонецЕсли;
               
               //Выделяем счет
               ТекСчет = СокрЛП(СтрокаТЗ.Schet);
               Поз = Найти(ТекСчет, ".");
               Если  Поз <> 0 Тогда
                       ТекСчет = СокрЛП(Лев(ТекСчет, Поз - 1));
               КонецЕсли;
               //Пропускаем ненужные счета остатков ...
               Если не флОтладка И Найти(ПереченьПропускаемыхСчетов, СокрЛП(ТекСчет)+";") <> 0 Тогда
                       Продолжить;
               КонецЕсли;
               
               Если флОтладка Тогда
                       Если ТекСчет<>"20" ИЛИ Найти(СтрокаТЗ.Subkonto, "1006") = 0 ИЛИ Найти(СтрокаТЗ.Subkonto, "2") = 0 Тогда
                               Продолжить;
                       КонецЕсли;
               КонецЕсли;
               
               Сч = Сч + 1;
               
               Если Сч % 10 =0  Тогда
                       Состояние("Свертка остатков, формирование DBF: " + Сч);
                       ОбработкаПрерыванияПользователя();
               КонецЕсли;
               
               БД_dbf.Добавить();    
               БД_dbf.OPERSOD = "Остатки получены обработкой от "+ Формат(ТекущаяДата(), "ДФ=dd.MM.yyyy");
               Если СтрокаТЗ.OPERSUM >= 0 Тогда
                       БД_dbf.OPERIND1 = СтрокаТЗ.Schet; 
                       БД_dbf.SPSKNO1  = СтрокаТЗ.Subkonto; 
                       БД_dbf.OPERIND2 = "00"; 
                       БД_dbf.SPSKNO2  = ""; 
                       Знак = 1;
               Иначе
                       БД_dbf.OPERIND1 = "00"; 
                       БД_dbf.SPSKNO1  = ""; 
                       БД_dbf.OPERIND2 = СтрокаТЗ.Schet; 
                       БД_dbf.SPSKNO2  = СтрокаТЗ.Subkonto; 
                       Знак = -1;
               КонецЕсли;
               
               БД_dbf.OPERVAL  = СтрокаТЗ.OPERVAL; 
               БД_dbf.OPERDATA = КонецДня(ДатаОстатков); 
               
               
               БД_dbf.OPERSUM  = Знак * СтрокаТЗ.OPERSUM; 
               БД_dbf.OPERSUMV = Знак * СтрокаТЗ.OPERSUMV; 
               БД_dbf.OPERKOL  = Знак * СтрокаТЗ.OPERKOL; 
               
               //Для невалютных счетов просто ставим доллары
               Если Найти(ПереченьВалютныхСчетов, СокрЛП(ТекСчет)+";") = 0 Тогда
                       БД_dbf.OPERSUMV = Знак*СтрокаТЗ.OPERSUM;  //Сумма в валюте равна сумме учетной
                       БД_dbf.OPERVAL = 1;  //Доллары
               КонецЕсли;
               
        КонецЦикла; 
        
        БД_dbf.ЗакрытьФайл(); 

ПереченьПропускаемыхСчетов - строка с кодами пропускаемых счетов, коды разделяются ";", заканчивается на ";"
ПереченьВалютныхСчетов - строка с кодами валютных счетов, коды разделяются ";", заканчивается на ";"