8.х ОБМЕН Справочники и exel

Тема в разделе "Обмен данными в "1С:Предприятие 8"", создана пользователем VIPOS, 21 сен 2012.

  1. TopicStarter Overlay
    VIPOS
    Offline

    VIPOS Опытный в 1С

    Регистрация:
    12 сен 2012
    Сообщения:
    565
    Симпатии:
    1
    Баллы:
    29
    Всем доброго времени суток.... Прошу сразу строго не судить т.к. в 1с новичок...
    На данном этапе занимаюсь переносом реквизитов справочника сотрудники...

    Код:
    Процедура ЗаполнитьИзExcel(Кнопка)<br>Excel = Новый COMОбъект("Excel.Application");
    ВыбФайл = Новый Файл("d:\хрень\Только нужное.xls");
    ФайлОткуда = ВыбФайл.ПолноеИмя;
    РабочаяКнига = Excel.WorkBooks.Open(ФайлОткуда);Страница=1;
    Пока Страница&lt;=489 Цикл
    Лист = Excel.Sheets(Страница);
    Строка=2;<br>Ссылка = Справочники.СотрудникиОрганизаций.НайтиПоКоду(Значение1);
    Пока ЗначениеЗаполнено(Лист.Cells(Строка, 1).Value) Цикл
    Эл = Справочники.СотрудникиОрганизаций.СоздатьЭлемент();
    Значение1=Лист.Cells(Строка,1).Value;
    Эл.Бронь=Лист.Cells(Строка,3). Value;
    Эл.ВременныйПеревод= Лист.Cells(Строка,4). Value;
    Эл.ДатаУхода= Лист.Cells(Строка,5). Value;
    Эл.ДолжностноеЛицо=Лист.Cells(Строка,6). Value;
    Эл.МОЛ=Лист.Cells(Строка,7). Value;
    Эл.Пенсионер=Лист.Cells(Строка,8). Value;
    Эл.ПриемВСчетБрони=Лист.Cells(Строка,9). Value;
    Эл.ПризнакПенсионера=Лист.Cells(Строка,10). Value;
    Эл.СемейноеПоложение=Лист.Cells(Строка,11). Value;
    Эл.СовместительВнешний=Лист.Cells(Строка,12). Value;
    Эл.Совмещение=Лист.Cells(Строка,13). Value;
    Эл.Записать();
    строка = строка + 1;
    КонецЦикла;
    Страница=Страница+1;
    КонецЦикла
    Помогите пож доработать....

    Нужно чтобы вот эти реквизиты дополнялись, а не весь сотрудник переписывался!
  2. Draco
    Offline

    Draco Модераторы Команда форума Модератор

    Регистрация:
    28 окт 2009
    Сообщения:
    13.628
    Симпатии:
    946
    Баллы:
    204
    А что мещает попробовать их загрузить через Загрузку данных из табличного документа?
  3. TopicStarter Overlay
    VIPOS
    Offline

    VIPOS Опытный в 1С

    Регистрация:
    12 сен 2012
    Сообщения:
    565
    Симпатии:
    1
    Баллы:
    29
    Да это вообще геморой...
    ничего не выходит......
    может настройки не правильно делаю или может обработка недоработанная попалась..
  4. Tiger86
    Offline

    Tiger86 Модераторы Команда форума Модератор

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    судя по вашему коду, вы не дополняете элемент, а создаете новый... опишите подробнее задачу
  5. TopicStarter Overlay
    VIPOS
    Offline

    VIPOS Опытный в 1С

    Регистрация:
    12 сен 2012
    Сообщения:
    565
    Симпатии:
    1
    Баллы:
    29
    В семерке есть справочник сотрудники..... Из него нужно перенести часть реквизитов в 8-ку...
    в 8-ке уже есть эти сотрудники и часть реквизитов, этот справочник 8-ки нужно дополнить реквизитами из семерки....
    реквизиты из семерки я вытащил в excel. Теперь оттуда перекидываю (дополняю) из exel
  6. TopicStarter Overlay
    VIPOS
    Offline

    VIPOS Опытный в 1С

    Регистрация:
    12 сен 2012
    Сообщения:
    565
    Симпатии:
    1
    Баллы:
    29
    АУ!!!!!!!!!!!!!!!!!!!!
  7. TopicStarter Overlay
    VIPOS
    Offline

    VIPOS Опытный в 1С

    Регистрация:
    12 сен 2012
    Сообщения:
    565
    Симпатии:
    1
    Баллы:
    29
    Код:
    Excel = Новый COMОбъект("Excel.Application");
    ВыбФайл = Новый Файл("d:\хрень\Только нужное2.xls");
    ФайлОткуда = ВыбФайл.ПолноеИмя;
    РабочаяКнига = Excel.WorkBooks.Open(ФайлОткуда);
    Страница=1;
    Пока Страница=1 Цикл
    Лист = Excel.Sheets(1);   
    Строка=2;
    Пока ЗначениеЗаполнено(Лист.Cells(Строка, 1).Value) Цикл
    Значение1=Лист.Cells(Строка,1).Value;
    ссылка= Справочники.СотрудникиОрганизаций.НайтиПоКоду(Значение1);
    Если не Ссылка.Пустая() Тогда
    Значение1=Лист.Cells(Строка,1).Value;
    Эл = Справочники.СотрудникиОрганизаций.СоздатьЭлемент();
    Значение1=Лист.Cells(Строка,1).Value;
    эл.Код=Значение1;
    Эл.Бронь=Лист.Cells(Строка,3). Value;
    Эл.ВременныйПеревод= Лист.Cells(Строка,4). Value;;
    Эл.ДатаУхода= Лист.Cells(Строка,5). Value;
    Эл.ДолжностноеЛицо=Лист.Cells(Строка,6). Value;
    Эл.МОЛ=Лист.Cells(Строка,7). Value;
    Эл.Пенсионер=Лист.Cells(Строка,8). Value;
    Эл.ПриемВСчетБрони=Лист.Cells(Строка,9). Value;
    Эл.ПризнакПенсионера=Лист.Cells(Строка,10). Value;
    Эл.СемейноеПоложение=Лист.Cells(Строка,11). Value;
    Эл.СовместительВнешний=Лист.Cells(Строка,12). Value;
    Эл.Совмещение=Лист.Cells(Строка,13). Value;
    Эл.Записать();
    иначе
    Сообщить("Не найден сотрудник"+ Значение1);
    
    Конецесли;
    строка = строка + 1;			   
    
    КонецЦикла;	  
    КонецЦикла;
    
    вот немного подшаманил... но все равнро не пишет и зацикливается....
  8. Tiger86
    Offline

    Tiger86 Модераторы Команда форума Модератор

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    а зачем же вы тогда создаете элемент? вот думаю как то так надо поправить
    Код:
    Процедура ЗаполнитьИзExcel(Кнопка)
    Excel = Новый COMОбъект("Excel.Application");
    РабочаяКнига = Excel.WorkBooks.Open("d:\хрень\Только нужное.xls");
    Лист  = Excel.Sheets(1);  
    Строка = 2;
    Пока Строка<=489 Цикл
    Эл = Справочники.СотрудникиОрганизаций.НайтиПоКоду(Лист.Cells(Строка, 1).Value);
    Если Эл.Пустая() Тогда
    сообщить("Значение не найдено" + Лист.Cells(Строка, 1).Value);
    Иначе
    Эл.Бронь=Лист.Cells(Строка,3). Value;
    Эл.ВременныйПеревод= Лист.Cells(Строка,4). Value;
    Эл.ДатаУхода= Лист.Cells(Строка,5). Value;
    Эл.ДолжностноеЛицо=Лист.Cells(Строка,6). Value;
    Эл.МОЛ=Лист.Cells(Строка,7). Value;
    Эл.Пенсионер=Лист.Cells(Строка,8). Value;
    Эл.ПриемВСчетБрони=Лист.Cells(Строка,9). Value;
    Эл.ПризнакПенсионера=Лист.Cells(Строка,10). Value;
    Эл.СемейноеПоложение=Лист.Cells(Строка,11). Value;
    Эл.СовместительВнешний=Лист.Cells(Строка,12). Value;
    Эл.Совмещение=Лист.Cells(Строка,13). Value;
    Эл.Записать();
    КонецЕсли;
    строка = строка + 1;
    КонецЦикла
    надо только работоспособность проверить.... код прямо тут поправляла
  9. TopicStarter Overlay
    VIPOS
    Offline

    VIPOS Опытный в 1С

    Регистрация:
    12 сен 2012
    Сообщения:
    565
    Симпатии:
    1
    Баллы:
    29
    ругается что поле обьекта недосупно для записи :unsure: :unsure: :unsure: :unsure:
  10. Tiger86
    Offline

    Tiger86 Модераторы Команда форума Модератор

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    скорее всего надо получить его как обект
    Код:
    Процедура ЗаполнитьИзExcel(Кнопка)
    Excel = Новый COMОбъект("Excel.Application");
    РабочаяКнига = Excel.WorkBooks.Open("d:\хрень\Только нужное.xls");
    Лист  = Excel.Sheets(1);
    Строка = 2;
    Пока Строка<=489 Цикл
    Ссылка = Справочники.СотрудникиОрганизаций.НайтиПоКоду(Лист.Cells(Строка, 1).Value);
    Если Ссылка.Пустая() Тогда
    сообщить("Значение не найдено" + Лист.Cells(Строка, 1).Value);
    Иначе
    Эл = Ссылка.ПолучитьОб[b]ъ[/b]ект();[/b] // вот это добавь
    Эл.Бронь=Лист.Cells(Строка,3). Value;
    Эл.ВременныйПеревод= Лист.Cells(Строка,4). Value;
    Эл.ДатаУхода= Лист.Cells(Строка,5). Value;
    Эл.ДолжностноеЛицо=Лист.Cells(Строка,6). Value;
    Эл.МОЛ=Лист.Cells(Строка,7). Value;
    Эл.Пенсионер=Лист.Cells(Строка,8). Value;
    Эл.ПриемВСчетБрони=Лист.Cells(Строка,9). Value;
    Эл.ПризнакПенсионера=Лист.Cells(Строка,10). Value;
    Эл.СемейноеПоложение=Лист.Cells(Строка,11). Value;
    Эл.СовместительВнешний=Лист.Cells(Строка,12). Value;
    Эл.Совмещение=Лист.Cells(Строка,13). Value;
    Эл.Записать();
    КонецЕсли;
    строка = строка + 1;
    КонецЦикла
  11. TopicStarter Overlay
    VIPOS
    Offline

    VIPOS Опытный в 1С

    Регистрация:
    12 сен 2012
    Сообщения:
    565
    Симпатии:
    1
    Баллы:
    29
    я тоже об этом сразу подумал, но все равно выдает ошибку

    {Справочник.СотрудникиОрганизаций.Форма.г_ФормаЭлемента1.Форма(271)}: Поле объекта недоступно для записи (Бронь)
    Эл.Бронь=Лист.Cells(Строка,3). Value;
  12. Tiger86
    Offline

    Tiger86 Модераторы Команда форума Модератор

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    пройдись отладчиком, посмотри что попадает в переменные
  13. TopicStarter Overlay
    VIPOS
    Offline

    VIPOS Опытный в 1С

    Регистрация:
    12 сен 2012
    Сообщения:
    565
    Симпатии:
    1
    Баллы:
    29
    Эл = Ссылка.ПолучитьОбъект();- выдает ошибка в выражении
  14. Tiger86
    Offline

    Tiger86 Модераторы Команда форума Модератор

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    а ссылка чему равна при этом... скорее всего поиск по коду вернет либо ссылку на элемент, либо Неопределено... Думаю стоит прописать еще условие на этот момент
    Код:
    Если Ссылка.Пустая() или Ссылка = НеопределеноТогда
  15. TopicStarter Overlay
    VIPOS
    Offline

    VIPOS Опытный в 1С

    Регистрация:
    12 сен 2012
    Сообщения:
    565
    Симпатии:
    1
    Баллы:
    29
    Код:
    Excel = Новый COMОбъект("Excel.Application");
    РабочаяКнига = Excel.WorkBooks.Open("d:\хрень\Только нужное.xls");
    Лист  = Excel.Sheets(1); 
    Строка = 2;
    Пока Строка<=1100 Цикл
    Эл = Справочники.СотрудникиОрганизаций.НайтиПоКоду(Лист.Cells(Строка, 1).Value);
    Если Эл.Пустая() или Ссылка = Неопределено Тогда
    сообщить("Значение не найдено" + Лист.Cells(Строка, 1).Value);
    Иначе
    Эл2=Эл.ПолучитьОбъект();
    Эл2.Бронь=Лист.Cells(Строка,3). Value;
    Эл2.ВременныйПеревод= Лист.Cells(Строка,4). Value;
    Эл2.ДатаУхода= Лист.Cells(Строка,5). Value;
    Эл2.ДолжностноеЛицо=Лист.Cells(Строка,6). Value;
    Эл2.МОЛ=Лист.Cells(Строка,7). Value;
    Эл2.Пенсионер=Лист.Cells(Строка,8). Value;
    Эл2.ПриемВСчетБрони=Лист.Cells(Строка,9). Value;
    Эл2.ПризнакПенсионера=Лист.Cells(Строка,10). Value;
    Эл2.СемейноеПоложение=Лист.Cells(Строка,11). Value;
    Эл2.СовместительВнешний=Лист.Cells(Строка,12). Value;
    Эл2.Совмещение=Лист.Cells(Строка,13). Value;
    Сообщить("Сотрудник "+ Лист.Cells(Строка, 1).Value+" заполнен");
    Эл2.Записать();
    КонецЕсли;
    строка = строка + 1;
    КонецЦикла;
    
    решил попробовать так.... жду результата..

    Цикл проходит но записей не добовляект (((

    точнее реквизиты не заносит...
  16. Tiger86
    Offline

    Tiger86 Модераторы Команда форума Модератор

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    а отладчиком то посмотрите что попадает в переменные.... и если вы уж оставили переменную ЭЛ, то и ССылка надо поменять на ЭЛ в условии

    и еще момент... из екселя все значения имеют тип строка, соответственно, если реквизиты справочника имеют другой тип, то надо преобразовывать значения перед записью, иначе ничего не запишется
  17. TopicStarter Overlay
    VIPOS
    Offline

    VIPOS Опытный в 1С

    Регистрация:
    12 сен 2012
    Сообщения:
    565
    Симпатии:
    1
    Баллы:
    29
    обьект получаю......
    вот ниже скрины получения обьекта и одного реквизита...

    Вложения:

  18. Tiger86
    Offline

    Tiger86 Модераторы Команда форума Модератор

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    вот и приехали.... смотрите какой тип у реквизиты и в соответствии с этим надо ваши Строковые значения из екселя "переделать" в соответствующие значения по типу, тогда все будет заполняться.... т.е. если реквизит с типом перечисления, то и присваивать ему надо перечисления, а не строку
  19. TopicStarter Overlay
    VIPOS
    Offline

    VIPOS Опытный в 1С

    Регистрация:
    12 сен 2012
    Сообщения:
    565
    Симпатии:
    1
    Баллы:
    29
    а по подробней можно???

    как это организовать????
  20. TopicStarter Overlay
    VIPOS
    Offline

    VIPOS Опытный в 1С

    Регистрация:
    12 сен 2012
    Сообщения:
    565
    Симпатии:
    1
    Баллы:
    29
    Код:
    Процедура ДействияФормыЭкспорт(Кнопка)
    Excel = Новый COMОбъект("Excel.Application");
    РабочаяКнига = Excel.WorkBooks.Open("d:\хрень\Только нужное2.xls");
    Лист  = Excel.Sheets(1); 
    Строка = 4;
    Пока Строка<=1100 Цикл
    Эл = Справочники.СотрудникиОрганизаций.НайтиПоКоду(Лист.Cells(Строка, 1).Value);
    Если Эл.Пустая() или Эл = Неопределено Тогда
    сообщить("Значение не найдено" + Лист.Cells(Строка, 1).Value);
    Иначе
    Эл2=Эл.ПолучитьОбъект();
    Если Лист.Cells(Строка,3). Value=  Перечисления.г_ПричиныБрони.Военнослужащий тогда
    Эл2.Бронь=Перечисления.г_ПричиныБрони.Военнослужащий;
    ИначеЕсли Лист.Cells(Строка,3). Value=  Перечисления.г_ПричиныБрони.ВозмещениеРасходов Тогда
    Эл2.Бронь=Перечисления.г_ПричиныБрони.ВозмещениеРасходов;
    ИначеЕсли Лист.Cells(Строка,3). Value=  Перечисления.г_ПричиныБрони.МолодойСпециалист Тогда
    Эл2.Бронь=Перечисления.г_ПричиныБрони.МолодойСпециалист;
    ИначеЕсли Лист.Cells(Строка,3). Value=  Перечисления.г_ПричиныБрони.МолодойСпециалист Тогда
    Эл2.Бронь=Перечисления.г_ПричиныБрони.МолодойСпециалист;
    ИначеЕсли Лист.Cells(Строка,3). Value=  Перечисления.г_ПричиныБрони.ОсвобождениеИзМЛС Тогда
    Эл2.Бронь=Перечисления.г_ПричиныБрони.ОсвобождениеИзМЛС;
    ИначеЕсли Лист.Cells(Строка,3). Value=  Перечисления.г_ПричиныБрони.УстройствоНаРаботуДо21Года Тогда
    Эл2.Бронь=Перечисления.г_ПричиныБрони.УстройствоНаРаботуДо21Года;
    КонецЕсли;
    //Эл2.ВременныйПеревод=  Булево (Лист.Cells(Строка,4). Value);
    //Эл2.ДатаУхода= Лист.Cells(Строка,5). Value;
    Эл2.ДолжностноеЛицо=Булево(Лист.Cells(Строка,6). Value);
    Эл2.МОЛ=Булево(Лист.Cells(Строка,7). Value);
    Если Лист.Cells(Строка,10). Value =Перечисления.г_Пенсионер.ВоенныйПенсионер тогда
    Эл2.ПризнакПенсионера=Перечисления.г_Пенсионер.ВоенныйПенсионер;
    ИначеЕсли  Лист.Cells(Строка,10). Value =Перечисления.г_Пенсионер.МногодетнаяМать тогда
    Эл2.ПризнакПенсионера=Перечисления.г_Пенсионер.МногодетнаяМать;
    ИначеЕсли  Лист.Cells(Строка,10). Value =Перечисления.г_Пенсионер.ОбычныйПенсионер тогда
    Эл2.ПризнакПенсионера=Перечисления.г_Пенсионер.ОбычныйПенсионер;
    ИначеЕсли  Лист.Cells(Строка,10). Value =Перечисления.г_Пенсионер.ПоИнвалидности тогда
    Эл2.ПризнакПенсионера=Перечисления.г_Пенсионер.ПоИнвалидности;
    ИначеЕсли  Лист.Cells(Строка,10). Value =Перечисления.г_Пенсионер.РебенокИнвалид тогда
    Эл2.ПризнакПенсионера=Перечисления.г_Пенсионер.РебенокИнвалид;
    ИначеЕсли  Лист.Cells(Строка,10). Value =Перечисления.г_Пенсионер.Список1 тогда
    Эл2.ПризнакПенсионера=Перечисления.г_Пенсионер.Список1;
    ИначеЕсли  Лист.Cells(Строка,10). Value =Перечисления.г_Пенсионер.Список2 тогда
    Эл2.ПризнакПенсионера=Перечисления.г_Пенсионер.Список2;
    ИначеЕсли  Лист.Cells(Строка,10). Value =Перечисления.г_Пенсионер.УчастникЛАнаЧАЭС тогда
    Эл2.Пенсионер=Перечисления.г_Пенсионер.УчастникЛАнаЧАЭС;
    КонецЕсли;
    Эл2.ПриемВСчетБрони=булево(Лист.Cells(Строка,9). Value);
    Эл2.Пенсионер=Булево(Лист.Cells(Строка,8). Value);
    Если  Лист.Cells(Строка,11). Value= Перечисления.г_СемейноеПоложение.Вдова Тогда
    Эл2.СемейноеПоложение=Перечисления.г_СемейноеПоложение.Вдова;
    ИначеЕсли  Лист.Cells(Строка,11). Value= Перечисления.г_СемейноеПоложение.Вдовец Тогда
    Эл2.СемейноеПоложение=Перечисления.г_СемейноеПоложение.Вдовец;
    ИначеЕсли  Лист.Cells(Строка,11). Value= Перечисления.г_СемейноеПоложение.Женат Тогда
    Эл2.СемейноеПоложение=Перечисления.г_СемейноеПоложение.Женат;
    ИначеЕсли  Лист.Cells(Строка,11). Value= Перечисления.г_СемейноеПоложение.Замужем Тогда
    Эл2.СемейноеПоложение=Перечисления.г_СемейноеПоложение.Замужем;
    ИначеЕсли  Лист.Cells(Строка,11). Value= Перечисления.г_СемейноеПоложение.НеЗамужем Тогда
    Эл2.СемейноеПоложение=Перечисления.г_СемейноеПоложение.НеЗамужем;
    ИначеЕсли  Лист.Cells(Строка,11). Value= Перечисления.г_СемейноеПоложение.Разведен Тогда
    Эл2.СемейноеПоложение=Перечисления.г_СемейноеПоложение.Разведен;
    ИначеЕсли  Лист.Cells(Строка,11). Value= Перечисления.г_СемейноеПоложение.Холост Тогда
    Эл2.СемейноеПоложение=Перечисления.г_СемейноеПоложение.Холост;
    КонецЕсли;
    Эл2.СовместительВнешний=Булево(Лист.Cells(Строка,12). Value);
    Эл2.Совмещение=Булево(Лист.Cells(Строка,13). Value);
    Сообщить("Сотрудник "+ Лист.Cells(Строка, 1).Value+" заполнен");
    Эл2.Прочитать();
    Эл2.Записать();
    КонецЕсли;
    строка = строка + 1;
    КонецЦикла;
    
    КонецПроцедуры
    
    Вот что у меня получилось.... скажите правильно?

Поделиться этой страницей