Имя: Пароль:
1C
1С v8
Загрузка данных в уже существующий документ
0 Валидатор
 
25.10.13
13:39
Написал обработку по загрузке данных из тхт файла в ТЗ, потом обхожу эту ТЗ и на основании ее строк заполняю документы поступления товаров и услуг, конфа комплексная автоматизация 8.2. Вот код:
Для каждого Строка из ТаблицаЗначений Цикл
        ПоискДокумента = Документы.ПоступлениеТоваровУслуг.НайтиПоНомеру(Строка.НомерНакладной);
        Если ЗначениеЗаполнено(ПоискДокумента) Тогда
            НайденДокумент = ПоискДокумента.ПолучитьОбъект();    
            НайденДокумент.Комментарий = Комментарий;
            НайденДокумент.Дата = Строка.ДатаНакладной;
            НайденДокумент.Контрагент = Контрагент;
            НайденДокумент.СкладОрдер = Склад;
            НайденДокумент.Организация = Организация;
            СтруктураРеквизитовДокумента = Ценообразование.ПолучитьСтруктуруРеквизитовДокументаДляЦенообразования(НайденДокумент);
            
            //добавляем строки в ТЧ
            НоваяСтрокаНайденДокумент = НайденДокумент.Товары.Добавить();
            НоменклатураПоискПоНаименованию = Справочники.Номенклатура.НайтиПоНаименованию(строка.Номенклатура);
            
            Если НоменклатураПоискПоНаименованию = Справочники.Номенклатура.ПустаяСсылка() Тогда
                НоменклатураПоискПоНаименованию = СоздатьНоменклатуру(строка.Артикул, строка.Номенклатура, ГруппаТоваровНов);
                НоменклатураПоискПоНаименованию = НоменклатураПоискПоНаименованию.Ссылка;    
            КонецЕсли;
            НоваяСтрокаНайденДокумент.ЕдиницаИзмерения = НоменклатураПоискПоНаименованию.БазоваяЕдиницаИзмерения;
            НоваяСтрокаНайденДокумент.Номенклатура = НоменклатураПоискПоНаименованию;
            НоваяСтрокаНайденДокумент.Количество = Строка.Количество;
            НоваяСтрокаНайденДокумент.Цена = Строка.Цена;
            Попытка
                НайденДокумент.Записать();
            Исключение                                                        
                Сообщить(ОписаниеОшибки());
            КонецПопытки;
        Иначе
            НовыйДокумент = Документы.ПоступлениеТоваровУслуг.СоздатьДокумент();
            НовыйДокумент.Комментарий = Комментарий;
            Номер = Строка.НомерНакладной;
            НовыйДокумент.Номер = СокрЛП(Номер);
            НовыйДокумент.Дата = Строка.ДатаНакладной;
            НовыйДокумент.Контрагент = Контрагент;
            НовыйДокумент.СкладОрдер = Склад;
            НовыйДокумент.Организация = Организация;
            СтруктураРеквизитовДокумента = Ценообразование.ПолучитьСтруктуруРеквизитовДокументаДляЦенообразования(НовыйДокумент);
            
            НоваяСтрока = НовыйДокумент.Товары.Добавить();
            НоменклатураПоискПоНаименованию = Справочники.Номенклатура.НайтиПоНаименованию(строка.Номенклатура);
            
            Если НоменклатураПоискПоНаименованию = Справочники.Номенклатура.ПустаяСсылка() Тогда
                НоменклатураПоискПоНаименованию = СоздатьНоменклатуру(строка.Артикул, строка.Номенклатура, ГруппаТоваровНов);
                НоменклатураПоискПоНаименованию = НоменклатураПоискПоНаименованию.Ссылка;    
            КонецЕсли;
            
            НоваяСтрока.ЕдиницаИзмерения = НоменклатураПоискПоНаименованию.БазоваяЕдиницаИзмерения;
            НоваяСтрока.Номенклатура = НоменклатураПоискПоНаименованию;
            НоваяСтрока.Количество = Строка.Количество;
            НоваяСтрока.Цена = Строка.Цена;
            НоваяСтрока.Сумма = Строка.Цена * Строка.Количество;

        КонецЕсли;
        Попытка
            НовыйДокумент.Записать();
        Исключение
            Сообщить(ОписаниеОшибки());
            КонецПопытки;

        КонецЦикла;
Но при поиске документа в строке: ПоискДокумента = Документы.ПоступлениеТоваровУслуг.НайтиПоНомеру(Строка.НомерНакладной); по отладчику например номер 172, а в строке когда мы создаем документ попадает "172     ", и вот этот пробел никак не убрать, СокрП пробовал, все равно, и в итоге в уже созданный документ не пишутся новые данные, почему?
1 m-serg74
 
25.10.13
13:42
/по отладчику например номер 172, а в строке когда мы создаем документ попадает "172     ",/

Строка.НомерНакладной - здесь кто - Строка или Число?
2 Wobland
 
25.10.13
13:42
искать документы по номеру принято в каком-то периоде
3 m-serg74
 
25.10.13
13:43
+ (1) и зачем для каждой строки каждый раз искать документ?
4 Валидатор
 
25.10.13
13:45
(3) потому что в тхт файле миллион позиций номенклатурных, и у каждой из них есть номер накладной, то есть
Ванна     172
Шторы     172
унитаз    173
ванна и шторы должны в 1 документ сохраниться, а унитаз в другой
(1) Число
5 m-serg74
 
25.10.13
13:46
отсортировать по номеру документа не предлагать?
6 m-serg74
 
25.10.13
13:48
(4) /(1) Число/
тогда не знаю почему так... по идее нулями спереди должна платХорма сама добивать...
7 Валидатор
 
25.10.13
13:48
(5) вряд ли, просто первый документ создается с номером:
"172     ", а когда идет поиск по документу, ищется документ "172" а не "172    ", и почему то при создании документа, даже если использовать функцию по обрезанию пробелов по бокам, он все равно создастся как "172    " вот нахрена эти пробелы в номер подставляются?
8 George Wheels
 
25.10.13
13:48
Видимо у документа тип кода Строка, а ты пытаешься указать число для поиска по номеру.
9 Михаил Козлов
 
25.10.13
13:49
(4) Сформируйте дерево при загрузке, или получите разные номера накладных и ТЗ.НайтиСтроки.
10 Валидатор
 
25.10.13
13:49
(8) строковый тип тоже пробовал, все равно тоже самое
11 m-serg74
 
25.10.13
13:49
(4) погоди!!! вот оно
/НовыйДокумент.Номер = СокрЛП(Номер);/

не надо его к строке преобразовывать
12 m-serg74
 
25.10.13
13:50
пиши число, платформа за тебя все сама сделает как надо
13 Валидатор
 
25.10.13
13:51
(12) я грузил из тхт файла в мою ТЗ номер этот с типом число. И потом при создании документа пишу:
для каждого .... цикл
НовйыДокумент = ... создать ..
НовйДокумент = Строка.Номер;
и не прокатывает
14 m-serg74
 
25.10.13
13:51
(13) я вижу что ты строку пишешь
15 Валидатор
 
25.10.13
13:52
Пока Стр <> Неопределено Цикл
        МассивСтрок = ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок(Стр,"¦");
        НоваяТЗ = ТаблицаЗначений.Добавить();
        Артикул = МассивСтрок[0];
        НоваяТЗ.Артикул = СокрЛП(Артикул);
        Номенклатура = МассивСтрок[1];
        НоваяТЗ.Номенклатура = СокрЛП(Номенклатура);
        ГТД = МассивСтрок[2];
        НоваяТЗ.ГТД = СокрЛП(ГТД);
        СтранаПроисхождения = МассивСтрок[3];
        НоваяТЗ.СтранаПроисхождения = СокрЛП(СтранаПроисхождения);
        ДатаНакладной = МассивСтрок[6];  
        ДатаНакладной = ПолучитьДатуИзСтроки(ДатаНакладной);
        НоваяТЗ.ДатаНакладной = ДатаНакладной;
        НомерНакладной = МассивСтрок[7];
        НоваяТЗ.НомерНакладной = СокрЛП(НомерНакладной);
        Импортер = МассивСтрок[8];
        НоваяТЗ.Импортер = СокрЛП(Импортер);
        Количество = МассивСтрок[9];
        НоваяТЗ.Количество = СокрЛП(Количество);
        Цена = МассивСтрок[10];
        НоваяТЗ.Цена = СокрЛП(Цена);
        Стр = Текст.ПрочитатьСтроку();
        Если ТипЗнч(Стр) = Неопределено Тогда
            Продолжить;    
        КонецЕсли;
    КонецЦикла;

вот загрузка на стадии заполнения ТЗ из тхт файла
16 Валидатор
 
25.10.13
13:52
НоваяТЗ.НомерНакладной = НомерНакладной
вот так только теперь
17 m-serg74
 
25.10.13
13:53
НоваяТЗ.НомерНакладной = СокрЛП(НомерНакладной);

после СокрЛП даже если б там число было свелось бы к строковому типу
18 m-serg74
 
25.10.13
13:54
НоваяТЗ.НомерНакладной = Число(НомерНакладной )
19 Валидатор
 
25.10.13
13:59
(18) сделал так, все равно не пишет нормально номер, а так же "172    "
20 m-serg74
 
25.10.13
14:29
(19) значит так сделай:

Док.Номер = Формат(Число(НомерНакладной), "ЧЦ=" + СокрЛП(Метаданные.Документы.РеализацияТоваровУслуг.ДлинаНомера) + "; ЧВН=; ЧГ=");
21 m-serg74
 
25.10.13
14:31
Метаданные.Документы.РеализацияТоваровУслуг.ДлинаНомера

у тебя ПоступлениеТоваровУслуг
22 m-serg74
 
25.10.13
14:33
(19) а чтоб находился Дату Интервала поиска по номеру как сказал Wobland , нужно обязательно указывать, а если не хочешь то искать запросом например
Компьютер — устройство, разработанное для ускорения и автоматизации человеческих ошибок.