Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
05 фев 2025, 15:55

Разложение строки

Автор unic65, 17 дек 2024, 15:32

0 Пользователей и 1 гость просматривают эту тему.

unic65

Добрый день, не могу понять как прописать код.
Суть вопроса: есть реестр из сбербанка по платежам физлиц, когда первые реестры приходили услуга была одна и через разделитель можно было посчитать какая по счету колонка была суммой (была 13-й), последнее время реестры начали приходить с множеством услуг, и по порядку вычислить не представляется возможным, потому что количество услуг может варьироваться от одной до четырех, но если считать справа по разделителям то это 4я колонка. Необходимо вытащить значение суммы.

Подскажите или помогите как прописать это в процедуре, сам только начинаю программировать и опыта пока мало.


ПРИМЕРЫ реестров (некоторые личные данные убраны или изменены):

Было так, и процедура прописана под данный тип реестров:
18-10-2024;02-00-56;8567;9900000V;950531399703;659875225/8;ШЕСТЮКОВА ЛЮДМИЛА ФЕДОРОВНА;092024;2;ПЛАТА ЗА СОДЕРЖАНИ;1717,90;!;;1717,90;1705,87;12,03;6;

Стало:
12-12-2024;01-23-56;8567;8567999V;256134004891;45646545456/8;ТИМАШЕНКО МАРИЯ ЕВГЕНЬЕВНА;112024;[!];2;ПЛАТА ЗА СОДЕРЖАНИЕ ЖИЛОГО ПОМЕЩЕНИЯ;2226,30;2;ЭЛЕКТРОСНАБЖЕНИЕ ДЛЯ ОДН;360,06;2;ВОДООТВЕДЕНИЕ ОДН;22,58;2;ХОЛОДНОЕ ВОДОСНАБЖЕНИЕ ДЛЯ ОДН;31,94;[!];;2640,88;2622,39;18,49;5;




Процедура ЗаполнитьТаблицу(АдресДвоичныхДанных)
   
   разделительПолей =";";
   
   текст = Новый ТекстовыйДокумент;
   Попытка
      
      ВременныйФайл = ПолучитьИмяВременногоФайла();
      ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресДвоичныхДанных);
      ДвоичныеДанные.Записать(ВременныйФайл);
      текст.Прочитать(ВременныйФайл,КодировкаТекста.ANSI);
       УдалитьФайлы(ВременныйФайл);

   Исключение
      Сообщить("Не удалось прочитать файл: "
         + ОписаниеОшибки(),СтатусСообщения.ОченьВажное);
      Возврат;
   КонецПопытки;   
   Объект.табЗагрузки.Очистить();//очищаем таблицу
   
   квоСтрок = текст.КоличествоСтрок();
   
   Если Не квоСтрок > 0 Тогда
      Сообщить("Файл пустой",СтатусСообщения.Внимание);
      Возврат;   
   КонецЕсли;
   
   табЗагрузки1 = Новый ТаблицаЗначений;
   
   //получаем первую строку с форматом файла
   стрТекста = текст.ПолучитьСтроку(1);
   //преобразуем строку в массив при помощи функции общего модуля, которая есть в типовых
   //ниже я дам её код, на случай, если нет
   масЗначСтр = РазложитьСтрокуВМассивПодстрок(стрТекста,разделительПолей);
   //добавляем две служебные колонки
   табЗагрузки1.Колонки.Добавить("номер_строки",Новый ОписаниеТипов("Число"),"Номер строки");
   
   //для возможности отказаться от загрузки определенной строки
   табЗагрузки1.Колонки.Добавить("Дата",Новый ОписаниеТипов("Строка"),"Дата");
   табЗагрузки1.Колонки.Добавить("Время",Новый ОписаниеТипов("Строка"),"Время");
    табЗагрузки1.Колонки.Добавить("Число1",Новый ОписаниеТипов("Число"),"Число1");
 табЗагрузки1.Колонки.Добавить("Число2",Новый ОписаниеТипов("Число"),"Число2");     
 табЗагрузки1.Колонки.Добавить("Число7",Новый ОписаниеТипов("Число"),"Число7");

     табЗагрузки1.Колонки.Добавить("Договор",Новый ОписаниеТипов("Строка"),"Договор");   
   табЗагрузки1.Колонки.Добавить("ФИО",Новый ОписаниеТипов("Строка"),"ФИО");
   табЗагрузки1.Колонки.Добавить("Адрес",Новый ОписаниеТипов("Строка"),"Адрес");     
     табЗагрузки1.Колонки.Добавить("Адрес1",Новый ОписаниеТипов("Строка"),"Адрес1");   
      табЗагрузки1.Колонки.Добавить("Адрес2",Новый ОписаниеТипов("Строка"),"Адрес2");   
        табЗагрузки1.Колонки.Добавить("Адрес3",Новый ОписаниеТипов("Строка"),"Адрес3");   
               табЗагрузки1.Колонки.Добавить("Комментарий",Новый ОписаниеТипов("Строка"),"Комментарий");
                

      табЗагрузки1.Колонки.Добавить("Сумма",Новый ОписаниеТипов("Число"),"Сумма");
    табЗагрузки1.Колонки.Добавить("НомерОт",Новый ОписаниеТипов("Строка"),"НомерОт");
   табЗагрузки1.Колонки.Добавить("НомерОперации",Новый ОписаниеТипов("Строка"),"НомерОперации");
   табЗагрузки1.Колонки.Добавить("Сумма1",Новый ОписаниеТипов("Число"),"Сумма1");
    
        табЗагрузки1.Колонки.Добавить("Число5",Новый ОписаниеТипов("Число"),"Число5");
    табЗагрузки1.Колонки.Добавить("Число6",Новый ОписаниеТипов("Число"),"Число6");
    табЗагрузки1.Колонки.Добавить("Число8",Новый ОписаниеТипов("Число"),"Число8");
   
   
   
   
   
   ДатаОбщая1 = текст.ПолучитьСтроку(квоСтрок);
ДатаОбщая1 = Прав(ДатаОбщая1, 10);
   
   Время = "23:59:59";
   ДатаОбщая1 = СтрЗаменить(ДатаОбщая1,"-",".")+" "+Время;
   Объект.ДатаОбщая = ПреобразоватьВДату(ДатаОбщая1);

   
   //начиная со второй строки читаем строки файла, раскладывая их в массив
   Для номСтр = 1 По квоСтрок-1 Цикл
      стрТекста = текст.ПолучитьСтроку(номСтр);
      масЗначСтр = РазложитьСтрокуВМассивПодстрок(стрТекста,разделительПолей);
      //добавляем новую строку в таблицу
      новСтр = табЗагрузки1.Добавить();
      новСтр.номер_строки = номСтр;
      //начиная с третьей колонки производим установку значений в колонки
      номЗнач = 1;
      Для каждого зн Из масЗначСтр Цикл
         Если номЗнач>18 Тогда
            продолжить;
         Конецесли;
            
         новСтр[номЗнач] = зн;
         //СтрЗаменить(зн,символОграничения,"");
         номЗнач = номЗнач + 1;
      КонецЦикла;
      
   КонецЦикла;
   
   
   Для Каждого Стр Из табЗагрузки1 Цикл
      
      НовыйЭлементТабЗагрузки = Объект.табЗагрузки.Добавить();
      НовыйЭлементТабЗагрузки.Дата = Стр.Дата;
      НовыйЭлементТабЗагрузки.Время = Стр.Время;
      НовыйЭлементТабЗагрузки.Комментарий = Стр.Комментарий;
      НовыйЭлементТабЗагрузки.Адрес = Стр.Адрес;
      
      Контрагент = Справочники.Контрагенты.НайтиПоНаименованию(Стр.ФИО);
      НовыйЭлементТабЗагрузки.Контрагент = Контрагент;
      НовыйЭлементТабЗагрузки.ФИО = Стр.ФИО;   
      Договор = Справочники.ДоговорыКонтрагентов.НайтиПоНаименованию(Стр.Договор); 
      НовыйЭлементТабЗагрузки.договор = Договор;
   

      НовыйЭлементТабЗагрузки.Сумма = Стр.Сумма;
      НовыйЭлементТабЗагрузки.Загружать = Истина;
      
   КонецЦикла;   
   
КонецПроцедуры


Максим75

unic65, можно исходную строку разделить используя СтрРазделить.
Вернет массив, если точно знаете, какой элемент массива будет нужен (вроде говорили что четвертый с конца), то можете сразу обратиться к нужному элементу массива.

unic65

Максим75, а как это прописать на языке 1с (4я с конца)

LexaK

unic65, какая платформа у вас?
есть функция

СтрРазделить (StrSplit)
Синтаксис:
СтрРазделить(<Строка>, <Разделитель>, <ВключатьПустые>)

если помогло нажмите: Спасибо!

Максим75

Цитата: unic65 от 17 дек 2024, 15:55Максим75, а как это прописать на языке 1с (4я с конца)
МассивСтрок = СтрРазделить(ИсходнаяСтрока,";");

МассивСтрок .Количество() - это общее количество элементов в массиве.
Значит МассивСтрок .Количество()-3 - это по идее 4 с конца элемент массива.

Так и пишите МассивСтрок .Получить(МассивСтрок .Количество()-3) - получите элемент массива.

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск