LADA-IT.RU

В мире информационных технологий

  • Увеличить размер шрифта
  • Размер шрифта по умолчанию
  • Уменьшить размер шрифта
Home Статьи 1с Перенос данных с использованием технологии OLE.

Перенос данных с использованием технологии OLE.

Печать

 

Не за горами новый год, а это значит, что во многих фирмах планируется перевод автоматизированного учета либо на новый качественный уровень, либо просто в новую чистую базу данных. Как правило, переносятся только справочники и остатки по счетам и регистрам. Существует много способов подобного переноса данных, и каждый выбирает тот, который ему пришелся по нраву, но сейчас я хочу рассказать о применимости технологии OLE к данной проблеме.

Сразу хочу сказать, что полный программный код всех обработок печатать бессмысленно из-за достаточно большого объема. На примере одной обработки я покажу основные принципы работы, и расскажу свой ход мысли. Готовые обработки можно найти на сайте журнала (www.samag.ru) в разделе «Исходный код».

Рассмотрим типовой случай перехода с платформы «1Средприятие» версии 7.7 на версию 8.1 с нового года.

Задача: перенести справочники «Контрагенты» и «Договора», а также остатки взаиморасчетов по счету 60 из «старой» базы в «новую». До перехода предприятие работало с конфигурацией «Производство+Услуги+Бухгалтерия» (платформа 7.7), после перехода собирается работать с конфигурацией «Управление производственным предприятием» (платформа 8.1).

Разделим задачу на две. Первая – перенос справочников, вторая – перенос остатков по счетам.

При переносе справочников создадим дополнительную структуру (регистр сведений), который будет использоваться для поиска и точной идентификации перенесенных объектов в базе данных. Назовем этот регистр СтруктураПерегрузки, первое измерение будет «ИД» (строка, длина 150), второе «Орг» (для случая многофирменного учета), ресурс «Элемент» составного типа данных, включающий в себя все справочники, которые мы собираемся заполнять переносом данных.

 

При загрузке справочников, кроме записи самих элементов, будет заполняться и этот регистр сведений, примерно следующим образом:

 

Спр8 = Справочникионтрагенты.СоздатьЭлемент();

Спр8.Наименование = Спр77.Наименование;

Спр8.Записать();

Рег = РегистрыСведенийтруктураПерегрузки.СоздатьМенеджерЗаписи();

Регд = Семерка.ЗначениеВСтрокуВнутр(Спр77.текущийэлемент());

Регрг = Орг.Ссылка;

Реглемент = Спр8.Ссылка;

Регаписать();

 

Будем считать этап загрузки справочников подготовительным, перейдем к более подробному рассмотрению переноса данных о задолженности контрагентов.

Создадим внешнюю обработку, разместим на форме переключатель для выбора субсчета 60-го счета, а также дату итогов и дату создаваемой операции (рис.1).

 

 

Рисунок 1. Форма обработки загрузки данных в взаиморасчетах.

 

В процедуре КнопкаСформироватьНажатие разместим весь необходимый текст программы.

Сначала подключимся через OLE к той базе данных, из которой будем брать данные.

 

КаталогПрограммы77 = "C:\Program Files\1Cv77\BIN\";

КаталогБазы77 = "C:\1c_base\ПУБ\";

СтрокаПодключения = """" + КаталогПрограммы77 + """" + "enterprise /d""" + КаталогБазы77           +          """" + " /nЮзер /p123";

Семерка = Новый COMОбъект("V77S.Application");

Если Семерка.Initialize(Семерка.RMTrade,СтрокаПодключения,"NO_SPLASH_SHOW") Тогда

Сообщить("Открыта база 7.7");

Соединение=Истина;

КонецЕсли;

 

Каталоги программы и базы данных можно прописать в самом модуле, а можно и сделать интерактивный выбор на форме. Строка подключения собирается из каталога запуска программы, режима запуска, каталога базы данных, имени пользователя и пароля. В данном случае имя пользователя «Юзер», пароль «123».

Далее производим подключение, причем с параметром «NO_SPLASH_SHOW», это означает, что запуск базы будет происходить без демонстрации заставки, т.е. практически незаметно для пользователя.

 

ИНН = Лев(Семеркаонстанта.ИННОрганизации,10);

Орг = Справочникирганизации.НайтиПоРеквизиту("ИНН",ИНН);

Опер = ДокументыперацияБух.СоздатьДокумент();

Оперрганизация = Орг.Ссылка;

Операта = ДатаОперации;

 

Определяем по ИНН организацию, по которой хотим выполнить загрузку и создаем новый документ «Операция».

 

БИ77 = Семерка.CreateObject("БухгалтерскиеИтоги");    

ОлеВидСубконто1=Семерка.EvalExpr("ВидыСубконтоонтрагенты");

ОлеВидСубконто2=Семерка.EvalExpr("ВидыСубконтооговоры");

 

 

Замечу, что создание объектов в подключаемой по OLE базе происходит с помощью англоязычного синонима «CreateObject», а не «СоздатьОбъект». Метод «EvalExpr» также часто используется при работе с технологией OLE, означает вычисление выражения системы.

 

Если Счет60=1 Тогда

Счет = ПланыСчетовозрасчетный.РасчетыСПоставщиками;

СчетСтр = "60.1";

ИначеЕсли Счет60=2 Тогда

Счет = ПланыСчетовозрасчетный.РасчетыПоАвансамВыданным;

СчетСтр = "60.2";

ИначеЕсли Счет60=3 Тогда

Счет = ПланыСчетовозрасчетный.РасчетыСПоставщикамиВал;

СчетСтр = "60.11";

ИначеЕсли Счет60=4 Тогда

Счет = ПланыСчетовозрасчетный.РасчетыПоАвансамВыданнымВал;

СчетСтр = "60.22";

КонецЕсли;

 

Здесь всё достаточно ясно, происходит определение счета взаиморасчетов в зависимости от установленного переключателя на форме.

 

БИ77.ИспользоватьСубконто("Контрагенты");

БИ77.ИспользоватьСубконто("Договоры");

БИ77.ВыполнитьЗапрос(ДатаИтогов,ДатаИтогов,СчетСтр);

БИ77.ВыбратьСубконто(1);

 

В подключенной базе выполняем запрос по бухгалтерским итогам на дату, выбранную на форме обработки.

 

Пока БИ77.ПолучитьСубконто(1)=1 цикл

БИ77.ВыбратьСубконто(2);

ИД = СемерканачениеВСтрокуВнутр(БИ77.Субконто(1));

Рег = РегистрыСведенийтруктураПерегрузки;

ОтборПоИД = Новый Структура("ИД,Орг");

ОтборПоИДД = ИД;

ОтборПоИДрг = Орг.Ссылка;

ВыборкаИД = реголучить(ОтборПоИД);

Суб1 = ВыборкаИДлемент.Ссылка;

 

Начинаем цикл по первому субконто (Контрагенты). Из регистра сведений получаем ссылку на нужный элемент справочника. Вот тут и начинает работать созданный нами механизм. Идентификация происходит не по коду, не по наименованию, не по какому-либо другому реквизиту, а по уникальному внутреннему идентификатору объекта.

 

Пока БИ77.ПолучитьСубконто(2)=1 цикл

ДебетовоеСальдо = БИ77.скд(1);

КредитовоеСальдо = БИ77.скк(1);

Если ДебетовоеСальдо<>0 Тогда

            ИД = СемерканачениеВСтрокуВнутр(БИ77.Субконто(2));

            Рег = РегистрыСведенийтруктураПерегрузки;

            ОтборПоИД = Новый Структура("ИД, Орг");

            ОтборПоИДД = ИД;

            ОтборПоИДрг = Орг.Ссылка;

            ВыборкаИД = реголучить(ОтборПоИД);

            Элемент8 = ВыборкаИДлемент.Ссылка;                                 

            Движ = Опервижения.Хозрасчетный.Добавить();

            ДвижчетДт = Счет.Ссылка;

            ДвижубконтоДт.Вставить(ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Контрагенты,Элемент8.Владелец);

            ДвижубконтоДт.Вставить(ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Договоры,Элемент8);

            ДвижчетКт = ПланыСчетов.Хозрасчетный.Вспомогательный;

            Движумма = ДебетовоеСальдо;

            Движктивность=Истина;

            Движериод = ДатаОперации;

            Опервижения.Хозрасчетный.Записать();

ИначеЕсли КредитовоеСальдо<>0 тогда

            ИД = СемерканачениеВСтрокуВнутр(БИ77.Субконто(2));

            Рег = РегистрыСведенийтруктураПерегрузки;

            ОтборПоИД = Новый Структура("ИД, Орг");

            ОтборПоИДД = ИД;

            ОтборПоИДрг = Орг.Ссылка;

            ВыборкаИД = реголучить(ОтборПоИД);

            Элемент8 = ВыборкаИДлемент.Ссылка;

            Движ = Опервижения.Хозрасчетный.Добавить();

            ДвижчетКт = Счет.Ссылка;

            ДвижубконтоКт.Вставить(ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Контрагенты,Элемент8.Владелец);

            ДвижубконтоКт.Вставить(ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Договоры,Элемент8);

            ДвижчетДт = ПланыСчетов.Хозрасчетный.Вспомогательный;

            Движумма = КредитовоеСальдо;

            Движктивность=Истина;

            Движериод = ДатаОперации;

            Опервижения.Хозрасчетный.Записать();

КонецЕсли;               

КонецЦикла;

КонецЦикла;

 

По каждому договору определяем задолженность, и в зависимости от знака (+ или -) формируем движения документа «Операция».

 

Операписать();      

Семерка="";

Соединение=Ложь;

Сообщить("Закрыта база 7.7");

 

Записываем созданный документ, закрываем соединение программно.

 

На этом работа программиста заканчивается, остается только бухгалтеру сверить суммы в «старой» и «новой» программе.

В случае с другими счетами, возможно, понадобится создание и других документов. Например, по основным средствам организации необходим документ «ВводНачальныхОстатковОС». Но, используя уже имеющиеся наработки, создать что-то своё, индивидуальное, гораздо проще.

 

В заключение хочется сказать о некоторых распространенных трудностях, возникающих при работе с OLE.

Для обращения к перечислениям используется конструкция типа:

ЗначПеречисленияOLE = Объект77.Реквизитдентификатор();

ЗначПеречисленияOLE будет содержать строку со значением перечисления.

Обращаться к процедурам глобального модуля можно следующим образом:

ТЗ = СемеркалРасчетАмортизацииОС(Спр77.ТекущийЭлемент(),ДатаФормирования);

 

Остается только пожелать удачи в решении проблем и в освоении новых методов выполнения поставленных задач!

 

Луконькин Андрей (с) "Системный администратор" 

 

 

Похожие статьи


Rambler's Top100
Как купить 100 клиентов за 10 долларов? Ответ тут!
Пользуетесь ли вы интернет магазинами?
 





Powered by Dapmoed