Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
19 апр 2024, 06:45

экспорт из access в 1c в подчиненный справочник

Автор Nipaaah, 15 дек 2011, 17:46

0 Пользователей и 1 гость просматривают эту тему.

Nipaaah

написал код бьет ошибку. да и вообще где храниться информация подчиненного справочника
СпрКонтр.Записать();
{C:\БАЗА1С\EXTFORMS\BD_EXPORT.ERT(169)}: Код не уникальный

var id;
l=0 ;
       Акцесс = СоздатьОбъект("ADODB.CONNECTION");     
      ТабЗнач.НоваяКолонка("примечание");
   ТабЗнач.НоваяКолонка("Колонка");
   Спр=СоздатьОбъект("Справочник.Сотрудники");
Спр.ВыбратьЭлементы();
    Попытка
        СтрокаПодключения="Driver={Microsoft Access Driver (*.mdb)};Dbq=c:\Kontr.mdb;Uid=Admin;Pwd=";
        Акцесс.Open(СтрокаПодключения);
    Исключение
        Сообщить("Все плохо:"+ОписаниеОшибки());
        Возврат;
    КонецПопытки;
    Команда = СоздатьОбъект("ADODB.Command");
    Команда.ActiveConnection=Акцесс;
   
Пока Спр.ПолучитьЭлемент() = 1 Цикл
id=Спр.ТабельныйНомер;
    ТекстСелект = ("SELECT * FROM Контракты   ");
    НаборЗаписей = СоздатьОбъект("ADODB.RecordSet");
    Команда.CommandText=ТекстСелект;
    Попытка
        НаборЗаписей=Команда.Execute;
    Исключение
        Сообщить("Неудача:"+ОписаниеОшибки());
    КонецПопытки;
    Попытка
        НаборЗаписей.MoveFirst();
    Исключение //нет записей в рекордсете
         НаборЗаписей.Close();
        Возврат;
КонецПопытки;
     q1= НаборЗаписей.Fields("k_tbn").Value;
   Пока НаборЗаписей.EOF()=0 Цикл 
  if q1=id then
       ИНН = НаборЗаписей.Fields("k_d_okonch").Value; 
    ИНН1 = НаборЗаписей.Fields("k_d_nach").Value;
ИНН2 = НаборЗаписей.Fields("k_srok").Value;
  ИНН3 = НаборЗаписей.Fields("k_prim").Value;
          СпрСотр = СоздатьОбъект("Справочник.Сотрудники"); 
   СпрСотр.ВыбратьЭлементы();
        Пока  СпрСотр.ПолучитьЭлемент() = 1 Цикл
       СпрКонтр = СоздатьОбъект("Справочник.Контракты");
       СпрКонтр.Новый();
         СпрКонтр.Начало_К = ИНН1;
   СпрКонтр.Конец_К = ИНН;
       СпрКонтр.месяц = ИНН2;
   СпрКонтр.Примечание = ИНН3;
       СпрКонтр.Владелец = СпрСотр.ТекущийЭлемент();
             СпрКонтр.Записать();
             КонецЦикла;
    КонецЕсли;
        НаборЗаписей.MoveNext();
КонецЦикла;
   НаборЗаписей.Close();         
   enddo  ;
КонецПРоцедуры

Клюшкин

Поясните, в чем задача. Если создать по 1 контракту (1, обратите внимание) для каждого сотрудника, который оказался в БД Access, то незачем перебирать справочник сотрудника еще раз. Возможно, я неправильно понял, но мне кажется, что 2-й перебор справочника ошибочен. В описанном коде каждый контракт создается для каждого сотрудника:
Пока Спр.ПолучитьЭлемент() = 1 Цикл
     Пока  СпрСотр.ПолучитьЭлемент() = 1 Цикл




Клюшкин

Предполагаю что нужно создать контракт только для того, кому принадлежит табельный номер. Если подтвердите, продолжим тему ).

Nipaaah

Цитата: Клюшкин от 15 дек 2011, 20:41
Предполагаю что нужно создать контракт только для того, кому принадлежит табельный номер. Если подтвердите, продолжим тему ).
да необходимо из access добавить в подчиненный справочник контракты
я поставил в справочнике контракты что он подчинен сотрудником написал код но в связи с плохим понимаем 1с нечего путного не выходит  (мб у кого есть пример экспорт в подчиненный справочник а то 1с после си... тяжко :(

типа у 1 сотрудника может быть несколько контрактов

Клюшкин

Цитата: Nipaaah от 15 дек 2011, 17:46
написал код бьет ошибку. да и вообще где храниться информация подчиненного справочника
СпрКонтр.Записать();
{C:\БАЗА1С\EXTFORMS\BD_EXPORT.ERT(169)}: Код не уникальный

var id;
l=0 ;
       Акцесс = СоздатьОбъект("ADODB.CONNECTION");     
      ТабЗнач.НоваяКолонка("примечание");
   ТабЗнач.НоваяКолонка("Колонка");
   Спр=СоздатьОбъект("Справочник.Сотрудники");
Спр.ВыбратьЭлементы();

//перенесли сюда
СпрКонтр = СоздатьОбъект("Справочник.Контракты");

    Попытка
        СтрокаПодключения="Driver={Microsoft Access Driver (*.mdb)};Dbq=c:\Kontr.mdb;Uid=Admin;Pwd=";
        Акцесс.Open(СтрокаПодключения);
    Исключение
        Сообщить("Все плохо:"+ОписаниеОшибки());
        Возврат;
    КонецПопытки;
    Команда = СоздатьОбъект("ADODB.Command");
    Команда.ActiveConnection=Акцесс;
   
Пока Спр.ПолучитьЭлемент() = 1 Цикл
id=Спр.ТабельныйНомер;
    ТекстСелект = ("SELECT * FROM Контракты   ");
    НаборЗаписей = СоздатьОбъект("ADODB.RecordSet");
    Команда.CommandText=ТекстСелект;
    Попытка
        НаборЗаписей=Команда.Execute;
    Исключение
        Сообщить("Неудача:"+ОписаниеОшибки());
    КонецПопытки;
    Попытка
        НаборЗаписей.MoveFirst();
    Исключение //нет записей в рекордсете
         НаборЗаписей.Close();
        Возврат;
КонецПопытки;
        q1= НаборЗаписей.Fields("k_tbn").Value;
        Пока НаборЗаписей.EOF()=0 Цикл 
     if q1=id then
                ИНН = НаборЗаписей.Fields("k_d_okonch").Value; 
        ИНН1 = НаборЗаписей.Fields("k_d_nach").Value;
ИНН2 = НаборЗаписей.Fields("k_srok").Value;
ИНН3 = НаборЗаписей.Fields("k_prim").Value;
             [color=green]//еще один цикл не нужен          
             //СпрСотр = СоздатьОбъект("Справочник.Сотрудники"); 
     //СпрСотр.ВыбратьЭлементы();
     //Пока  СпрСотр.ПолучитьЭлемент() = 1 Цикл
             //объект контракты создадим перед начало циклов
             //СпрКонтр = СоздатьОбъект("Справочник.Контракты");[/color]
             СпрКонтр.Новый();
     СпрКонтр.Начало_К = ИНН1;
     СпрКонтр.Конец_К = ИНН;
             СпрКонтр.месяц = ИНН2;
     СпрКонтр.Примечание = ИНН3;
            [color=green] //СпрКонтр.Владелец = СпрСотр.ТекущийЭлемент();[/color]
             СпрКонтр.ИспользоватьВладельца(Спр.ТекущийЭлемент());
            [color=green]//возможен и ваш синтаксис, только другой справочник - Спр[/color]

             СпрКонтр.Записать();
            [color=green] //КонецЦикла;[/color]

         КонецЕсли;
         НаборЗаписей.MoveNext();
    КонецЦикла;
    НаборЗаписей.Close();   
enddo  ;
КонецПРоцедуры


Не пробовал это запускать, просто подправил явные ошибки - мы в цикле перебора справочника сотрудники перебираем таблицу из БД Access, соответственно, когда табельные совпадают, нет необходимости в еще одном обращении к справочнику сотрудников - у нас уже есть текущий элемент Спр.ТекущийЭлемент(), который будет владельцем таблицы контрактов этого сотрудника (их может быть от 0 до бесконечности).

Nipaaah

ЦитироватьНе пробовал это запускать, просто подправил явные ошибки - мы в цикле перебора справочника сотрудники перебираем таблицу из БД Access, соответственно, когда табельные совпадают, нет необходимости в еще одном обращении к справочнику сотрудников - у нас уже есть текущий элемент Спр.ТекущийЭлемент(), который будет владельцем таблицы контрактов этого сотрудника (их может быть от 0 до бесконечности).
да вы правы
я поставил вывод message() идет перебор  номеров сотрудников но когда мы находим 1 запись контрактов бьет ошибку
СпрКонтр.Записать();
{C:\БАЗА1С\EXTFORMS\BD_EXPORT.ERT(274)}: Не выбран элемент справочника-хозяина! Элемент не может быть записан!

Клюшкин

Цитата: Nipaaah от 16 дек 2011, 09:36
я поставил вывод message() идет перебор  номеров сотрудников но когда мы находим 1 запись контрактов бьет ошибку
СпрКонтр.Записать();
{C:\БАЗА1С\EXTFORMS\BD_EXPORT.ERT(274)}: Не выбран элемент справочника-хозяина! Элемент не может быть записан!


Не понял - это при перезапуске старого кода с выводом сообщений или ошибка появляется в измененном коде (без цикла) уже?

Nipaaah

Цитата: Клюшкин от 16 дек 2011, 10:55
Цитата: Nipaaah от 16 дек 2011, 09:36
я поставил вывод message() идет перебор  номеров сотрудников но когда мы находим 1 запись контрактов бьет ошибку
СпрКонтр.Записать();
{C:\БАЗА1С\EXTFORMS\BD_EXPORT.ERT(274)}: Не выбран элемент справочника-хозяина! Элемент не может быть записан!


Не понял - это при перезапуске старого кода с выводом сообщений или ошибка появляется в измененном коде (без цикла) уже?
в новом коде

Клюшкин

Переставьте строку, задающую владельца (СпрКонтр.ИспользоватьВладельца(Спр.ТекущийЭлемент());) стобы она находилась перед строкой, создающей новую запись (СпрКонтр.Новый();).

Nipaaah

Цитата: Клюшкин от 16 дек 2011, 14:30
Переставьте строку, задающую владельца (СпрКонтр.ИспользоватьВладельца(Спр.ТекущийЭлемент());) стобы она находилась перед строкой, создающей новую запись (СпрКонтр.Новый();).
о наконец подумал я....
правда обнаружил снова ошибку из access выводит один и тот же номер потом когда конец новый номер справочника и по новой тот же номер access хотя  НаборЗаписей.MoveNext() стоит же((

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск