Имя: Пароль:
1C
1С v8
Как разбить Таблицу значений на несколько частей?
0 mila1231
 
26.03.19
07:54
Есть обычное приложение, дальше в функции запрос, результат записываю в таблицу значений и её же возвращаю. А дальше её нужно разбить на несколько.Как это можно сделать? Как я понимаю, через цикл, но я же не знаю конечное число ТаблицЗначений.
Вообще задача состоит в том, чтоб брать данные из запроса, а дальше записывать в файл, при этом файл не должен содержать более 100 строк. Возможно какое-то другое решение должно быть. Заранее спасибо за подсказки.
1 ДенисЧ
 
26.03.19
07:56
а в чём проблема?
Цикл, проверка на количество строк прочитанных, запись файла, открытие нового...
И не забыть после цикла закрыть...
2 mila1231
 
26.03.19
08:05
Я не могу сообразить, как цикл сделать Вот функция записи
       кодировка = КодировкаТекста.ANSI;
    ТекстовыйФайлЗапись = Новый ТекстовыйДокумент;
    
        Для  НачальныйИндекс По КонечныйИндекс Цикл
             ТекстовыйФайлЗапись.ДобавитьСтроку(текст);
        КонецЦикла;
    //ТекстовыйФайлЗапись.ДобавитьСтроку(текст);
    ТекстовыйФайлЗапись.Записать(имяфайла, Кодировка);
    ТекстовыйФайлЗапись.закрыть();
    Возврат 0;
я не могу сообразить, какой должен быть начальный и конечный индексы..то ли я такая то ли день такой....
3 Aleksey
 
26.03.19
08:17
(2) И что этот код рабочий? Я имею ввиду цикл.
4 SleepyHead
 
гуру
26.03.19
08:19
(0) Не надо таблицы значений разбивать вообще. В цикле сделай счетчик и как только он перевалит за 100, закрывай текущий файл и открывай новый, а счетчик сбрасывай в ноль.
5 Aleksey
 
26.03.19
08:30
Для  й=НачальныйИндекс По КонечныйИндекс Цикл
   Если й % 100 = 0 тогда
       //новый док
       Если ТекстовыйДокумент.КоличествоСтрок() > 0 тогда
          ТекстовыйФайлЗапись.Записать(имяфайла, Кодировка);
       КонецЕсли;
       ТекстовыйФайлЗапись = Новый ТекстовыйДокумент;
   КонецЕсли;
   ТекстовыйФайлЗапись.ДобавитьСтроку(текст);
КонецЦикла;
Если ТекстовыйДокумент.КоличествоСтрок() > 0 тогда
   ТекстовыйФайлЗапись.Записать(имяфайла, Кодировка);
КонецЕсли;
6 mila1231
 
26.03.19
11:19
Если кто разъжует, я рада буду, потому ка как поняла я и гугл ничего мне подходящего не выдаёт . Вот та самая функция, которая ничего не делит и она работает.Сюда передаётся, Та самая таблицазначений = текст и имя файла, оно уже по команде формируется.
/////////
Функция ЗаписатьCSV(текст,имяФайла)              
    кодировка = КодировкаТекста.ANSI;
    ТекстовыйФайлЗапись = Новый ТекстовыйДокумент;
    ТекстовыйФайлЗапись.ДобавитьСтроку(текст);
    ТекстовыйФайлЗапись.Записать(имяфайла, Кодировка);
    ТекстовыйФайлЗапись.закрыть();
    Возврат 0;
конецФункции
//////////
Теперь по циклу. Как я понимаю, я должна поставить цикл, который считает строки моего Текстового документа. Т.е внешний вид что-то типа такого?
Для Индекс = 1 по ТекстовыйФалкЗапись.КоличествоСтрок() Цикл
     Если ТекстовыйФалкЗапись.КоличествоСтрок() = 100 тогда
          ТекстовыйФайлЗапись.ДобавитьСтроку(текст);
          ТекстовыйФайлЗапись.Записать(имяфайла, Кодировка);
     конецЕсли;  
     ТекстовыйФайлЗапись.закрыть();
конецЦикла
7 sqr4
 
26.03.19
11:24
Фото!
8 mila1231
 
26.03.19
11:33
да я себя уже сама по интеллекту на год чувствую.
9 sqr4
 
26.03.19
12:02
Лан, начни с постановки, что конкретно нужно сделать.
10 1Сергей
 
26.03.19
12:05
разбей код на блоки:

1. Запрос
2. Создание файла
3. обход запроса,  заполнение файла
4. Запись файла

И дальше думай, что должно выполняться в каком порядке. Что до обхода, что внутри, что после. При каких условиях что должно происходить
11 mila1231
 
26.03.19
12:56
Из всего, что получилось-это 1. создать функцию с запросом, результат записать в таблицуЗначений и соответственно эту таблицу значений вернуть.
2. Сохранение ТаблицыЗначений в файл.csv. с разбивокй по 100 строк
И тут не поехало.
12 ДенисЧ
 
26.03.19
12:58
Что именно не поехало? Вроде всё уже написали...
13 1Сергей
 
26.03.19
14:03
(11) для годовасика неплохо уже :)
14 mila1231
 
27.03.19
08:06
Я понимаю, что всё вроде и элементарно, но правда... не стала далеко ходить решила записать просто 100 строк. Возможно, я что-то не так делаю, покажите, если не трудно...
разделитель = ";";
    ТаблицаЗначений =  ПолучитьТабЗнач();  //из запроса
    текст =  СоздатьДанныеCSV(ТаблицаЗначений,разделитель);
    кодировка = КодировкаТекста.ANSI;
    НачальныйИндекс= 1;
    КонечныйИндекс = ТаблицаЗначений.Количество();
    
Для й=НачальныйИндекс по КонечныйИндекс цикл
    й=й+1;    
    ТекстовыйФайлЗапись = Новый ТекстовыйДокумент;    
Если й < 100  тогда    
     ТекстовыйФайлЗапись.ДобавитьСтроку(текст);
     ТекстовыйФайлЗапись.Записать(имяфайла, Кодировка);
конецЕсли;
    
    
КонецЦикла;

у меня в файле всё равно весь объем...
15 SleepyHead
 
гуру
27.03.19
08:12
(14) Ну так у вас такой код, который пишет весь объем файла каждый раз в каждый новый файл. Бегло просмотрел код, насчитал три логические ошибки, которые к этому приводят.
16 Йохохо
 
27.03.19
08:16
(14) тебе надо %

Арифметические операции
В языке  определены следующие виды арифметических операций:
сложение
(Оп1 + Оп2)
вычитание
(Оп1 - Оп2)
умножение
(Оп1 * Оп2)
деление
(Оп1 / Оп2)
остаток от деления
(Оп1 % Оп2)
унарный минус
(-Оп1)
17 Мыш
 
27.03.19
08:31
разделитель = ";";
ДолжноБытьСтрокВФайле = 100;
ТаблицаЗначений =  ПолучитьТабЗнач();  //из запроса
текст =  СоздатьДанныеCSV(ТаблицаЗначений,разделитель);
ВсегоСтрокТекста = СтрЧислоСтрок(текст);
кодировка = КодировкаТекста.ANSI;
НомерФайла = 0;

Для НомерСтроки=1 По ВсегоСтрокТекста Цикл
   Если НомерСтроки%ДолжноБытьСтрокВФайле=1 Тогда
      ТекстовыйФайлЗапись=Новый ТекстовыйДокумент;
   КонецЕсли;
   СтрокаТекста = СтрПолучитьСтроку(текст, НомерСтроки);
   ТекстовыйФайлЗапись.ДобавитьСтроку(СтрокаТекста);
   Если НомерСтроки%ДолжноБытьСтрокВФайле=0 Тогда
      НомерФайла = НомерФайла + 1;
      имяфайла = "КакоетоИмя"+Формат(НомерФайла, "ЧГ=")+".csv";
      ТекстовыйФайлЗапись.Записать(имяфайла, Кодировка);
   КонецЕсли;
КонецЦикла;
Если Не НомерСтроки%ДолжноБытьСтрокВФайле=0 Тогда
   НомерФайла = НомерФайла + 1;
   имяфайла = "КакоетоИмя"+Формат(НомерФайла, "ЧГ=")+".csv";
   ТекстовыйФайлЗапись.Записать(имяфайла, Кодировка);
КонецЕсли;
18 mila1231
 
28.03.19
04:26
О, спасибо, я немного по другому сделала, но ваш вариант короче)))
Выдавать глобальные идеи — это удовольствие; искать сволочные маленькие ошибки — вот настоящая работа. Фредерик Брукс-младший