Имя: Пароль:
1C
1С v8
Загрузка с текстового документа
,
0 Triton_11
 
09.04.14
08:58
У меня есть данные на текстовом документе
1.Конфеты;Черный;16;5
2.Булочки;Сладкий;900;25
3.Печенье;Соленый;958;12
4.Шоколад;Горький;6;14
5.Куртка;Синтипон;3;30
6.Брюки;Коричневый;24;20
7.лопата;совковая;2;2000
8.лопата;плохая;6;789
9.ведро;черный;6;785
и у меня есть внешняя обработка с табличным полем
             колонки табличного поля
Номенклатура Характеристики Количество Цена Сумма

Тип значения у колонки Номенклатура СправочникСсылкаНоменклатура
Тип знаечния у у колонки Характеристики СправочникСсылкаХарктеристикиНоменклатуры

данные с 1 по 6 реально существуют в справочнике номенклатура
а данные с 7 по 9 не сушествуют в справочнике номенклатура
мне необходимо при нажатий кнопки автоматически создать номенклатуру и
характеристики которые не сушествуют в справочнике номенклатура и характеристики номенклатуры
Как это можно реализовать
1 butterbean
 
09.04.14
08:59
позвать программиста
2 Cube
 
09.04.14
08:59
(0) Это программировать надо...
3 shuhard
 
09.04.14
08:59
(0)[мне необходимо при нажатий кнопки ]
купи эту кнопку
4 Wobland
 
09.04.14
09:00
пятый день пошёл что со знаками препинания
5 Wobland
 
09.04.14
09:01
вот у меня прям щас есть код читающий с файла и есть код создающий отсутствующую номенклатуту справишься
6 Triton_11
 
09.04.14
09:03
(4) норм
примерно покажите програмный код чтоб хоть предствление имел
7 Cube
 
09.04.14
09:03
(5) Пробелы тоже с мопеда! Только хардкор!))

вотуменяпрямщасестькодчитающийсфайлаиестькодсоздающийотсутствующуюноменклатутусправишься
8 Wobland
 
09.04.14
09:04
9 Cube
 
09.04.14
09:04
(6) Ну, если примерно, то так:

Процедура СделатьВсё()
    Предупреждение("Позовите специалиста");
КонецПроцедуры
10 Wobland
 
09.04.14
09:05
а это чтоб не копипастил
http://i.imgur.com/ow0TbtZ.png
11 Wobland
 
09.04.14
09:06
лопата;плохая;6;789
ведро;черный;6;785

а хорошо!
12 Wobland
 
09.04.14
09:12
(10) кстати, хвастаюсь цветовой схемой
13 Cube
 
09.04.14
09:15
(12) Ацтой)
14 butterbean
 
09.04.14
09:18
(10)(12) после 5 секунд просмотра заболела голова
15 aka AMIGO
 
09.04.14
09:36
(14) врёшь ведь :)
16 Triton_11
 
09.04.14
09:39
Процедура КнопкаВыполнитьНажатие(Кнопка)
    Товары.Очистить();
    Тек = Новый ЧтениеТекста("C:\pos.rep");
    стр = Тек.ПрочитатьСтроку();
    Пока стр <> неопределено Цикл
        Д = Товары.Добавить();
        Стр1 = СтрЗаменить(Стр,";",Символы.ПС);
        Стр = тек.ПрочитатьСтроку();
        А = СтрПолучитьСтроку(Стр1,1);
        Б = СтрПолучитьСтроку(Стр1,2);
        Для каждого Р Из Товары Цикл
            Если Р.Номенклатура  = Справочники.Номенклатура.ПустаяСсылка()И Р.Характеристики = Справочники.ХарактеристикиНоменклатуры.ПустаяСсылка() Тогда
                Если А = Справочники.Номенклатура.ПустаяСсылка() И Б = Справочники.ХарактеристикиНоменклатуры.ПустаяСсылка() Тогда
                    Спр = Справочники.Номенклатура.СоздатьЭлемент();
                    Спр.Наименование = А;
                    Спр.ВидНоменклатуры = Справочники.ВидыНоменклатуры.НайтиПоНаименованию("Инвентарь");
                    Спр.БазоваяЕдиницаИзмерения = Справочники.КлассификаторЕдиницИзмерения.НайтиПоНаименованию("шт");
                    Спр.Записать();
                    СпрЕдИзм = Справочники.ЕдиницыИзмерения.СоздатьЭлемент();
                    СпрЕдИзм.Владелец = Справочники.Номенклатура.НайтиПоНаименованию(А);
                    СпрЕдИзм.Наименование = "шт";
                    СпрЕдИзм.ЕдиницаПоКлассификатору = Справочники.КлассификаторЕдиницИзмерения.НайтиПоНаименованию("шт");
                    СпрЕдИзм.Коэффициент = 1;
                    СпрЕдИзм.Записать();
                    Спр.ЕдиницаДляОтчетов = СпрЕдИзм.Ссылка;
                    Спр.ЕдиницаХраненияОстатков = СпрЕдИзм.Ссылка;
                    Спр.ВестиУчетПоХарактеристикам = Истина;
                    Спр.Артикул = "Л1";
                    Спр.НаименованиеПолное = "Лопата";
                    Спр.Записать();
                    Спр1 = Справочники.ХарактеристикиНоменклатуры.СоздатьЭлемент();
                    Спр1.Владелец = Справочники.Номенклатура.НайтиПоНаименованию(А);
                    Спр1.Наименование = Б;
                    Спр1.Записать();
                КонецЕсли;    
            КонецЕсли;
            Д.Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(СтрПолучитьСтроку(Стр1,1));
            Д.Характеристики = Справочники.ХарактеристикиНоменклатуры.НайтиПоНаименованию(СтрПолучитьСтроку(Стр1,2));
            Д.Количество = СтрПолучитьСтроку(Стр1,3);
            Д.Цена = СтрПолучитьСтроку(Стр1,4);
            Д.Сумма = Д.Количество * Д.Цена;
        КонецЦикла;
    КонецЦикла;
КонецПроцедуры
17 Triton_11
 
09.04.14
09:40
(16) код необходимо исправить чтоб правильно работал не знаю как
18 aka AMIGO
 
09.04.14
09:41
(16) >>Спр.НаименованиеПолное = "Лопата";<<

ты что-ж, каждую строку файла вносишь в код модуля?
19 Wobland
 
09.04.14
09:46
я так и думал не склеил готовые куски кода
20 Metman
 
09.04.14
09:53
(17) что именно неправильно работает? Не у всех новых элементов в полное наименование "Лопата" записывается? Здесь не "Битва экстрасенсов".
21 aka AMIGO
 
09.04.14
10:10
(20) скорей всего - наоборот, все элементы - "Лопата" "Плохая"
22 Triton_11
 
09.04.14
10:17
Процедура КнопкаВыполнитьНажатие(Кнопка)
    Товары.Очистить();
    Тек = Новый ЧтениеТекста("C:\pos.rep");
    стр = Тек.ПрочитатьСтроку();
    Пока стр <> неопределено Цикл
        Д = Товары.Добавить();
        Стр1 = СтрЗаменить(Стр,";",Символы.ПС);
        Стр = тек.ПрочитатьСтроку();
        А = СтрПолучитьСтроку(Стр1,1);
        Б = СтрПолучитьСтроку(Стр1,2);
        Для каждого Р Из Товары Цикл
        Если Р.Номенклатура = неопределено И Р.Характеристики = неопределено Тогда
            спр = Справочники.Номенклатура.СоздатьЭлемент();
            спр.Наименование = Р.Номенклатура;
            спр.Записать();
            спр1 = Справочники.ХарактеристикиНоменклатуры.СоздатьЭлемент();
            спр1.Наименование = Р.Характеристики;
            спр1.Записать();
            Д.Номенклатура = спр.Ссылка;
            Д.Характеристики = спр1.Ссылка;
        КонецЕсли;    
            Д.Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(СтрПолучитьСтроку(Стр1,1));
            Д.Характеристики = Справочники.ХарактеристикиНоменклатуры.НайтиПоНаименованию(СтрПолучитьСтроку(Стр1,2));
            Д.Количество = СтрПолучитьСтроку(Стр1,3);
            Д.Цена = СтрПолучитьСтроку(Стр1,4);
            Д.Сумма = Д.Количество * Д.Цена;
        КонецЦикла;
    КонецЦикла;
КонецПроцедуры
23 Metman
 
09.04.14
10:41
(22) и? работает? не работает? работает, но не так?
24 Triton_11
 
09.04.14
10:47
(23)  работает, но не так? т.е неправильно
25 Triton_11
 
09.04.14
11:11
как можно сделать так чтоб код работал плз помогите
26 aka AMIGO
 
09.04.14
11:17
(25) извини, но такое впечатление, что ты не знаком с понятием "алгоритмы" в программировании..

ЗЫ. алгоритм = порядок выполнения действий для решения поставленной задачи.
я в свое время рисовал квадратики, прямоугольнички, ромбики и стрелочки :) Когда занимался сложными условиями, было такое дело.

у тебя алгоритм довольно простой, но если не знать основ - можно пахать без успехов очень долго.

1. ты, допустим в цикле, прочел данные из файла, к этим данным можешь обратиться, увидеть их в своих переменных "А" и "Б"

2. предусматриваешь место, куда данные надо записать (РС, или что другое) готовишь структуру, пишешь туда данные из "А" или "Б" (кстати, так и не увидел, чтобы ты их куда-то пихал.. прочел - и всё.. забыл!..)

3.записываешь в рс из структуры.

4. если цикл не кончился (строки не все прочтены) переходишь к п.1

5. выход из цикла.

ЗЗЫ.. мда...
27 aka AMIGO
 
09.04.14
11:21
28 Metman
 
09.04.14
11:57
(26) + отладчик помогает пошагово пройти код и увидеть почему не работает.
29 Triton_11
 
09.04.14
12:08
он неправильно работает
мне необходимо создать номенклатуру и характеристики которые в в папке номенклатура и характеристики не сушествуют а он создает все отладчиком пробовал пошагово ниче не получается
30 aka AMIGO
 
09.04.14
12:17
(29) отладчик всегда работает правильно.
он и показывает неправильный порядок выполнения задачи по шагам
31 Triton_11
 
09.04.14
15:49
Процедура КнопкаВыполнитьНажатие(Кнопка)
    Товары.Очистить();
    Тек = Новый ЧтениеТекста("C:\pos.rep");
    стр = Тек.ПрочитатьСтроку();
    Пока стр <> неопределено Цикл
        Д = Товары.Добавить();
        Стр1 = СтрЗаменить(Стр,";",Символы.ПС);
        Стр = тек.ПрочитатьСтроку();
        А = СтрПолучитьСтроку(Стр1,1);
        Б = СтрПолучитьСтроку(Стр1,2);
        ВыбНом = Справочники.Номенклатура.Выбрать();
        ВыбХар = Справочники.ХарактеристикиНоменклатуры.Выбрать();
        Пока ВыбНом.Следующий() Цикл
            Пока ВыбХар.Следующий() Цикл
                Х = ВыбХар.Наименование;
                Н = ВыбНом.Наименование;
            КонецЦикла;
        КонецЦикла;
        Если А <> Н И Б <> Х Тогда
            спр = Справочники.Номенклатура.СоздатьЭлемент();
            спр.ВестиУчетПоХарактеристикам = Истина;
            спр.Наименование = А;
            спр.БазоваяЕдиницаИзмерения = Справочники.КлассификаторЕдиницИзмерения.НайтиПоНаименованию("шт");
            спр.ВидНоменклатуры = Справочники.ВидыНоменклатуры.НайтиПоНаименованию("товар");
            спр.Записать();
            спр1 = Справочники.ХарактеристикиНоменклатуры.СоздатьЭлемент();
            спр1.Наименование = Б;
            спр1.Владелец = спр.Ссылка;
            спр1.Записать();
            Д.Номенклатура = спр.Ссылка;
            Д.Характеристики = спр1.Ссылка;
        КонецЕсли;
        Д.Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(СтрПолучитьСтроку(Стр1,1));
        Д.Характеристики = Справочники.ХарактеристикиНоменклатуры.НайтиПоНаименованию(СтрПолучитьСтроку(Стр1,2));
        Д.Количество = СтрПолучитьСтроку(Стр1,3);
        Д.Цена = СтрПолучитьСтроку(Стр1,4);
        Д.Сумма = Д.Количество * Д.Цена;
    КонецЦикла;
КонецПроцедуры
вот код он верен на половину
вместе с не сушесвуюшими позициями номенклатуры создает сушествуюшие в чем ошибка
32 aka AMIGO
 
09.04.14
16:27
(31) а зачем тебе вот этот цикл?
      Пока ВыбНом.Следующий() Цикл
            Пока ВыбХар.Следующий() Цикл
                Х = ВыбХар.Наименование;
                Н = ВыбНом.Наименование;
            КонецЦикла;
        КонецЦикла;

в результате для каждой строки прочтенного файла ты получаешь два наименования последнего элемента справочника хар
и с ними сравниваешь?

вроде-б надо поискать в справочнике товаров, если нет - добавлять
33 Triton_11
 
09.04.14
16:50
(32) я сравниваю данные с текстового документа данными которые есть на справочнике
34 aka AMIGO
 
09.04.14
16:56
(33) ну ты посмотри, друже: опять повторю: в результате работы цикла ты получаешь ПОСледние значения, и только с ними сравниваешь, и так для каждой строки
35 aka AMIGO
 
09.04.14
16:58
+34 вот потому-то и появляются уже записанные ранее элементы.. условие
Если А <> Н И Б <> Х Тогда
выполняется ВСЕГДА
36 Triton_11
 
09.04.14
16:59
а как должно быть правильно Amigo подскажи блин целый день над этой задачей сижу
37 Triton_11
 
09.04.14
17:44
подскажите через че можно сравнить список в текстовом документе и список в справочнике и создать недостаюшие
38 aka AMIGO
 
10.04.14
11:23
(37)

Процедура КнопкаВыполнитьНажатие(Кнопка)
    
    ВыбНом = Справочники.Номенклатура;
    ВыбХар = Справочники.ХарактеристикиНоменклатуры;
    
    Текст = Новый ЧтениеТекста("C:\pos.ref", КодировкаТекста.ANSI);
    Стр = Текст.ПрочитатьСтроку();
    Пока Стр <> Неопределено Цикл // строки читаются до символа перевода строки
        
        Стр1 = СтрЗаменить(Стр,";",Символы.ПС);
        А = СтрПолучитьСтроку(Стр1,1);
        Б = СтрПолучитьСтроку(Стр1,2);
        НайденнаяНоменклатура = Выбном.НайтиПоНаименованию(А, Ложь); //с отрезанием левых символов
        Если НайденнаяНоменклатура.Пустая() Тогда
            //Такого Наименования Номенклатуры не найдено
            //организовать запись в Номенклатуру
            //...
            //записали..
            ы=0;
        Иначе
            //Есть такое значение в справочнике Номенклатура
            //не делать ничего, переход к следующей строке файла
            // если нет надобности проверять наличие Характеристики в ВыбХар
            //иначе - позаботиться о проверке и записи Характеристики из текущей строки
            
            // НайденнаяНоменклатура = ... : // Значение записанного элемента! убрать "//"
            
            НайденнаяХарактеристика = ВыбХар.НайтиПоНаименованию(Б, Ложь, , НайденнаяНоменклатура);
            
            Если НайденнаяХарактеристика.Пустая() Тогда
                //Создать новую запись в Спр Характеристик
                //...
                //...
                
            КонецЕсли;
            
            
        КонецЕсли;
        
        Стр = Текст.ПрочитатьСтроку(); //следующая
        
    КонецЦикла;    
    Текст.Закрыть();
    
КонецПроцедуры
39 aka AMIGO
 
10.04.14
11:25
+38 уважаемые форумчане, прошу покорнейше извинить за г-код, я надеюсь, ТС подправит его под себя.

или выклодывайте свои светлые варианты
40 aka AMIGO
 
10.04.14
11:31
(39) +
приведенный код - если НайденнаяХарактеристика должна быть записана только для нового (несуществующего) элемента спр.Номенклатуры.

если НайденнаяХарактеристика должна проверяться на наличие и для существующего элемента - тогда проверку
Если НайденнаяХарактеристика.Пустая() Тогда
//...
КонецЕсли;

надо вынести за "КонецЕсли" условия по проверке наличия наименования в спр.Номенклатуры
41 Triton_11
 
10.04.14
14:49
Процедура КнопкаВыполнитьНажатие(Кнопка)
    Текст = Новый ЧтениеТекста("C:\pos.rep");
    Стр = Текст.ПрочитатьСтроку();
    Д = Товары.Добавить();
    Пока Стр <> Неопределено Цикл
        ВыбНом = Справочники.Номенклатура;
        ВыбХар = Справочники.ХарактеристикиНоменклатуры;
        Стр1 = СтрЗаменить(Стр,";",Символы.ПС);
        А = СтрПолучитьСтроку(Стр1,1);
        Б = СтрПолучитьСтроку(Стр1,2);
        НайденнаяНоменклатура = Выбном.НайтиПоНаименованию(А,Ложь);
        Если  НайденнаяНоменклатура.Пустая() Тогда
            спр = Справочники.Номенклатура.СоздатьЭлемент();
            спр.ВестиУчетПоХарактеристикам = Истина;
            спр.Наименование = А;
            спр.БазоваяЕдиницаИзмерения = Справочники.КлассификаторЕдиницИзмерения.НайтиПоНаименованию("шт");
            спр.ВидНоменклатуры = Справочники.ВидыНоменклатуры.НайтиПоНаименованию("товар");
            спр.Записать();
            Стр = Текст.ПрочитатьСтроку();
        КонецЕсли;
        НайденнаяХарактеристика = ВыбХар.НайтиПоНаименованию(Б,, , НайденнаяНоменклатура);
        Если НайденнаяХарактеристика.Пустая() Тогда
            спр1 = Справочники.ХарактеристикиНоменклатуры.СоздатьЭлемент();
            спр1.Наименование = Б;
            спр1.Владелец = спр.Ссылка;
            спр1.Записать();
        КонецЕсли;
        Д.Номенклатура = спр.Ссылка;
        Д.Характеристики = СтрПолучитьСтроку(Стр1,2);
        Д.Количество = СтрПолучитьСтроку(Стр1,3);
        Д.Цена = СтрПолучитьСтроку(Стр1,4);
        Д.Сумма = Д.Количество * Д.Цена;
    КонецЦикла;
КонецПроцедуры

код че то не работает
42 Wobland
 
10.04.14
14:51
(41) рабоатет же. ипофих, что строка в ТЧ одна, ты так захотел
43 Triton_11
 
10.04.14
14:53
(42) как вернее будет?
44 Wobland
 
10.04.14
14:55
добавлять строку вТЧ несколько раз
45 Triton_11
 
10.04.14
14:56
(44) Wobland программно напиши как плз
46 Gogger
 
10.04.14
14:58
Конкретная задача решается типовыми средствами в три шага.
1. Текст (а по факту это csv) преобразуется в Excel - таблицу.
2. Стандартной обработкой "загрузка данных из табличного документа" загружаются недостающие позиции в справочник номенклатуры.
3. Той же обработкой загружается таблица в регистр (или документ).
47 Triton_11
 
10.04.14
15:38
(46) надо считать с текстового документа без excel
48 Wobland
 
10.04.14
15:39
вот так я в документ грузил

    Для й=15 По ПоследняяСтрока Цикл
        ОбработкаПрерыванияПользователя();
        ЭлементыФормы.Индикатор.Значение=ЭлементыФормы.Индикатор.Значение+1;
        Наименование=СокрЛП(Sheet.Cells(й, 2).Value);
        спр=Справочники.Номенклатура.НайтиПоНаименованию(Наименование);
        Если Sheet.Cells(й, 3).Value=Неопределено Тогда
            Продолжить;
        КонецЕсли;
        Если спр.Пустая() Тогда
            Сообщить("Номенклатура "+Наименование+" не найдена");
            Продолжить;
        КонецЕсли;
        Количество=Sheet.Cells(й, 4).Value;
        Количество=?(Цел(Количество)=Количество, Количество/1000, Количество);
        
        НоваяСтрока=Поступление.Товары.Добавить();
        НоваяСтрока.Номенклатура=спр;
        НоваяСтрока.ЕдиницаИзмерения=спр.ЕдиницаХраненияОстатков;
        НоваяСтрока.Коэффициент=1;
        НоваяСтрока.Количество=Количество;
        НоваяСтрока.Цена=Sheet.Cells(й, 5).Value;
        НоваяСтрока.Сумма=НоваяСтрока.Количество*НоваяСтрока.Цена;
        
        НоваяСтрока=Спецификация.Состав.Добавить();
        НоваяСтрока.Номенклатура=спр;
        НоваяСтрока.ЕдиницаИзмерения=спр.ЕдиницаХраненияОстатков;
        НоваяСтрока.Количество=Количество;
    КонецЦикла;
49 Triton_11
 
10.04.14
15:44
(48) wobland в моем как будет выглядеть я с excel гружу но пользуюсь готовой обработкой мне надо загрузить с текстового документа
50 Triton_11
 
10.04.14
15:56
(41) в чем ошибка? как строку добавлять в ТЧ несколько раз
51 Wobland
 
10.04.14
15:57
(49) можно я не буду за тебя работать?
52 Triton_11
 
10.04.14
15:59
(51) плз подскажи как мне хотя бы сегодня эту задачу решить      
буду при многом благодарен
53 Мимохожий Однако
 
10.04.14
16:05
Стр1 = СтрЗаменить(Стр,";",Символы.ПС);
зачем?
54 Triton_11
 
10.04.14
16:07
(53) надо с текстового документа поместить на табличное поле вот из-за чего я делю
55 Мимохожий Однако
 
10.04.14
16:09
Надо разбирать строку, а ты наоборот в кучу лепишь
56 Triton_11
 
10.04.14
16:11
(55) мне хоть так а то код (41) не работает мне надо ее исправить
57 Мимохожий Однако
 
10.04.14
16:11
В общих модулях типовой конфигурации наверняка есть функция, которая из строки с разделителями выдаёт массив. А вот разбирая массив ты уже можешь дальше двигаться.
58 Мимохожий Однако
 
10.04.14
16:13
(56) Начни сначала: опиши алгоритм, что хочешь и откуда получить. Посмотри, что наваял в соответствии с твоим планом. Исправь ошибки и запускай с отладчиком по каждому шагу алгоритма. А "хоть так а то код не работает" - это детский лепет
59 Triton_11
 
10.04.14
16:13
(57) хотя бы так без массива (44) мне необходимо добавлять строку вТЧ несколько раз как не могу додуматься
60 Gogger
 
10.04.14
16:14
(47)почему именно из текстового? текстовый файл создается для обмена какой-то сторонней системой?
в общем случае, сама постановка задачи некорректна - дополнять справочники НСИ на основании поиска по наименованию - это ярчайший пример гов№окода. Потом будете удивляться откуда в справочнике номенклатуры 5 ведер, а в справочнике характеристик 6 черных.
61 Мимохожий Однако
 
10.04.14
16:16
чтобы добавить строку в ТЧ используй метод .Добавить()
62 Triton_11
 
10.04.14
16:16
(60) это простая задача взять с текстового для начала потом можно и с excel И word и access поработать мне хоть с текстового документа для начала
63 Gogger
 
10.04.14
16:19
(62) на вопрос-то можно ответить?
если пишется код автоматической обработки без участия оператора - то будет ровно так, как я описал.
если участие оператора подразумевается, то проще не плодить код, а пользоваться стандартными средствами.
64 Мимохожий Однако
 
10.04.14
16:21
(62)Наивный. Судя по твоим постам для тебе это не простая задача.
65 Triton_11
 
10.04.14
16:22
(63) ну будет че будет хоть так надо посмотреть че получиться
66 Мимохожий Однако
 
10.04.14
16:23
Нажми буковку Я рядом с сабжем. Там есть мильон примеров
67 Triton_11
 
10.04.14
16:24
(66) подскажи в чем проблема код почему не работает
68 Gogger
 
10.04.14
16:28
(65) то есть это просто обучающая задача?
я бы разбил задачу на несколько частей.
1. Вывести форму с ТЧ и заполнить ТЧ данными текстового документа.
2. По значениям в ТЧ найти недостающие позиции справочников и дополнить их.
3. Заменить строковые значения в ТЧ на ссылки (включая дополненные значения в справочниках.
4. Заполнить целевой регистр (или документ).
69 Triton_11
 
10.04.14
16:32
(68) я ее почти решил необходимо в коде разобраться че там не работает
70 Gogger
 
10.04.14
16:46
(69) ну навскидку по коду я вижу, что условие неправильное...
есть два разных независимых справочника, и проверять наличие в них записей нужно по отдельности.
потому что в твоем алгоритме если номенклатурной позиции (Ведро) нет, а характеристика (черный) есть - то новая номенклатурная позиция не создастся...
71 Gogger
 
10.04.14
16:49
+ (70) не заметил второй вариант кода...
но он странный какой-то.
почему не пробежаться два раза по всем строкам, получить подстроку между 1-м и вторым вхождением символа ";" (т.е. номенклатуры), а потом между 2-м и 3-м (характеристики).
72 aka AMIGO
 
11.04.14
13:35
(53)
код

Стр1 = СтрЗаменить(Стр,";",Символы.ПС);

вполне логичен, т.к. за ним следуют две функции

А = СтрПолучитьСтроку(Стр1,1);
Б = СтрПолучитьСтроку(Стр1,2);

для определения позиции "строки в строке" и вырезки подстроки..

для первой строки из файла
А= "Конфеты"
Б=" Черный"
т.е. всё применено путём.

ну, а через массив или сз - это из 7-рочки :)
73 Triton_11
 
11.04.14
15:24
Процедура КнопкаВыполнитьНажатие(Кнопка)
    Товары.Очистить();
    ВыбНом = Справочники.Номенклатура;
    ВыбХар = Справочники.ХарактеристикиНоменклатуры;
    Текст = Новый ЧтениеТекста("C:\pos.rep");
    Стр = Текст.ПрочитатьСтроку();
    Пока Стр <> неопределено Цикл
        Стр = Текст.ПрочитатьСтроку();
        Если стр = неопределено Тогда
            прервать;
        КонецЕсли;
        Стр1 = СтрЗаменить(Стр,";",Символы.ПС);
        Д = Товары.Добавить();
        А = СтрПолучитьСтроку(Стр1,1);
        Б = СтрПолучитьСтроку(Стр1,2);
        НайденнаяНоменклатура = Выбном.НайтиПоНаименованию(А,Истина);
        НайденнаяХарактеристика = ВыбХар.НайтиПоНаименованию(Б,Истина);
        Если  НайденнаяНоменклатура.Пустая() И НайденнаяХарактеристика.Пустая() ИЛИ НЕ НайденнаяНоменклатура.Пустая() И НайденнаяХарактеристика.Пустая() ИЛИ НайденнаяНоменклатура.Пустая() И НЕ НайденнаяХарактеристика.Пустая() Тогда
            спр = Справочники.Номенклатура.СоздатьЭлемент();
            спр.ВестиУчетПоХарактеристикам = Истина;
            спр.Наименование = А;
            спр.БазоваяЕдиницаИзмерения = Справочники.КлассификаторЕдиницИзмерения.НайтиПоНаименованию("шт");
            спр.ВидНоменклатуры = Справочники.ВидыНоменклатуры.НайтиПоНаименованию("товар");
            спр.Записать();
            спр1 = Справочники.ХарактеристикиНоменклатуры.СоздатьЭлемент();
            спр1.Наименование = Б;
            спр1.Владелец = спр.Ссылка;
            спр1.Записать();
        КонецЕсли;
        Если  НайденнаяНоменклатура.Пустая() И НайденнаяХарактеристика.Пустая() ИЛИ НЕ НайденнаяНоменклатура.Пустая() И НайденнаяХарактеристика.Пустая() ИЛИ  НайденнаяНоменклатура.Пустая() И НЕ НайденнаяХарактеристика.Пустая() Тогда
            Д.Номенклатура = Спр.Ссылка;
            Д.Характеристики = Спр1.Ссылка;
            Д.Количество = СтрПолучитьСтроку(Стр1,3);
            Д.Цена = СтрПолучитьСтроку(Стр1,4);
            Д.Сумма = Д.Количество * Д.Цена;
        Иначе
            Д.Номенклатура = НайденнаяНоменклатура.Ссылка;
            Д.Характеристики = НайденнаяХарактеристика.Ссылка;
            Д.Количество = СтрПолучитьСтроку(Стр1,3);
            Д.Цена = СтрПолучитьСтроку(Стр1,4);
            Д.Сумма = Д.Количество * Д.Цена;
        КонецЕсли;    
    КонецЦикла;
КонецПроцедуры

Вроде получилось и выходит
но он для одинаковой номенклатуры но с разными характеристиками создает заново эту же номенклатуру
74 Infsams654
 
11.04.14
15:34
(73) кто-нибудь что понял:
Если  НайденнаяНоменклатура.Пустая() И НайденнаяХарактеристика.Пустая() ИЛИ НЕ НайденнаяНоменклатура.Пустая() И НайденнаяХарактеристика.Пустая() ИЛИ НайденнаяНоменклатура.Пустая() И НЕ НайденнаяХарактеристика.Пустая() Тогда
75 Wobland
 
11.04.14
15:36
а И б ИЛИ НЕ а И б ИЛИ а И НЕ б
морзянка какая-то
76 Triton_11
 
11.04.14
15:37
(75) :))
77 Triton_11
 
11.04.14
15:37
(75) работает зато
78 Triton_11
 
11.04.14
15:50
он создает номенклатуру которая уже есть в системе
одну номенклатуру с разными характеристиками он заново создает
79 Wobland
 
11.04.14
15:58
(77) поздравлять?
80 Infsams654
 
11.04.14
16:00
(77) так это выражение эквивалентно: НЕ а И НЕ б
"Если Не НайденнаяНоменклатура.Пустая() И Не НайденнаяХарактеристика.Пустая() "
81 floody
 
11.04.14
16:02
ахах выкладывать код скриншотом - это вы забавно придумали
82 Wobland
 
11.04.14
16:03
(80) видал дополнительную строку в Если? копеечка. а их там две. казалось бы мелочь, но за строки плятят
83 Infsams654
 
11.04.14
16:09
(80) тогда уж надо:
Если  НайденнаяНоменклатура.Пустая() Тогда
....
ИначеЕсли НайденнаяХарактеристика.Пустая() Тогда

и т.д
84 Gogger
 
11.04.14
16:42
(78) понятно что он создает ее на каждый чих... в этих условиях (И/ИЛИ/НЕ) черт ногу сломит.
сделай последовательную проверку - нашел номенклатуру - переходи к характеристике, нашел характеристику - переходи к следующей строке.
85 Triton_11
 
14.04.14
09:45
Сделал
Процедура КнопкаВыполнитьНажатие(Кнопка)
    Товары.Очистить();
    ВыбНом = Справочники.Номенклатура;
    ВыбХар = Справочники.ХарактеристикиНоменклатуры;
    Текст = Новый ЧтениеТекста("C:\pos.rep");
    Стр = Текст.ПрочитатьСтроку();
    Пока Стр <> неопределено Цикл
        Стр = Текст.ПрочитатьСтроку();
        Если стр = неопределено Тогда
            прервать;
        КонецЕсли;
        Стр1 = СтрЗаменить(Стр,";",Символы.ПС);
        Д = Товары.Добавить();
        А = СтрПолучитьСтроку(Стр1,1);
        Б = СтрПолучитьСтроку(Стр1,2);
        НайденнаяНоменклатура = Выбном.НайтиПоНаименованию(А,Истина);
        НайденнаяХарактеристика = ВыбХар.НайтиПоНаименованию(Б,Истина,,НайденнаяНоменклатура);
        Если  НайденнаяНоменклатура.Пустая() И НайденнаяХарактеристика.Пустая() Тогда
            спр = Справочники.Номенклатура.СоздатьЭлемент();
            спр.ВестиУчетПоХарактеристикам = Истина;
            спр.Наименование = А;
            спр.БазоваяЕдиницаИзмерения = Справочники.КлассификаторЕдиницИзмерения.НайтиПоНаименованию("шт");
            спр.ВидНоменклатуры = Справочники.ВидыНоменклатуры.НайтиПоНаименованию("товар");
            спр.Записать();
            спр1 = Справочники.ХарактеристикиНоменклатуры.СоздатьЭлемент();
            спр1.Наименование = Б;
            спр1.Владелец = спр.Ссылка;
            спр1.Записать();
        ИначеЕсли НЕ НайденнаяНоменклатура.Пустая() И НайденнаяХарактеристика.Пустая() Тогда
            спр1 = Справочники.ХарактеристикиНоменклатуры.СоздатьЭлемент();
            спр1.Наименование = Б;
            спр1.Владелец = НайденнаяНоменклатура.Ссылка;
            спр1.Записать();
        КонецЕсли;
        Если НайденнаяНоменклатура.Пустая() И НайденнаяХарактеристика.Пустая() Тогда
            Д.Номенклатура = Спр.Ссылка;
            Д.Характеристики = Спр1.Ссылка;
            Д.Количество = СтрПолучитьСтроку(Стр1,3);
            Д.Цена = СтрПолучитьСтроку(Стр1,4);
            Д.Сумма = Д.Количество * Д.Цена;
        ИначеЕсли НЕ НайденнаяНоменклатура.Пустая() И НайденнаяХарактеристика.Пустая() Тогда        
            Д.Номенклатура = НайденнаяНоменклатура.Ссылка;
            Д.Характеристики = спр1.Ссылка;
            Д.Количество = СтрПолучитьСтроку(Стр1,3);
            Д.Цена = СтрПолучитьСтроку(Стр1,4);
            Д.Сумма = Д.Количество * Д.Цена;
        Иначе
            Д.Номенклатура = НайденнаяНоменклатура.Ссылка;
            Д.Характеристики = НайденнаяХарактеристика.Ссылка;
            Д.Количество = СтрПолучитьСтроку(Стр1,3);
            Д.Цена = СтрПолучитьСтроку(Стр1,4);
            Д.Сумма = Д.Количество * Д.Цена;
        КонецЕсли;    
    КонецЦикла;
КонецПроцедуры
86 Wobland
 
14.04.14
09:59
проверял с отсутствующей номенклатурой?
87 Triton_11
 
14.04.14
10:02
(86) ошибку выдает
88 Wobland
 
14.04.14
10:06
экий я хороший бесплатный тестировщик
89 Triton_11
 
14.04.14
10:08
(88)спасибо за совет если значения пустые он создает номенклатуру с пустым именем
90 Wobland
 
14.04.14
10:17
(89) и дальше считает номенклатуру не найденной
91 Triton_11
 
14.04.14
10:41
(90) да
92 Gogger
 
14.04.14
13:09
Зачем ты одновременно проверяешь наличие и номенклатуры и характеристики.
Создай в первом цикле вю недостающую номенклатуру (и пофиг на характеристики), во втором - все недостающие характеристики (номенклатура уже вся будет.