7.7 Выгрузка в файл

Тема в разделе "Отчеты и обработки для "1С:Предприятие 7.7"", создана пользователем Mans, 15 окт 2009.

  1. TopicStarter Overlay
    Mans
    Offline

    Mans

    Регистрация:
    5 окт 2009
    Сообщения:
    40
    Симпатии:
    0
    Баллы:
    1
    С помощью следующего кода:
    Код:
    Процедура НачатьЭкспорт()
    ТЗ = СоздатьОбъект ("ТаблицаЗначений");
    ТЗ.НоваяКолонка ("Код","Число",,,"Код1",,1);
    ТЗ.НоваяКолонка ("Имя","Строка",,,"Имя1",,2);
    ТЗ.НоваяКолонка ("Дата","Дата",,,"Дата1",,);
    
    ТЗ.НоваяСтрока();
    ТЗ.Код = 001;
    ТЗ.Имя = "Компания1 ООО"; 
    ТЗ.Дата = "03.08.1987"; 
    
    ТЗ.НоваяСтрока();
    ТЗ.Код = 002;
    ТЗ.Имя = "Компания2 ЧП"; 
    ТЗ.Дата = "01.12.2003"; 
    
    ТЗ.НоваяСтрока();
    ТЗ.Код = 103;
    ТЗ.Имя = "Компания3 ОАО"; 
    ТЗ.Дата = "23.03.2007"; 	
    
    ЗначениеВФайл("Z:\test.txt",ТЗ,0);
    
    КонецПроцедуры
    
    получаю файл, который содержит:
    Код:
    {"ТаблицаЗначений","2",{"0","","0","0","0","","2",{{"Код","Код1","1","0","0",{"Число","0"},"1","2",{{"Число","1"},{"Число","2"},{"Число","103"}}},{"Имя","Имя1","1","0","1",{"Строка",""},"2","0",{{"Строка","Компания1 ООО"},{"Строка","Компания2 ЧП"},{"Строка","Компания3 ОАО"}}},{"Дата","Дата1","1","0","2",{"Дата","        "},"","0",{{"Дата","19870803"},{"Дата","20031201"},{"Дата","20070323"}}}}}}
    
    Не могли бы мне пожалуйста подсказать, какие параметры за что отвечают? С полями - Код, Имя и Дата я разобрался, а вот с остальными значениями как то не особо.
  2. lazy
    Offline

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

    Регистрация:
    1 сен 2007
    Сообщения:
    2.127
    Симпатии:
    4
    Баллы:
    29
    Не заморачивайтесь с разбором файла самостоятельно. Используйте функцию ЗначениеИзФайла();
  3. TopicStarter Overlay
    Mans
    Offline

    Mans

    Регистрация:
    5 окт 2009
    Сообщения:
    40
    Симпатии:
    0
    Баллы:
    1
    Я бы с удовольствием так и сделал, но данные необходимо импортировать с другую программу...
  4. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    А не проще ли в таком случае использовать объект типа ТЕКСТ и импортировать в каком тебе нужно (читай понятно) формате
  5. TopicStarter Overlay
    Mans
    Offline

    Mans

    Регистрация:
    5 окт 2009
    Сообщения:
    40
    Симпатии:
    0
    Баллы:
    1
    Я думаю тоже не вариант, мне нужно чтобы другая программа расспознала этот файл и предстваила в виде таблицы с сохранением форматов (дата, число, строка).
  6. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Так что мешает просто записать в цикле
    103
    "Компания3 ОАО"
    23.03.2007
    а ваша программа будет знать что первая строка - число, вторая - название, третья - дата
  7. TopicStarter Overlay
    Mans
    Offline

    Mans

    Регистрация:
    5 окт 2009
    Сообщения:
    40
    Симпатии:
    0
    Баллы:
    1
    Честно говоря, я не совсем понял что имелось ввиду.
  8. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    В цикле выгружай ТаблицуЗначений. Одна строка ТЗ = 3 строкам текстового файла. Что тут непонятного?
  9. KishMish
    Offline

    KishMish

    Регистрация:
    16 окт 2009
    Сообщения:
    6
    Симпатии:
    0
    Баллы:
    1
    Используй вот этот код. тут идедт выгрузка таблицы знаечний, в то числе и многоуровневых.
    Выгрузка в файл как тебе надо.

    Обрабатываемые значения ячеек Строка, МногСтрочная строка, Число, Дата, СписокЗначений, Таблица значений
    ACR_ЧСДСТ_ВСтроку - функция формирует из значения многострочную строку. Ее просто надо добавить в текст как строку.
    На входе можгут быть Строка, МногСтрочная строка, Число, Дата, СписокЗначений, Таблица значений
    Название не меняй так как в случае значения ячейки Таблицы и Списка значений идет рекурсивный вызов самой этой функции

    ACR_ЧСДСТ_ИзСтроки - функция формирует из полученной строки значение (таблицу, список значений или другое)
    Код этой функции легко трансфорировать в любой другой язык программирования.

    (смесь английского и русского языков специально чтобы у тебя в тексте гарантировано не было функции или переменной с подобным названием)

    Работает медленнее чем стандартная выгрузка ЗначениеВФайл,
    но готовый файл меньшего размера.
    если чего пиши ancorecords(собака)mail.ru
    Удачи


    Код:
    Функция ACR_ЧСДСТ_ВСтроку(Передача,ПредупреждатьОНепрдусмотренныхЗначениях=0) //ЗначениеВстроку....
    Р=РазделительСтрок;
    Тип=ТипЗначенияСтр(Передача);
    Если Тип="СписокЗначений"
    Тогда
    Стр="ACR#СписокЗначений#";
    КолвоСтрок=Передача.РазмерСписка();
    
    Стр=Стр+Р+КолвоСтрок;
    Стр=Стр+Р+"-----------------------";
    Для Атом=1 по КолвоСтрок Цикл
    Описание="";
    Зна=Передача.ПолучитьЗначение(Атом,Описание);
    Стр=Стр+Р+ACR_ЧСДСТ_ВСтроку(Зна)+Р+Описание;			
    КонецЦикла;	
    Возврат (Стр);		
    ИначеЕсли Тип="ТаблицаЗначений"
    Тогда
    Стр="ACR#ТаблицаЗначений#";	
    КолвоСтрок=Передача.КоличествоСтрок();
    КолвоКолонок=Передача.КоличествоКолонок();
    Стр=Стр+Р+КолвоСтрок+Р+КолвоКолонок+Р+"-----------------------";
    //Как=1;
    //Передача.ВыбратьСтроку(Как);
    Для Бутон=1 По КолвоКолонок Цикл
    Тип="";Длина=0;Точность=0;Заголовок="";Ширина="";Форматт="";Положение=0;
    Стр=Стр+Р+Передача.ПолучитьПараметрыКолонки(Бутон,Тип,Длина,Точность,Заголовок,Ширина,Форматт,Положение);	
    Стр=Стр+Р+Тип+Р+Длина+Р+Точность+Р+Заголовок+Р+Ширина+Р+Форматт+Р+Положение;			
    КонецЦикла;
    //Сообщить(Стр);
    Стр=Стр+Р+"-----------------------";
    Для Атом=1 По КолвоСтрок Цикл
    Для Бутон=1 По КолвоКолонок Цикл 
    Стр=Стр+Р+ACR_ЧСДСТ_ВСтроку(Передача.ПолучитьЗначение(Атом,Бутон));
    КонецЦикла;
    КонецЦикла;		
    Возврат(Стр);
    ИначеЕсли Найти("Число,Дата",Тип)>0
    Тогда Возврат(Передача);
    ИначеЕсли Тип="Строка"
    Тогда 
    КолвоСтрок=СтрКоличествоСтрок(Передача);
    Если КолвоСтрок=1
    Тогда Возврат (Передача);
    Иначе Возврат("ACR#Многострочный#"+Р+КолвоСтрок+Р+"-----------------------"+Р+Передача);
    КонецЕсли;
    
    Иначе 
    Если ПредупреждатьОНепрдусмотренныхЗначениях=1
    Тогда Сообщить("Список значений содержит непредусмотренный тип "+Тип+". Он приравняется к строке!");
    КонецЕсли;
    Возврат(Передача);
    КонецЕсли;	
    КонецФункции 
    
    //======================================================================
    Функция ACR_ЧСДСТ_ИзСтроки(Передача,НомСтр=1) //значение изс троки
    Стр=СтрПолучитьСтроку(Передача,НомСтр);
    
    Если Стр="ACR#СписокЗначений#"
    Тогда 
    Резулт=СоздатьОбъект("СписокЗначений");
    НомСтр=НомСтр+1;
    КолвоСтрок=Число(СтрПолучитьСтроку(Передача,НомСтр));
    НомСтр=НомСтр+1; //разделитель
    Для Атом=1 По КолвоСтрок <span style='cursor: pointer; color:red' Onclick="window.open('http://www.1c-pro.ru/wiki/index.php/цикл')">Цикл			</span>
    НомСтр=НомСтр+1; Зна=ACR_ЧСДСТ_ИзСтроки(Передача,НомСтр);
    НомСтр=НомСтр+1; Описание=ACR_ЧСДСТ_ИзСтроки(Передача,НомСтр);			
    Резулт.ДобавитьЗначение(Зна,Описание);			
    КонецЦикла;	
    Возврат (Резулт);
    ИначеЕсли Стр="ACR#ТаблицаЗначений#"
    Тогда
    НомСтр=НомСтр+1;
    КолвоСтрок=Число(СтрПолучитьСтроку(Передача,НомСтр));
    
    НомСтр=НомСтр+1;
    КолвоКолонок=Число(СтрПолучитьСтроку(Передача,НомСтр));
    
    НомСтр=НомСтр+1; //разделитель
    Резулт=СоздатьОбъект("ТаблицаЗначений");
    Для Атом=1 По КолвоКолонок  Цикл
    Резулт.НоваяКолонка(СтрПолучитьСтроку(Передача,НомСтр+1),СтрПолучитьСтроку(Передача,НомСтр+2),СтрПолучитьСтроку(Передача,НомСтр+3),
    СтрПолучитьСтроку(Передача,НомСтр+4),СтрПолучитьСтроку(Передача,НомСтр+5),СтрПолучитьСтроку(Передача,НомСтр+6),
    СтрПолучитьСтроку(Передача,НомСтр+7),СтрПолучитьСтроку(Передача,НомСтр+8));
    НомСтр=НомСтр+8;
    КонецЦикла;	
    НомСтр=НомСтр+1; //разделитель	
    Как=1;
    
    Для Атом=1 По КолвоСтрок Цикл
    Резулт.НоваяСтрока();
    Для Бутон=1 По КолвоКолонок Цикл
    НомСтр=НомСтр+1;
    Резулт.УстановитьЗначение(Атом,Бутон,ACR_ЧСДСТ_ИзСтроки(Передача,НомСтр));
    Состояние(""+(Атом*(КолвоКолонок-1)+Бутон)+" из "+(КолвоСтрок*КолвоКолонок));
    КонецЦикла;
    КонецЦикла;
    Как=1; Резулт.ВыбратьСтроку(Как);
    Возврат(Резулт);
    ИначеЕсли Стр="ACR#Многострочный#"
    Тогда
    Стр="";
    НомСтр=НомСтр+1;
    КолвоСтрок=Число(СтрПолучитьСтроку(Передача,НомСтр));
    НомСтр=НомСтр+1; //разделитель
    Для Атом=1 по КолвоСтрок Цикл
    НомСтр=НомСтр+1;
    Стр=Стр+СтрПолучитьСтроку(Передача,НомСтр)+?(Атом=КолвоСтрок,"","" "");
    КонецЦикла;
    Возврат (Стр);
    Иначе
    Возврат(Стр);	
    КонецЕсли;		
    КонецФункции // ACR_ЧИ_СТ_ДА_СЗ_ТЗ_Из_Строку
    
    
    Процедура Сформировать()
    
    //Это сохранение....
    Табля=СоздатьОбъект("ТаблицаЗначений");
    Стек=СоздатьОбъект("Текст");
    ПолучаемаяСтрока=ACR_ЧСДСТ_ВСтроку(Табля,1);//// Табля твоя таблица....
    Стек.ДобавитьСтроку(ПолучаемаяСтрока);
    //Стек.Показать();
    
    //Это загрузка....
    
    Состояние("Загружаем текст...");
    КолвоСтрок=Стек.КоличествоСтрок();
    Для Атом=1 по КолвоСтрок Цикл
    Состояние(Атом);
    СтрокаСтек=СтрокаСтек+Стек.ПолучитьСтроку(Атом)+?(СтрокаСтек=КолвоСтрок,"","" "");
    КонецЦикла;
    Состояние("Загружаем таблицу...");
    Табло=ACR_ЧСДСТ_ИзСтроки(СтрокаСтек);
    
    Как=0;
    Табло.ВыбратьСтроку(Как);
    КонецПроцедуры //
    
    
  10. TopicStarter Overlay
    Mans
    Offline

    Mans

    Регистрация:
    5 окт 2009
    Сообщения:
    40
    Симпатии:
    0
    Баллы:
    1
    Решил сделать как все советуют, т.е. ручной перебор строк Таблицы значений и столкнулся с такой вот проблемкой. Подскажите что не так?

    Код:
    	ТЗ = СоздатьОбъект ("ТаблицаЗначений");
    ТЗ.НоваяКолонка ("Код","Число",,,"Код1",,1);
    ТЗ.НоваяКолонка ("Имя","Строка",,,"Имя1",,2);
    ТЗ.НоваяКолонка ("Дата","Дата",,,"Дата1",,);
    
    ТЗ.НоваяСтрока();
    ТЗ.Код = 001;
    ТЗ.Имя = "Компания1 ООО"; 
    ТЗ.Дата = "03.08.1987"; 
    
    ТЗ.НоваяСтрока();
    ТЗ.Код = 002;
    ТЗ.Имя = "Компания2 ЧП"; 
    ТЗ.Дата = "01.12.2003"; 
    
    ТЗ.НоваяСтрока();
    ТЗ.Код = 103;
    ТЗ.Имя = "Компания3 ОАО"; 
    ТЗ.Дата = "23.03.2007"; 
    
    ТД = СоздатьОбъект("Текст");
    ТЗ.ВыбратьСтроки();
    Пока ТЗ.ПолучитьСтроку() = 1 Цикл
    ТД.ДобавитьСтроку(Число(ТЗ.Код) + ";" + Строка(ТЗ.Имя) + ";" + Дата(ТЗ.Дата));
    КонецЦикла;
    ТД.Записать("Z:\test.txt");
    
    В результате получаю файл с таким содержимым:
    Код:
    2454286
    2452977
    2447012
    
  11. WaRDeR
    Offline

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

    Регистрация:
    23 ноя 2006
    Сообщения:
    3.263
    Симпатии:
    14
    Баллы:
    29
    Проблема в смешанных типах.

    сделай так
    Код:
    ТД.ДобавитьСтроку("" + Число(ТЗ.Код) + ";" + Строка(ТЗ.Имя) + ";" + Дата(ТЗ.Дата));
    
  12. TopicStarter Overlay
    Mans
    Offline

    Mans

    Регистрация:
    5 окт 2009
    Сообщения:
    40
    Симпатии:
    0
    Баллы:
    1
    Спасибо, щас буду со всем разбираться... :)
  13. TopicStarter Overlay
    Mans
    Offline

    Mans

    Регистрация:
    5 окт 2009
    Сообщения:
    40
    Симпатии:
    0
    Баллы:
    1
    К сожалению, необходимо использовать стандартную функцию "ЗначениеВФайл" (желание заказчика). Так может мне кто-нибудь рассказать про выходной файл, какие значени - что означают?
  14. KishMish
    Offline

    KishMish

    Регистрация:
    16 окт 2009
    Сообщения:
    6
    Симпатии:
    0
    Баллы:
    1
    { } - это разделители....
    рассмотри их как скобки, будет понятно, при загрузке тебе все равно придется бегать от { до }
    Описание таблица значений идет так
    Первая колонка первая строка
    ПЕрвая колонка вторая строка и т.д... до конца

    {"ТаблицаЗначений","2",
    {"0","","0","0","0","","2",
    {
    {"Код","Код1","1","0","0",
    {"Число","0"},"1","2",
    { // ячейки первой колонки
    {"Число","1"}
    ,{"Число","2"},
    {"Число","103"}}},
    {"Имя","Имя1","1","0","1",
    {"Строка",""},"2","0",
    { // ячейки второй колонки
    {"Строка","Компания1 ООО"},
    {"Строка","Компания2 ЧП"},
    {"Строка","Компания3 ОАО"}}},
    {"Дата","Дата1","1","0","2",
    {"Дата"," "},"","0",
    {{"Дата","19870803"},
    {"Дата","20031201"},
    {"Дата","20070323"}
    }}}}}

    и еще...
    Заказчик хочет получить результат "чтобы данные выгружались и загружались", или он хочет именно "вот такой код через жопу"? Намного проще объяснить целесообразность применения иного подхода к выгрузке чем выполнять бессмысленную работу по поиску фигурных скобок. Только конечно, если в языке lua нет спциальных утилит разборки подобных массивов данных на составляющие....
    удачи
  15. TopicStarter Overlay
    Mans
    Offline

    Mans

    Регистрация:
    5 окт 2009
    Сообщения:
    40
    Симпатии:
    0
    Баллы:
    1
    Как рассматривать строки я уже разобрался. Действительно было удобно использовать счетчик открытых и закрытых фигурных скобок. Предлагать иной подход выгрузки файла пробовал, но заказчику нужнен именно такой способ.

    Но мне больше хотелось бы знать, что означает каждый символ в строке (т.е. какой по счету символ за какой параметр отвчает).

    Ну например что означают вот эти нули, двойки и т.д.
    Код:
    {"ТаблицаЗначений","2",
    {"0","","0","0","0","","2",
    {
    
  16. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Могу посоветовать "поиграть" с
    Код:
    ЗначениеВСтрокуВнутр
    
    
    Подсовывайте ей данные - проще будет разобраться
  17. WaRDeR
    Offline

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

    Регистрация:
    23 ноя 2006
    Сообщения:
    3.263
    Симпатии:
    14
    Баллы:
    29
    Дело в том, что этим "нормальные" люди не занимаются. Там будут значения типа, длины, точности, описания и пр.

    Если тебе нужны конкретные значения - то вычисли их позиции по меняющимся данным при смене исходных....

    Если этого мало - то экспериментируй, за тебя это делать никто не будет. Либо напиши в 1С, может расскажут :)))

    Ваш заказчик - извращенец, если ему надо ИМЕННО в таком виде - то у него и спроси, что стоит в каком поле.

    Неужели сложно встретиться и "придумать" формат файла, который можно собрать в 1С и загрузить туда, куда ему надо?

    Считаю, что если нет других вопросов, связанных с данной тематикой, то ветку можно закрывать.
  18. TopicStarter Overlay
    Mans
    Offline

    Mans

    Регистрация:
    5 окт 2009
    Сообщения:
    40
    Симпатии:
    0
    Баллы:
    1
    Мда, видимо и вправду придется подсовывать разные значения и вычислять какое значение за что отвечает. Просто думал может кто сталкивался с этим и уже знает...
    Ну ладно, как разберусь, сразу выложу описание. На случай, если найдутся ещё такие "извращенцы" как я! :)
  19. KishMish
    Offline

    KishMish

    Регистрация:
    16 окт 2009
    Сообщения:
    6
    Симпатии:
    0
    Баллы:
    1
    {"ТаблицаЗначений","2",
    {"0","","0","0","0","","2",

    Это всегда есть, даже если сохранять Табл значений без строк и столбцов
    скорее всего это отражение внутреннего представления
    типа "ТаблциаЗначений второго типа"....

    Таблица значения появилась только в 7.7
    7.5 ее кажися не было, хотя память м еня может подводить )))
    Может это как то тебе поможет...
    Кароч для выгрузки загрузки эти строки тебе не нужны

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