1с удалить строку из файла
Целью данной статьи будет изучение алгоритмов работы с текстовыми файлами, TXT и CSV. Очень часто приходится использовать данные форматы для обмена данными между несколькими базами, в том числе и отличными от 1С.
Чтение текстового файла
В данной конструкции создается неинициализированный объект ЧтениеТекста, а для инициализации используется метод Открыть()
Если файл небольшой можно использовать объект ТекстовыйДокумент (пример чтения )
Текст = Новый ТекстовыйДокумент ;
ПолноеИмяФайла = «D:\1C\Пример.txt» ;
Текст . Прочитать ( ПолноеИмяФайла ) ;
КоличествоСтрок = Текст . КоличествоСтрок ( ) ;
Для Счетчик = 1 по КоличествоСтрок Цикл
ТекСтрока = Текст . ПолучитьСтроку ( Счетчик ) ;
Сообщить ( ТекСтрока ) ;
КонецЦикла ;
Запись текстового файла
Записать текст в документ можно при помощи функции ЗаписатьСтроку() — в данном случае после записанной строки автоматически добавится разделитель строк и следующая запись начнется с новой строки. Если же необходимо добавить в строку дополнительно текст, то можно воспользоваться функцией без переноса строки — Записать().
Запись через «ТекстовыйДокумент»
Пример не содержит проверок на наличие файла, файл перезаписывается. При необходимости добавления используйте метод Прочитать().
Чтение файла CSV
CSV (от англ. Comma-Separated Values — значения, разделённые запятыми) — текстовый формат, предназначенный для представления табличных данных. Каждая строка файла — это одна строка таблицы. Значения отдельных колонок разделяются разделительным символом (delimiter) — запятая (,) или точка с запятой (;). (Википедия)
Такой формат часто используют для выгрузки данных из различных баз отличных от 1С. Ниже представлен алгоритм чтения данного формата на основе обычного чтения текстового файла с анализом строки и разбиением ее на поля.
Для типовых конфигураций для «парсинга» строки возможно использование функции общего назначения РазложитьСтрокуВМассивПодстрок(Текст, «.»), в которой можно задать произвольный разделитель..
Подведем итоги:
Для чтения и записи текстового файла в 1С существуют 3 объекта ЧтениеФайла, ЗаписьФайла, ТекстовыйДокумент.
Последний более универсальный, но медлительный, т.к. считывает файл сразу. Если памяти мало, его использование может вызвать ошибку нехватки памяти. Данный объект является основой для интерфейсного объекта «ПолеТекстовогоДокумента»
Возможно использовать данные функции для чтения/записи HTML и log файлов.
Для работы с XML (хотя они тоже текстовые) рекомендуется использовать специализированные объекты ЧтениеXML, ЗаписьXML.
Восторженное отношение жены к работе мужа — лучшая реклама его деятельности.
— Дороти Карнеги
Word тип COMОбъект - это макет печатной формы типа Active document, содержащий печатную форму типа MS Word, заполненную в соответствии с заданием.
простыми методами Item("ИНН").Value я заполняют в коде переменные печатной формы, например так:
Word.Variables.Item("ИНН").Value = Выборка.ИНН;
Есть строки, которые при определенных условиях надо удалить из макета Word, удалить совсем так, чтобы текст ниже переместился на 1 строку вверх (на ту, которую удалим).
Вопрос:
подскажите, люди добрые, какой метод лучше всего мне использовать для этой цели?
(1) RailMen,
Вот именно просто строку - боюсь что никак. Поймите, что там просто НЕТ такого понятия как "строка" на объектном уровне (они переносятся :)).
Так что определитесь сначала, что именно нужно удалить. Варианты: Абзац, СтрокаТАБЛИЦЫ, Раздел, . Но не строка.
Уточнение:
1) Если текст расползается на 2 строки, то удалить надо 2 строки, если на 3 строки, то 3 строки удалить и т.д.
2) Заменить найденный текст на пустой символ "" - не предлагать, т.к. это не приведет к удалению строки.
(3) RailMen,
Уточните:
- Удалить предложение содержащее искомый шаблон (От абзаца до точки или от точки до точки)?
- Удалить абзац содержащее искомый шаблон (От абзаца до абзаца)?
Упростим задачу. Есть три строки в Word, каждая с нового абзаца:
Заявление.
Удалить
На основании СЗ № от
Нужно удалить 2 строку, содержащую текст "Удалить", полученный результат должен содержать 2 строки:
Заявление.
На основании СЗ № от
После какого упрощения можно говорить об удалении абзаца №2.
Сейчас посмотрю, попробую. Что получится - тут напишу. Если все будет "ок" - попугаи твои )
Что-то типа конструкции:
Word.Selection.Start = бла;
Word.Selection.End = блабла;
Word.Selection.Delete();
Предварительное решение задачи:
//Word тип COMОбъект - это макет печатной формы типа Active document, содержащий печатную форму типа MS Word, заполненную в соответствии с заданием.
//Пример определения Word в коде 1С:
//СсылкаМакет = ПолучитьМакет(ИмяМакета);
//Word = СсылкаМакет.Получить();
Selection = Word.Application.Selection; //объект для программной работы с выделенным участком текста в VBA
Find = Selection.Find; //объект для программного поиска и замены текста в документе Word средствами VBA, БЕРЕМ ИЗ Selection
Find.Text = СимволыКоторыеНадоУдалить+Символы.ВК;
Если Find.Execute() Тогда //метод для запуска поиска, если Истина, то вхождения найдены
Selection.Delete();
КонецЕсли;
Чтобы символы не просто очистились, но и строка сдвинулась вверх надо в конец искомых символов добавить символ возврата корректки.
Эта конструкция не работает, если текст, который надо удалить, был заполнен программно через конструкцию
Строго говоря, тут нет удаления строки/абзаца. Это некий финт ушами. Хотелось бы изучить другие варианты решения.
Если верить записи макроса, то такое:
Selection.MoveUp Unit:=wdParagraph, Count:=1 //перемещаемся в начало абзаца
Selection.MoveDown Unit:=wdParagraph, Count:=1, Extend:=wdExtend//выделяем, как понимаю абзац
Selection.Delete Unit:=wdCharacter, Count:=1//удаляем нафик абзац
(10) antz, как узнать в какой абзац переместиться и какой удалить? в смысле как узнать какой абзац(ы) содержит искомые символы?
2) Заменить найденный текст на пустой символ "" - не предлагать, т.к. это не приведет к удалению строки.
как раз то что надо, только потом потребуется:
РабочийДок.VBProject.VBComponents("NemMacros").CodeModule.InsertLines(1, "Sub Макрос2()");
РабочийДок.VBProject.VBComponents("NemMacros").CodeModule.InsertLines(2, "With Selection.Find");
РабочийДок.VBProject.VBComponents("NemMacros").CodeModule.InsertLines(3, ".Text = ""^p^p""");
РабочийДок.VBProject.VBComponents("NemMacros").CodeModule.InsertLines(4, " .Replacement.Text = ""^p""");
РабочийДок.VBProject.VBComponents("NemMacros").CodeModule.InsertLines(5, ".Forward = True");
РабочийДок.VBProject.VBComponents("NemMacros").CodeModule.InsertLines(6, ".Wrap = wdFindContinue");
РабочийДок.VBProject.VBComponents("NemMacros").CodeModule.InsertLines(7, ".Format = False");
РабочийДок.VBProject.VBComponents("NemMacros").CodeModule.InsertLines(8, ".MatchCase = False");
РабочийДок.VBProject.VBComponents("NemMacros").CodeModule.InsertLines(9, ".MatchWholeWord = False");
РабочийДок.VBProject.VBComponents("NemMacros").CodeModule.InsertLines(10, ".MatchWildcards = False");
РабочийДок.VBProject.VBComponents("NemMacros").CodeModule.InsertLines(11, ".MatchSoundsLike = False");
РабочийДок.VBProject.VBComponents("NemMacros").CodeModule.InsertLines(12, ".MatchAllWordForms = False");
РабочийДок.VBProject.VBComponents("NemMacros").CodeModule.InsertLines(13, "End With");
РабочийДок.VBProject.VBComponents("NemMacros").CodeModule.InsertLines(14, "Selection.Find.Execute Replace:=wdReplaceAll");
РабочийДок.VBProject.VBComponents("NemMacros").CodeModule.InsertLines(15, "Selection.Find.Execute Replace:=wdReplaceAll");
РабочийДок.VBProject.VBComponents("NemMacros").CodeModule.InsertLines(16, "End Sub");
Док.Run("Макрос2");
//где Док - объект ворд, РабочийДок - сам документ
(11) гыук320, прокомментируйте пожалуйста, что происходит в строках макроса и почему его надо выполнить после замены искомой строки на пустой символ ""
(18) Ivanovag123,
тему видел
в 11 посте макрос ОТЛИЧНО ВЫПОЛНЯЕТ СВОЮ РАБОТУ В ВОРДЕ, если не лень проверти.
With Selection.Find
.Text = "^p^p"
.Replacement.Text = "^p"
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
End With
Selection.Find.Execute Replace:=wdReplaceAll
Selection.Find.Execute Replace:=wdReplaceAll
плюс пример реализации в 1с, не вижу где ушел от темы
(20) гыук320, чисто визуально должно в целом работать. Только код избыточен. Можно покороче написать. Нет?
With Selection.Find
.Text = "^p^p"
.Replacement.Text = "^p"
End With
Selection.Find.Execute Replace:=wdReplaceAll
тоже рабочий вариант
(26) гыук320, твое решение уступает решению antz тк как у тебя сначала меняется текст на пустой символ, а затем удаляются пустые строки. Тут явно 1 лишняя операция: замена строки поиска на пустой символ. Сама идея потом удалять пустые строки не очень "практичная" : вдруг нам нужно по заданию иметь пустую строку?
А в варианте antz удаляются непосредственно строки, удовлетворяющие условию поиска.
Если я не прав, поправьте меня.
(32) гыук320, я не сколько не хотел усомниться в Вас. Просто решение antz было более законченным и подходящим (он обработку выложил).
Почему то метод Find.Execute() не ищет внутри параметров типа , которые заполняются программно так:
Word.Variables.Item("Параметр1").Value = "УдалитьСтроку";
Так что ни один вариант не работает внутри конструкций , где Параметр1 - программно заполняемый параметр
в двух словах макрос находит два в подряд идущих знака обзаца и заменяет на один, тем самым удаляется пустуя строка
(24) antz, результаты тестирования: если в тексте "строка поиска" встречается несколько раз, то удаляет только первую попавшуюся. А надо все )
В конце еще обнули переменные связанные с "Word.Application", чтобы они в памяти не висли лишний раз.
(27) antz, в результате более тщательного тестирования нашел еще косяк или "фичу":
эта конструкция не работает, если текст, который надо найти и удалить, был заполнен программно через конструкцию вставленную в Word .
Например, если в коде я пишу:
Word.Variables.Item("Параметр1").Value = "УдалитьСтроку";
то код antz строку "УдалитьСтроку" не найдет, ну и не удалит соответственно
На основе кода antz сделал процедуру:
Find = WordApplication.Selection.Find;
Find.Text = СтрокаПоиска;
Find.Execute();
Пока Find.Found Цикл
Selection = Find.Application.Selection;
Selection.MoveUp(4);
Selection.MoveDown(4, 1, 1);
Selection.Delete(1);
Find.Execute()
КонецЦикла;
В 1С 8.3 (8.2) для работы с файлами существует два объекта: Файл и ДиалогВыбораФайла.
Рассмотрим каждый по отдельности.
Объект 1С — файл
Объект Файл служит для управления параметрами файлов.
Сразу стоит заметить, что данный объект не предназначен для чтения и записи из файлов.
Например, прочитаем параметры некоторого файла, находящегося на диске C:
В результате мы получим следующую информацию (если файл найден):
Параметры файла:
Полное имя файла: C:\Работа с файлами\статья.txt
Имя: статья.txt
Имя без расширения: статья
Расширение: .txt
Путь без имени: C:\Работа с файлами\
Размер: 899
Это файл: Да
Изменен: 18.05.2015 16:21:28
Только чтение: Нет
Невидимость: Нет
Запись в файл
Если вы только начинаете программировать в 1С или просто хотите систематизировать свои знания - попробуйте Школу программирования 1С нашего друга Владимира Милькина. Пошаговые и понятные уроки даже для новичка с поддержкой учителя.
Попробуйте бесплатно по ссылке >>
Теперь, когда мы выбрали и открыли файл, можно с ним работать, т.е. прочитать его содержимое или записать в него что-нибудь.
Рассмотрим пример:
Чтение файла в 1С
Часто бывает необходимо прочитать текст файла построчно, например, для анализа каждой строки. Для этого используем объект ЧтениеТекста.
Запись текста из 1С в файл
Заметим, что при записи текстового файла можно установить кодировку.
Копирование файла
Здесь все очень просто
Перемещение
Удаление
Диалог выбора файла
В указанных выше примерах есть одно неудобство. Путь к файлу прописан жестко в коде. Чтобы выбрать файл интерактивно, существует объект ДиалогВыбораФайла, о котором речь пойдет ниже.
Объект ДиалогВыбораФайла служит для открытия файла (файлов), сохранения файла или выбора каталога в диалоге специального вида.
Например, выберем и откроем некоторый файл с расширением txt:
Задаем режим диалога выбора. Доступны три варианта: ВыборКаталога, Открытие, Сохранение
Если Вы начинаете изучать 1С программирование, рекомендуем наш бесплатный курс (не забудьте подписаться на YouTube — регулярно выходят новые видео):
Строка — примитивный тип данных в языке программирования 1С. Помимо 1С, этот тип данных используется во всех известных языках программирования, обычно он называется «string».
Функции работы со строками в 1С
Рассмотрим основные функции встроенного языка программирования 1С.
Строка
Функция Строка() позволяет получить текстовое представление переменных других типов.
СтрДлина
Функция позволяет получить количество символов в строке 1C, включая пробелы и незначащие символы.
СокрЛП, СокрЛ, СокрП
Если вы только начинаете программировать в 1С или просто хотите систематизировать свои знания - попробуйте Школу программирования 1С нашего друга Владимира Милькина. Пошаговые и понятные уроки даже для новичка с поддержкой учителя.
Попробуйте бесплатно по ссылке >>
Полезная функция для удаления незначащих символов в строковом значении. СокрЛ обрабатывает символы, стоящие слева от последнего значащего символа, СокрП — справа. А СокрЛП — справа и слева.
Помимо пробелов, функция 1C удаляет такие символы, как перенос строки, неразрывный пробел и т.д.
Лев, Прав, Сред
С помощью данных функций очень просто получить первые (Лев) или последние (Прав) символы в строке, а также произвольное количество символов (Сред).
Найти
Функция для поиска подстроки внутри другой подстроки. Синтаксис Найти(, ). Функция возвращает число — номер позиции символа (или символов) в исходной подстроке. Если подстроки не найдено, вернётся число 0. Если в искомой подстроке есть несколько вхождений, вернется номер позиции первого совпадения.
ВРег, НРег, ТРег
Функции для управления регистром строки. ВРег — преобразует строку в верхний регистр. НРег — в нижний. ТРег — у каждого нового слова первая буква преобразуется в верхний регистр, остальные в нижний.
ПустаяСтрока
Функция, позволяющая сравнить исходную строку с пустой строкой. Проверяется наличие незначащих символов.
Аналогично можно проверить строку на пустое значение следующим образом:
СтрЗаменить
Функция СтрЗаменить позволяет массово заменить искомое значение на нужное нам. Синтаксис:
СтрЧислоСтрок
Позволяет получить количество строк в многострочном тексте. Функция считает количество переносов строк (Символы.ПС).
Например, построчная обработка текстового фрагмента:
СтрПолучитьСтроку
С помощью данной функции можно получить произвольную строку из многострочного текста. Синтаксис — СтрПолучитьСтроку(, ).
СтрЧислоВхождений
Функция для подсчета числа вхождений произвольного фрагмента в строку. Например, подсчитать количество вхождений определенных символов или слов в текст.
Символ и КодСимвола
Две обратные функции. С помощью КодСимвола можно получить код символа в кодировке Unicode. Функцией Символ можно получить символ, зная Unicode кодификатор.
Часто встречающиеся задачи по работе со строками в 1С
Рассмотрим классические примеры решения задач в работе с текстовыми переменными.
Конкатенация строк в 1С
Конкатенация, или объединение строк в 1С делается оператором «+».
Преобразовать число в строку
Тут всё просто. Достаточно использовать метод «Строка()»:
Однако может смущать наличие неразрывного пробела.
Его можно убрать с помощью замены неразрывного пробела на пустую строку:
или с помощью метода Формат:
Кавычки в строке 1С
Для новичков достаточно трудно установить кавычки внутри строки, хотя в этом нет ничего сложного. Достаточно внутри строки поставить вместо одних кавычек двое.
Символ переноса строки
Символ переноса строки необходим для переноса строки на следующую строку. В 1С это можно сделать с помощью специальной конструкции «Символы.ПС».
Сравнение строк в 1С
Сравнить строки достаточно просто с помощью оператора сравнения — «=».
Однако для получения корректного сравнения часто требуется возвести строки в один регистр и убрать незначащие символы:
Таким образом, мы получим более точное сравнение двух строк.
Убрать пробелы в строке 1С
Достаточно часто нужно убрать пробелы в строке 1С.
Если требуется убрать пробелы справа и слева:
Если требуется убрать абсолютно все пробелы, можно заменить их на пустую строку:
Если требуется убрать неразрывные пробелы из строки, которая получена из числового типа, сделать это можно так:
Другие статьи по 1С:
Если Вы начинаете изучать 1С программирование, рекомендуем наш курс (не забудьте подписаться на YouTube — регулярно выходят новые видео):
Как восстановить любое значение из файла в 1с 8.3, 8.2
Как записать текстовый файл в 1с 8.3, 8.2
Как прочитать текстовый файл в 1с 8.3, 8.2
Как проверить существование файла в 1С 8.3, 8.2
Как скопировать файл в 1с 8.3, 8.2
Как переместить файл в 1с 8.3, 8.2
Как найти файлы в каталоге в 1с 8.3, 8.2
Как удалить файл в 1с 8.3, 8.2
Как удалить файлы в каталоге по маске в 1с 8.3, 8.2
Как получить имя временного файла в 1с 8.3, 8.2
Как прочитать атрибуты файла в 1с 8.3, 8.2
Как установить атрибуты файла в 1с 8.3, 8.2
Как узнать размер файла в 1с 8.3, 8.2
Как узнать по пути, файл это или каталог в 1с 8.3, 8.2
Как вытащить расширение файла из его пути в 1с 8.3, 8.2
Как вытащить имя файла без расширения в 1с 8.3, 8.2
Как создать каталог в 1с 8.3, 8.2
Как проверить существование каталога в 1с 8.3, 8.2
Как удалить каталог вместе с содержимым в 1с 8.3, 8.2
Как сохранить произвольное значение во временное хранилище в 1с 8.3, 8.2
Как прочитать произвольное значение из временного хранилища в 1с 8.3, 8.2
Как перезаписать уже сохраненное значение во временном хранилище в 1с 8.3, 8.2
Как сохранить значение во временное хранилище на всё время жизни формы в 1с 8.3, 8.2
Как сохранить значение во временное хранилище на всё время сеанса пользователя в 1с 8.3, 8.2
Как удалить значение из временного хранилища в 1с 8.3, 8.2
Как узнать является ли строка адресом во временном хранилище в 1с 8.3, 8.2
Как передать файл с клиента на сервер в 1с 8.3, 8.2
Процедура ВыполнитьПослеПомещенияФайла ( Результат , Адрес , ВыбранноеИмяФайла , ДополнительныеПараметры ) Экспорт
Как прочитать файл на сервере из временного хранилища в 1с 8.3, 8.2
Как передать файл с сервера на клиент в 1с 8.3, 8.2
Поиск по сайту
Okolokompa в Яндекс Дзен
Читайте также: