Имя: Пароль:
1C
1С v8
Загрузка данных из ПТИУ в тхт файл 1с 8.2 комплексная
0 Валидатор
 
07.11.13
10:47
Нужно сделать загрузку данных из документа поступление товаров и услуг в тхт файл. Написал запрос, выгрузил нужные данные в ТЗ. Потом прохожусь по этой тз и записываю данные в файл, разделителя в файле нет. Но возникает проблема, нужно чтобы при загрузке данных длина первого поля была 10 символов (поле артикул), а если в 1ске самой поле артикул более 10 символов, то обрезать, если короче, то добавлять пробелы, как это сделать?
// файл в формате Unicode
Текст = Новый ЗаписьТекста(ПутьКФайлу, "cp866");
// перебор элементов документа
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
               |    ПоступлениеТоваровУслугТовары.Количество,
               |    ПоступлениеТоваровУслугТовары.Цена,
               |    ПоступлениеТоваровУслугТовары.Номенклатура.Артикул КАК Артикул,
               |    ПоступлениеТоваровУслугТовары.Ссылка.Номер КАК НомерНакладной,
               |    ПоступлениеТоваровУслугТовары.Ссылка.Дата КАК ДатаНакладной
               |ИЗ
               |    Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары
               |ГДЕ
               |    ПоступлениеТоваровУслугТовары.Ссылка.Ссылка = &Ссылка";

Запрос.УстановитьПараметр("Ссылка", СсылкаНаОбъект);
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
  // выводим в файл код и наименование, разделенные
  // каким-либо разделителем
  Текст.ЗаписатьСтроку(""+Выборка.Артикул+""+Выборка.ДатаНакладной +""+ Выборка.НомерНакладной +""+Выборка.Количество+""+Выборка.Цена+""+"Конверт");
КонецЦикла;
// запись в текстовый файл
Текст.Закрыть();
Сообщить("Данные были перенесены в файл");
КонецПроцедуры
1 Валидатор
 
07.11.13
10:48
точнее никаких ТЗ, просто выборкой по запросу прохожусь
2 Cube
 
07.11.13
10:51
ВЫРАЗИТЬ(ПоступлениеТоваровУслугТовары.Номенклатура.Артикул КАК СТРОКА(10)) КАК Артикул,
3 Валидатор
 
07.11.13
10:53
(2) а такой же вопрос с датой, у меня грузится дата документа, но формат выгрузки такой: 01.01.01 00:00:00 и т.д., а нужно чтобы выгружалась так: 01/01/01
4 Валидатор
 
07.11.13
10:54
(3) - в самом запросе всмысле как так указать?
5 Cube
 
07.11.13
10:55
(4) Да
(3) Это уже не в запросе надо делать. Кури функцию Формат()
6 Валидатор
 
07.11.13
10:57
(5) про функцию формат я знаю, так и думал сделать, но хотел указать в запросе. Вопрос к (2) мы указалаи что артикул 10 символов, а если у меня артикул 5 символов, мне еще 5 элементов нужно пробелами забить, как это сделать?
7 Cube
 
07.11.13
10:58
(6) "как это сделать?"
Ты удивишься, но ВЫРАЗИТЬ() это сделает сама... :)
8 Валидатор
 
07.11.13
10:59
(7) при загрузке в файл я вижу что у меня артикул 5 символов в тхт файле, и потом нет еще 5 пробелов в нем вот и спрашиваю
9 Cube
 
07.11.13
11:01
(8) Принято говорить "Выгружаю в файл" и "Загружаю из файла".
10 Cube
 
07.11.13
11:03
(7) Ой, что-то я погорячился...
11 Валидатор
 
07.11.13
11:03
(9) Когда я Выгружаю в файл, номенклатура с артикулом 78345 получается в таком виде:
7834501012013-//-
где 01012013 это уже дата, то есть следующее поле, а нужно так:
78345     01012013 (пробел между 78345 и датой должен заполнять пустыми пробелами до количества в 10 символов) вот про что я спрашиваю :)
12 Cube
 
07.11.13
11:04
+(7) Сделай так:

ВЫРАЗИТЬ(ПоступлениеТоваровУслугТовары.Номенклатура.Артикул + "          " КАК СТРОКА(10)) КАК Артикул,
13 Валидатор
 
07.11.13
11:04
(12) там 5 пробелов в " "?
14 Cube
 
07.11.13
11:05
(13) Десять. Ведь если артикул пустой, то должно быть десять нулей-то...
15 Валидатор
 
07.11.13
11:05
Артикул может содержать 10 символов, может 5, может 4, но при выгрузке он должен занимать 10 символов, если функция выразить обрежет его после 10 символа это понятно, то вот как с недостающим количеством символов до 10 от начала артикула не совсем понятно((
16 Cube
 
07.11.13
11:07
(15) Ответ в (12)
17 Валидатор
 
07.11.13
11:08
(14) ага, да, вроде нормально теперь стало, с артикулами понятно, теперь мини вопрос по функции формат, касаемо выгрузки даты, пишу так:
Формат(Выборка.ДатаНакладной, "dd/MM/yy")
но дату он мне не выдает через /, а по прежнему пишет через точку
18 Cube
 
07.11.13
11:10
(17) На "dd/MM/yy" нажми ПКМ -> "Конструктор форматной строки" -> Закладка "Дата".
19 Cube
 
07.11.13
11:11
+(18) Ты "ДФ=" забыл.
20 Валидатор
 
07.11.13
11:12
(16) для строковых типов понятно с пробелами через выразить, можно ли так же сделать для числовых?
ВЫРАЗИТЬ(ПоступлениеТоваровУслугТовары.Цена КАК ЧИСЛО(14, 0))
вот после цены нельзя же тут ввести -//-.Цена + "             " Как число(14,0)?
21 Cube
 
07.11.13
11:16
(20) Нет, для числа в запросе так сделать нельзя. Обрабатывай в коде. Тебе нули надо спереди от числа или сзади?
22 Валидатор
 
07.11.13
11:17
(21) только в конце, длина цены - 14 символов
23 Валидатор
 
07.11.13
11:21
(21) и количество так же, только количество символов другое, понять бы как для одного из этих полей сделать, остальные то там так же)
24 Cube
 
07.11.13
11:26
(22) (23) Да просто напиши функцию, которая дополняет строку нулями до нужно длины и во всех полях её юзай. В чем проблема-то? Не оптимально, конечно, но у тебя и формат обмена не фонтан... :)
25 Валидатор
 
07.11.13
11:27
(24) блин, как все сложно((
26 Cube
 
07.11.13
11:30
(25) Да что сложного?

Вот функция из типовой ЗиУП:

// Дополняет строку символами слева или справа до заданной длины и возвращает ее.
// Незначащие символы слева и справа удаляются. По умолчанию функция дополняет строку символами "0" (ноль) слева.
//
// Параметры:
//  Строка      - Строка - исходная строка, которую необходимо дополнить символами;
//  ДлинаСтроки - Число  - требуемая результирующая длина строки;
//  Символ      - Строка - символ, которым необходимо дополнить строку;
//  Режим       - Строка - "Слева" или "Справа" - режим добавления символов к исходной строке.
//
// Возвращаемое значение:
//  Строка - строка, дополненная символами.
//
// Пример 1:
// Строка = "1234"; ДлинаСтроки = 10; Символ = "0"; Режим = "Слева"
// Возврат: "0000001234"
//
// Пример 2:
// Строка = " 1234  "; ДлинаСтроки = 10; Символ = "#"; Режим = "Справа"
// Возврат: "1234######"
//
Функция ДополнитьСтроку(Знач Строка, Знач ДлинаСтроки, Знач Символ = "0", Знач Режим = "Слева") Экспорт
    
    // длина символа не должна превышать единицы
    Символ = Лев(Символ, 1);
    
    // удаляем крайние пробелы слева и справа строки
    Строка = СокрЛП(Строка);
    
    КоличествоСимволовНадоДобавить = ДлинаСтроки - СтрДлина(Строка);
    
    Если КоличествоСимволовНадоДобавить > 0 Тогда
        
        СтрокаДляДобавления = СформироватьСтрокуСимволов(Символ, КоличествоСимволовНадоДобавить);
        
        Если ВРег(Режим) = "СЛЕВА" Тогда
            
            Строка = СтрокаДляДобавления + Строка;
            
        ИначеЕсли ВРег(Режим) = "СПРАВА" Тогда
            
            Строка = Строка + СтрокаДляДобавления;
            
        КонецЕсли;
        
    КонецЕсли;
    
    Возврат Строка;
    
КонецФункции
27 Валидатор
 
07.11.13
11:36
(26) и потом при заполнении тхт файла ее вызывать так?
28 Cube
 
07.11.13
11:42
(27) Ну да.
29 Валидатор
 
07.11.13
11:45
(28) ясно, спасибо)