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 долларов? Ответ тут!
Пользуетесь ли вы интернет магазинами?