8.х Excel и 1С скрещивание.

Тема в разделе "Отчеты и обработки для "1С:Предприятие 8"", создана пользователем Tamerlan777, 9 сен 2010.

  1. TopicStarter Overlay
    Tamerlan777
    Offline

    Tamerlan777

    Регистрация:
    9 сен 2010
    Сообщения:
    16
    Симпатии:
    0
    Баллы:
    1
    Экспортирую данные из листа excel. Возник вопрос. КАК загрузить номенклатуру с ценами. т.е. создать документ установки цен номенклатуры и засунуть в него номенклатуру тип цены саму цену.... Стандартную обработку не нашел!!! версия 8.2 Заранее спасибо.

    исходник прилагаю:

    Процедура КнопкаВыполнитьНажатие(Кнопка)
    // Вставить содержимое обработчика.
    conexcel= ПолучитьCOMОбъект("C:\номен.xls");
    спр=справочники.Номенклатура;
    i=1;

    пока СтрДлина(conexcel.Sheets(1).Cells(i,1).Value)>0 цикл
    новыйэлемент=спр.СоздатьЭлемент();
    z=conexcel.Sheets(1).Cells(i,1).Value;
    новыйэлемент.БазоваяЕдиницаИзмерения=ед;
    новыйэлемент.ЕдиницаХраненияОстатков=ед;
    новыйэлемент.ЕдиницаИзмеренияМест=ед;
    новыйэлемент.ЕдиницаДляОтчетов=ед;
    новыйэлемент.ВидНоменклатуры=вид;
    новыйэлемент.Наименование=z;
    новыйэлемент.Родитель=справочники.Номенклатура.НайтиПоКоду(кодГруппы) ;
    новыйэлемент.Записать();
    i=i+1;
    конеццикла

    КонецПроцедуры
  2. lazy
    Offline

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

    Регистрация:
    1 сен 2007
    Сообщения:
    2.127
    Симпатии:
    4
    Баллы:
    29
    Код:
    Док = Документы.УстановкаЦенНоменклатуры.СоздатьДокумент();
    Док.Дата = ТекущаяДата();
    Док.Ответственный = глТекущийПользователь;
    Док.Комментарий = "Заполнен автоматически";
    
    
    СтрЦены = Док.ТипыЦен.Добавить();
    СтрЦены.ТипЦен = ТипЦен; // Здесь указываем используемые типы цен. для данной обработки он один
    
    
    // цикл заполнения табличной части товары - для Вашего случая заменить циклом чтения Excel файла
    // получая данные для заполнения из него
    Пока Истина Цикл 
    СтрДок = Док.Товары.Добавить();
    стрДок.Номенклатура = //...
    СтрДок.ХарактеристикаНоменклатуры = //...
    стрДок.Цена = //...
    СтрДок.ТипЦен = ТипЦен;
    СтрДок.ЕдиницаИзмерения = //...
    СтрДок.Валюта = Валюта;
    КонецЦикла;
    
    Док.ПолучитьФорму().Открыть();
    
    
  3. TopicStarter Overlay
    Tamerlan777
    Offline

    Tamerlan777

    Регистрация:
    9 сен 2010
    Сообщения:
    16
    Симпатии:
    0
    Баллы:
    1
    Все сделал. Но есть один минус. при открытии документа установки цен у меня наименование пустое а все остальное заполнено.((( понять не могу почему!
  4. TopicStarter Overlay
    Tamerlan777
    Offline

    Tamerlan777

    Регистрация:
    9 сен 2010
    Сообщения:
    16
    Симпатии:
    0
    Баллы:
    1
    Людии памагите!!!!
  5. Stack_G
    Offline

    Stack_G Опытный в 1С

    Регистрация:
    10 дек 2007
    Сообщения:
    786
    Симпатии:
    2
    Баллы:
    26
    Код в студию!
  6. TopicStarter Overlay
    Tamerlan777
    Offline

    Tamerlan777

    Регистрация:
    9 сен 2010
    Сообщения:
    16
    Симпатии:
    0
    Баллы:
    1

    Выкладываю код и файл. плиз помощь мне не помешает.

    Процедура КнопкаВыполнитьНажатие(Кнопка)
    // Вставить содержимое обработчика.
    conexcel= ПолучитьCOMОбъект("C:\номен.xls");
    спр=справочники.Номенклатура;
    док=документы.УстановкаЦенНоменклатуры.СоздатьДокумент();
    i=1;
    док.Дата=текущаяДата();
    стрЦены=док.ТипыЦен.Добавить();
    стрЦены.ТипЦен=ТипЦены;

    пока СтрДлина(conexcel.Sheets(1).Cells(i,1).Value)>0 цикл
    новыйэлемент=спр.СоздатьЭлемент();
    новыйэлемент.Наименование=строка(conexcel.Sheets(1).Cells(i,1).Value);
    новыйэлемент.БазоваяЕдиницаИзмерения=ед;
    новыйэлемент.ВидНоменклатуры=вид;
    новыйэлемент.Записать();
    новыйэлемент.Родитель=справочники.Номенклатура.НайтиПоКоду(кодГруппы);
    новыйэлемент.Записать();
    новыйэлемент.ЕдиницаХраненияОстатков=ед;
    новыйэлемент.Записать();
    новыйэлемент.ЕдиницаИзмеренияМест=ед;
    новыйэлемент.Записать();
    новыйэлемент.ЕдиницаДляОтчетов=ед;
    новыйэлемент.Записать();
    новыйэлемент.НаименованиеПолное=строка(СокрЛП(conexcel.Sheets(1).Cells(i,1).Value));
    новыйэлемент.Записать();
    новыйэлемент.ПолноеНаименование();
    новыйэлемент.ПолныйКод();

    новыйэлемент.Записать();
    стрдок=док.Товары.Добавить();
    стрдок.Номенклатура=строка(conexcel.Sheets(1).Cells(i,1).Value);
    стрдок.Цена= conexcel.Sheets(1).Cells(i,2).Value;
    стрдок.ТипЦен=ТипЦены;
    стрдок.ЕдиницаИзмерения=ед;
    стрдок.Валюта=Валюта;
    стрдок.ХарактеристикаНоменклатуры="";
    i=i+1;
    конеццикла;
    док.Записать();

    КонецПроцедуры
    Посмотреть вложение 5263

    При создании номенклатуры единица измерения не прописывается. поэтому и в документе установка цен номенклатуры сама номенклатура не появляется. Может кто знает как записать номенклатуру чтобы без проблем было

    Вложения:

  7. shurikvz
    Online

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

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Код:
    стрдок.Номенклатура=строка(conexcel.Sheets(1).Cells(i,1).Value);
    
    вот это строка неверная. здесь должно быть не просто наименование, а элемент справочника номенклатура.
    Будет что-то вроде:
    Код:
    стрдок.Номенклатура=спр.НайтиПоНаименованию(строка(conexcel.Sheets(1).Cells(i,1).Value));
    
    либо
    Код:
    стрдок.Номенклатура=новыйэлемент;
    
    Кроме того, зачем вы постоянно записываете элемент справочника номенклатура? Уберите лишние
    Код:
    новыйэлемент.Записать();
    
    записывайте один раз, когда все сделали.

    Кроме того, вы каждый раз создаете новый элемент справочника номенклатура:
    Код:
    новыйэлемент=спр.СоздатьЭлемент();
    
    а почему не пытаетесь по наименованию найти, вдруг он уже существует? В итоге - у вас в справочнике может быть несколько элементов с одинаковым наименованием.
  8. TopicStarter Overlay
    Tamerlan777
    Offline

    Tamerlan777

    Регистрация:
    9 сен 2010
    Сообщения:
    16
    Симпатии:
    0
    Баллы:
    1
    Кроме того, вы каждый раз создаете новый элемент справочника номенклатура:
    Код:
    новыйэлемент=спр.СоздатьЭлемент();
    
    
    а почему не пытаетесь по наименованию найти, вдруг он уже существует? В итоге - у вас в справочнике может быть несколько элементов с одинаковым наименованием.
    [/quote]


    База новая и пустая
  9. shurikvz
    Online

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

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Если вы уверены, что определенная номенклатура на ваших листах эксель встречается только один раз, тогда оставьте. Повторений номенклатуры не может быть?
  10. shurikvz
    Online

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

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    А в этом участке кода допустим:
    Код:
    новыйэлемент.БазоваяЕдиницаИзмерения=ед;
    
    
    ед - у вас что такое? где задается?
    Кроме того, если не ошибаюсь, БазоваяЕдиницаИзмерения - имеет тип "КлассификаторЕдиницИзмерения", а ЕдиницаХраненияОстатков, ЕдиницаИзмеренияМест, ЕдиницаДляОтчетов - тип "ЕдиницыИзмерения" (подчиненый справочник).
  11. TopicStarter Overlay
    Tamerlan777
    Offline

    Tamerlan777

    Регистрация:
    9 сен 2010
    Сообщения:
    16
    Симпатии:
    0
    Баллы:
    1
    спасибо большое. теперь остается одна проблема почему единица измерения не прописывается???
  12. shurikvz
    Online

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

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    см. предыдущее сообщение.
  13. TopicStarter Overlay
    Tamerlan777
    Offline

    Tamerlan777

    Регистрация:
    9 сен 2010
    Сообщения:
    16
    Симпатии:
    0
    Баллы:
    1

    хорошо а как тогда прописать. у меня ед это классификаторединицизмерения!
  14. x_under
    Offline

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

    Регистрация:
    25 апр 2007
    Сообщения:
    2.576
    Симпатии:
    13
    Баллы:
    29
    Подумать. Почитать форум и найти милион примеров такого кода.

    Код:
    НоменклатураСсылка = Справочники.Номенклатура.НайтиПоНаименованию("");
    // смысл создавать номенклатуру несколько раз, а при отладке элементы точно появятся
    Если НоменклатураСсылка.Пустая() Тогда
    НоменклатураОбъект = Справочники.Номенклатура.СозадатьЭлемент();
    // заполнение всех основных рексизитов, кроме единиц измерения
    // ...
    НоменклатураОбъект.Записать();
    НоменклатураСсылка = НоменклатураОбъект.Ссылка;
    
    // создание единиц измерения, опять же с предварительным поиском
    ЕдиницаИзмеренияСсылка = Справочники.ЕдиницыИзмерения.НайтиПоНаименованию(<Наименование вашей базовой единицы>,,,НоменклатураСсылка);
    Если ЕдиницаИзмеренияСсылка.Пустая() Тогда
    ЕдиницаИзмеренияОбъект = Справочник.ЕдиницыИзмерения.СоздатьЭлемент();
    ЕдиницаИзмеренияОбъект.Владелец = НоменклатураСсылка;
    // и так далее
    ЕдиницаИзмеренияОбъект.Записать();
    ЕдиницаИзмеренияСсылка = ЕдиницаИзмеренияОбъект.Ссылка;
    КонецЕсли;
    
    // установка единицы для номенклатуры
    НоменклатураОбъект.ЕдиницаХраненияОстатков = ЕдиницаИзмеренияСсылка;
    // ...
    НоменклатураОбъект.Записать();
    КонецЕсли;
    
    // далее используете в документе НоменклатураСсылка - готовый элемент
    
    
    
    :angry: не цитируйте предыдущие посты без необходимости
    :D комментируйте свой код соответствующим тэгом. Читать невозможно.
  15. TopicStarter Overlay
    Tamerlan777
    Offline

    Tamerlan777

    Регистрация:
    9 сен 2010
    Сообщения:
    16
    Симпатии:
    0
    Баллы:
    1
    Всем большое спасибо. Разобрался ихха!!! Кому надо выкладываю код и файл!!!


    Процедура КнопкаВыполнитьНажатие(Кнопка)
    conexcel= ПолучитьCOMОбъект("C:\номен.xls");
    спр=справочники.Номенклатура;
    док=документы.УстановкаЦенНоменклатуры.СоздатьДокумент();
    i=1;
    док.Дата=текущаяДата();
    стрЦены=док.ТипыЦен.Добавить();
    стрЦены.ТипЦен=ТипЦены;
    пока СтрДлина(conexcel.Sheets(1).Cells(i,1).Value)>0 цикл
    номенклатурассылка=справочники.Номенклатура.НайтиПоНаименованию(conexcel.Sheets(1).Cells(i,1).Value);
    если номенклатурассылка.пустая() Тогда
    новыйэлемент=спр.СоздатьЭлемент();
    новыйэлемент.Наименование=conexcel.Sheets(1).Cells(i,1).Value;
    новыйэлемент.БазоваяЕдиницаИзмерения=ед;
    новыйэлемент.ВидНоменклатуры=вид;
    новыйэлемент.Родитель=справочники.Номенклатура.НайтиПоКоду(кодГруппы);
    новыйэлемент.НаименованиеПолное=строка(СокрЛП(conexcel.Sheets(1).Cells(i,1).Value));
    новыйэлемент.ПолноеНаименование();
    новыйэлемент.ПолныйКод();
    новыйэлемент.Записать();
    номенклатурассылка=новыйэлемент.Ссылка;
    единицаизмеренияссылка=Справочники.ЕдиницыИзмерения.НайтиПоНаименованию(ед,,,Номенклатурассылка);
    если единицаизмеренияссылка.пустая() тогда
    единицаизмеренияобъект=справочники.ЕдиницыИзмерения.СоздатьЭлемент();
    единицаизмеренияобъект.Владелец=номенклатурассылка;
    единицаизмеренияобъект.Коэффициент=1;
    единицаизмеренияобъект.Наименование="шт";
    единицаизмеренияобъект.Записать();
    единицаизмеренияссылка= единицаизмеренияобъект.Ссылка;
    конецЕсли;
    новыйэлемент.ЕдиницаХраненияОстатков= единицаизмеренияссылка;
    новыйэлемент.Записать();
    конецесли;
    стрдок=док.Товары.Добавить();
    стрдок.Номенклатура=справочники.Номенклатура.НайтиПоНаименованию(conexcel.Sheets(1).Cells(i,1).Value);
    стрдок.Цена= conexcel.Sheets(1).Cells(i,2).Value;
    стрдок.ТипЦен=ТипЦены;
    стрдок.ЕдиницаИзмерения=единицаизмеренияссылка;
    стрдок.Валюта=Валюта;
    стрдок.ХарактеристикаНоменклатуры="";
    i=i+1;
    конеццикла;
    док.Записать();
    КонецПроцедуры
    Посмотреть вложение 5265 Посмотреть вложение 5266

    Вложения:

  16. shurikvz
    Online

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

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    tamerlan777 у меня подозрение, что он может работать не совсем корректно. Вы бы оформили его тэгом code, так невозможно читать.
  17. Stack_G
    Offline

    Stack_G Опытный в 1С

    Регистрация:
    10 дек 2007
    Сообщения:
    786
    Симпатии:
    2
    Баллы:
    26
    Вот интересно, сколько времени у вас работает ваш код. Правильно - прочитать Эксель - загрузить данные в таблицу значений - потом обходя таблицу значений создавать новые объекты в базе.
  18. TopicStarter Overlay
    Tamerlan777
    Offline

    Tamerlan777

    Регистрация:
    9 сен 2010
    Сообщения:
    16
    Симпатии:
    0
    Баллы:
    1
    Всем большое спасибо. Разобрался ихха!!! Кому надо выкладыва код и файл!!!
    Код:
    Процедура КнопкаВыполнитьНажатие(Кнопка)
    conexcel= ПолучитьCOMОбъект("C:\номен.xls");
    спр=справочники.Номенклатура;
    док=документы.УстановкаЦенНоменклатуры.СоздатьДокумент();
    i=1; 
    док.Дата=текущаяДата();
    стрЦены=док.ТипыЦен.Добавить();
    стрЦены.ТипЦен=ТипЦены;
    пока СтрДлина(conexcel.Sheets(1).Cells(i,1).Value)>0 цикл
    номенклатурассылка=справочники.Номенклатура.НайтиПоНаименованию(conexcel.Sheets(1).Cells(i,1).Value);
    если номенклатурассылка.пустая() Тогда
    новыйэлемент=спр.СоздатьЭлемент();
    новыйэлемент.Наименование=conexcel.Sheets(1).Cells(i,1).Value;
    новыйэлемент.БазоваяЕдиницаИзмерения=ед;
    новыйэлемент.ВидНоменклатуры=вид;
    новыйэлемент.Родитель=справочники.Номенклатура.НайтиПоКоду(кодГруппы);
    новыйэлемент.НаименованиеПолное=строка(СокрЛП(conexcel.Sheets(1).Cells(i,1).Value));
    новыйэлемент.ПолноеНаименование();
    новыйэлемент.ПолныйКод();
    новыйэлемент.Записать();
    номенклатурассылка=новыйэлемент.Ссылка;
    единицаизмеренияссылка=Справочники.ЕдиницыИзмерения.НайтиПоНаименованию(ед,,,Номенклатурассылка);
    если единицаизмеренияссылка.пустая() тогда
    единицаизмеренияобъект=справочники.ЕдиницыИзмерения.СоздатьЭлемент();
    единицаизмеренияобъект.Владелец=номенклатурассылка;
    единицаизмеренияобъект.Коэффициент=1;
    единицаизмеренияобъект.Наименование="шт";
    единицаизмеренияобъект.Записать();
    единицаизмеренияссылка= единицаизмеренияобъект.Ссылка;
    конецЕсли;
    новыйэлемент.ЕдиницаХраненияОстатков= единицаизмеренияссылка;
    новыйэлемент.Записать();
    конецесли;   	
    стрдок=док.Товары.Добавить();
    стрдок.Номенклатура=справочники.Номенклатура.НайтиПоНаименованию(conexcel.Sheets(1).Cells(i,1).Value);
    стрдок.Цена= conexcel.Sheets(1).Cells(i,2).Value;
    стрдок.ТипЦен=ТипЦены;
    стрдок.ЕдиницаИзмерения=единицаизмеренияссылка;
    стрдок.Валюта=Валюта;
    стрдок.ХарактеристикаНоменклатуры="";
    i=i+1;
    конеццикла;
    док.Записать();
    КонецПроцедуры
    
    Посмотреть вложение 5265 Посмотреть вложение 5266
  19. shurikvz
    Online

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

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    tamerlan777 по вашему коду, скажите чему будет равна переменная единицаизмеренияссылка, если элемент справочника Номенклатура уже будет существовать? (т.е. номенклатурассылка=справочники.Номенклатура.НайтиПоНаименованию(conexcel.Sheets(1).Cells(i,1).Value); таки вернет ссылку на существующий элемент справочника?)
  20. TopicStarter Overlay
    Tamerlan777
    Offline

    Tamerlan777

    Регистрация:
    9 сен 2010
    Сообщения:
    16
    Симпатии:
    0
    Баллы:
    1
    тут были небольшие неточности. выкладываю последний вариант с загрузкой в группы.
    Код:
    
    Процедура КнопкаВыполнитьНажатие(Кнопка)
    conexcel= ПолучитьCOMОбъект("C:\номен.xls");
    спр=справочники.Номенклатура;
    док=документы.УстановкаЦенНоменклатуры.СоздатьДокумент();
    i=1; 
    док.Дата=текущаяДата();
    стрЦены=док.ТипыЦен.Добавить();
    стрЦены.ТипЦен=ТипЦены;
    пока СтрДлина(conexcel.Sheets(1).Cells(i,1).Value)>0 цикл
    номенклатурассылка=справочники.Номенклатура.НайтиПоНаименованию(conexcel.Sheets(1).Cells(i,1).Value);
    если номенклатурассылка.пустая() Тогда
    новыйэлемент=спр.СоздатьЭлемент();
    новыйэлемент.Наименование=conexcel.Sheets(1).Cells(i,1).Value;
    новыйэлемент.БазоваяЕдиницаИзмерения=ед;
    новыйэлемент.ВидНоменклатуры=вид;
    ссыл= справочники.Номенклатура.НайтиПоНаименованию(conexcel.Sheets(1).Cells(i,2).Value);
    если  ссыл.Пустая() тогда
    груп=справочники.Номенклатура.СоздатьГруппу();
    груп.Наименование=conexcel.Sheets(1).Cells(i,2).Value;
    груп.ВидНоменклатуры=вид;
    груп.Записать();
    гр=груп.Ссылка;
    иначе
    ссыл= справочники.Номенклатура.НайтиПоНаименованию(conexcel.Sheets(1).Cells(i,2).Value);
    конецесли;
    новыйэлемент.Родитель=ссыл;
    новыйэлемент.НаименованиеПолное=строка(СокрЛП(conexcel.Sheets(1).Cells(i,1).Value));
    новыйэлемент.ПолноеНаименование();
    новыйэлемент.ПолныйКод();
    новыйэлемент.Записать();
    номенклатурассылка=новыйэлемент.Ссылка;
    единицаизмеренияссылка=Справочники.ЕдиницыИзмерения.НайтиПоНаименованию(ед,,,Номенклатурассылка);
    если единицаизмеренияссылка.пустая() тогда
    единицаизмеренияобъект=справочники.ЕдиницыИзмерения.СоздатьЭлемент();
    единицаизмеренияобъект.Владелец=номенклатурассылка;
    единицаизмеренияобъект.Коэффициент=1;
    единицаизмеренияобъект.Наименование="шт";
    единицаизмеренияобъект.Записать();
    единицаизмеренияссылка= единицаизмеренияобъект.Ссылка;
    конецЕсли;
    новыйэлемент.ЕдиницаХраненияОстатков= единицаизмеренияссылка;
    новыйэлемент.Записать();
    конецесли; 
    един= единицаизмеренияссылка;
    стрдок=док.Товары.Добавить();
    стрдок.Номенклатура=справочники.Номенклатура.НайтиПоНаименованию(conexcel.Sheets(1).Cells(i,1).Value);
    стрдок.Цена= conexcel.Sheets(1).Cells(i,4).Value;
    стрдок.ТипЦен=ТипЦены;
    стрдок.ЕдиницаИзмерения=един;
    стрдок.Валюта=Валюта;
    стрдок.ХарактеристикаНоменклатуры="";
    сообщить (стрдок.Номенклатура);
    i=i+1;
    конеццикла;
    док.Записать();
    КонецПроцедуры
    
    
    
    Посмотреть вложение 5274

    Вложения:

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