Работа со строками в 1С:Предприятие — одна из самых востребованных задач как для начинающих пользователей, так и для опытных разработчиков. Без умения корректно извлекать текстовые данные невозможно создать отчёты, обработать документы или автоматизировать бизнес-процессы. Однако способы получения строк сильно зависят от контекста: вы можете работать с реквизитами справочников, полями документов, результатами запросов или даже с пользовательским вводом.
Эта статья охватывает все актуальные методы — от ручного копирования через интерфейс до написания сложных скриптов на встроенном языке. Мы разберём не только техническую сторону, но и типичные ошибки, которые приводят к потере данных или некорректному форматированию. Особое внимание уделено разнице между получением строки как значения и как объекта, что часто становится источником путаницы.
1. Базовые способы получения строки через интерфейс 1С
Не каждый пользователь 1С умеет программировать, но даже без знания кода можно извлечь текстовые данные. Эти методы подойдут для одноразовых задач или когда нужно быстро скопировать информацию для отчёта.
- 📋 Копирование из формы документа: выделите текстовое поле (например,
НаименованиеилиКомментарий) и используйте стандартное сочетаниеCtrl+C. Работает для большинства реквизитов, кроме системных полей. - 🖱️ Экспорт в Excel/Word: через меню
Файл → Сохранить как..или кнопкуВыгрузитьв отчётах. Позволяет получить строки вместе с другой табличной информацией. - 🔍 Просмотр в журнале документов: дважды кликните по документу, чтобы открыть его форму, затем скопируйте нужные текстовые поля. Подходит для справочников и регистров.
Например, вы не сможете таким образом получить скрытые реквизиты или данные, которые формируются динамически (например, итоговые суммы с учётом скидок). Также некоторые поля могут отображаться в сокращённом виде — для получения полного текста потребуется программный доступ.
2. Получение строки из реквизита объекта (программно)
Для автоматизации процессов необходимо использовать встроенный язык 1С. Самый простой способ — обратиться к реквизиту объекта напрямую. Например, чтобы получить наименование номенклатуры из документа РеализацияТоваровУслуг, используйте следующий код:
Номенклатура = Документы.РеализацияТоваровУслуг.НайтиПоНомеру("РТ-000123");
Сообщить(Номенклатура.Номенклатура.Наименование);
Ключевые моменты этого подхода:
- 🔑 Тип объекта: метод работает для документов, справочников, регистров и других объектов метаданных. Для каждого типа синтаксис может slightly отличаться.
- 🔄 Проверка на существование: перед обращением к реквизиту проверьте, найден ли объект, иначе получите ошибку
{ОбщийМодуль.ОбщийМодуль(13)}: Значение не является значением объекта!. - 📝 Форматирование: если реквизит содержит многострочный текст (например,
Комментарий), используйте функциюСтрЗаменить()для удаления лишних переносов.
⚠️ Внимание: При работе с управляемыми формами (тонкий клиент, веб-клиент) некоторые реквизиты могут быть недоступны напрямую из-за ограничений платформы. В этом случае используйте метод ПолучитьФорму() для доступа к элементам интерфейса.
Если вам нужно получить строку из реквизита, который является ссылкой на другой объект (например, Контрагент в документе), сначала получите объект по ссылке, а затем обращайтесь к его реквизитам: Документ.Контрагент.ПолучитьОбъект().Наименование.
3. Извлечение строк из результатов запроса
Запросы в 1С — мощный инструмент для работы с данными, включая текстовые поля. Чтобы получить строку из результата запроса, используйте конструкцию ВЫБРАТЬ с указанием нужного поля. Пример:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Наименование КАК Наименование
|ИЗ
| Документ.РеализацияТоваровУслуг.Товары КАК Товары
|ГДЕ
| Товары.Ссылка = &СсылкаНаДокумент";
Запрос.УстановитьПараметр("СсылкаНаДокумент", ДокументСсылка);
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
Сообщить(Выборка.Наименование); // Получаем строку с наименованием
КонецЦикла;
Особенности работы со строками в запросах:
- 📌 Агрегация текстовых данных: для объединения строк используйте функцию
СТРСОЕДИНИТЬ()(например, для формирования полного адреса из нескольких полей). - 🔎 Фильтрация по тексту: оператор
ПОДОБНОпозволяет искать строки по шаблону (например,ГДЕ Наименование ПОДОБНО "%телефон%"). - 🚫 Ограничение на длину: в некоторых конфигурациях строковые поля в запросах обрезаются до 255 символов. Для обхода используйте
ЛЕВ()илиПРАВ().
| Функция запроса | Назначение | Пример использования |
|---|---|---|
ЛЕВ(Строка, Длина) |
Возвращает указанное количество символов с начала строки | ЛЕВ(Номенклатура.Наименование, 10) |
ПРАВ(Строка, Длина) |
Возвращает символы с конца строки | ПРАВ(Документ.Номер, 3) |
СТРДЛИНА(Строка) |
Возвращает длину строки в символах | ГДЕ СТРДЛИНА(Комментарий) > 100 |
СОЕДИНИТЬСТРОКИ() |
Объединяет несколько строк через разделитель | СОЕДИНИТЬСТРОКИ(Адрес.Улица, ", ", Адрес.Дом) |
4. Работа со строками в модулях и обработках
Когда требуется гибкая обработка текстовых данных, используйте функции встроенного языка. Например, для извлечения подстроки из большого текста или форматирования строк под конкретные нужды.
Основные функции для работы со строками:
- 🔹
СтрНайти(ИскомаяСтрока, Подстрока): возвращает позицию подстроки или 0, если не найдена. - 🔹
СтрПолучитьСтроку(Строка, НомерСтроки): извлекает указанную строку из многострочного текста. - 🔹
РегВыражение(Шаблон): для сложного поиска и замены по регулярным выражениям (доступно начиная с версии 8.3.10).
Пример использования регулярных выражений для извлечения email из текста:
Текст = "Контактное лицо: Иванов Иван, email: ivanov@example.com, тел: +79991234567";
РегВыр = Новый РегВыражение("[\w\.]+@[\w\.]+\w");
Найдено = РегВыр.Поиск(Текст);
Если Найдено Тогда
Сообщить(РегВыр.Найденное(0)); // Выведет: ivanov@example.com
КонецЕсли;
⚠️ Внимание: ФункцииРегВыражениеиСтрРазделить()могут работать медленно на больших текстах (более 10 000 символов). Для оптимизации разбивайте текст на части или используйте запросы.
Как ускорить обработку больших текстов?
Для текстов объёмом более 1 Мб рекомендуется:
1. Разбивать строку на фрагменты по 1000 символов с помощью СтрПолучитьСтроку().
2. Использовать временные таблицы в запросах для предварительной фильтрации.
3. Отключать проверку правописания (ТекстДокумента.ПроверятьОрфографию = Ложь) при работе с текстовыми документами.
5. Получение строк из внешних источников (файлы, API, буфер обмена)
Иногда строки необходимо импортировать из внешних систем. В 1С для этого предусмотрены специализированные методы.
Способы импорта строк:
- 📄 Чтение из текстовых файлов:
Текст = Новый ЧтениеТекста("C:\temp\data.txt", КодировкаТекста.UTF8);Строка = Текст.ПрочитатьСтроку();
- 🌐 Запрос к API (например, для получения курса валют):
HTTPСоединение = Новый HTTPСоединение("api.example.com");Ответ = HTTPСоединение.Получить("/rates?currency=USD");
ТекстОтвета = Ответ.ПолучитьТекст();
- 🖇️ Буфер обмена (только для толстого клиента):
ТекстИзБуфера = БуферОбмена.ПолучитьТекст();
При работе с внешними данными учитывайте:
- 🔒 Кодировку: если файл сохранён в
ANSI, а вы читаете какUTF-8, получите кракозябры. ИспользуйтеКодировкаТекста.UTF8илиКодировкаТекста.Windows. - 🛡️ Безопасность: при чтении из API всегда проверяйте статус ответа (
Если Ответ.КодСостояния = 200 Тогда..). - 📏 Ограничения: буфер обмена в тонком клиенте недоступен из-за ограничений браузера.
Указан правильный путь к файлу
Совпадает кодировка файла и чтения
Файл не заблокирован другим процессом
Обработаны исключения (например, файл не найден)-->
6. Ошибки при работе со строками и как их избежать
Даже опытные разработчики сталкиваются с проблемами при извлечении строк. Рассмотрим типичные ошибки и способы их решения.
| Ошибка | Причина | Решение |
|---|---|---|
Ошибка приведение типа к строке |
Попытка получить строку из нетекстового реквизита (например, Дата или Число) |
Используйте Формат(): Формат(Документ.Дата, "ДФ=dd.MM.yyyy") |
Недостаточно памяти |
Обработка слишком длинной строки (более 100 Мб) | Разбивайте строку на части или используйте ПотокВПамяти |
Неверная кодировка |
Чтение файла в неправильной кодировке | Явно указывайте кодировку: КодировкаТекста.UTF8 или КодировкаТекста.Windows |
Объект не найден |
Обращение к несуществующему реквизиту | Проверяйте существование реквизита: Если Объект.Свойство("Реквизит") Тогда.. |
Критическая ошибка: попытка модифицировать строку, полученную из запроса, без предварительного копирования. В 1С 8.3 строки в результатах запроса могут быть "защищёнными" — их изменение приведёт к исключению. Всегда используйте Строка = РезультатЗапроса.Поле + "" для создания копии.
7. Продвинутые техники: регулярные выражения и парсинг
Для сложных задач (например, извлечения данных из неструктурированного текста) применяются регулярные выражения. Они доступны в 1С начиная с версии 8.3.10.
Примеры использования:
- 🔢 Поиск чисел в тексте:
РегВыр = Новый РегВыражение("\d+");Найдено = РегВыр.Поиск("Артикул: 12345, цена: 999.99");
Сообщить(Найдено.Найденное(0)); // "12345"
- 📧 Валидация email:
Если РегВыражение("^\w+@[a-zA-Z_]+?\.[a-zA-Z]{2,3}$").Совпадение(ПолеEmail) Тогда// Email корректен
КонецЕсли;
- 📄 Разбор HTML/XML (упрощённо):
РегВыр = Новый РегВыражение("", РегВыражениеМногострочный);Найдено = РегВыр.Поиск(HTMLТекст);
Сообщить(Найдено.Найденное(1)); // Текст внутри тега title
⚠️ Внимание: Регулярные выражения в 1С поддерживают не все возможности PCRE. Например, отсутствует "lookbehind" ((?<=..)). Для сложных шаблонов используйте внешние компоненты или разбивайте задачу на несколько этапов.
Регулярные выражения в 1С чувствительны к регистру по умолчанию. Чтобы сделать поиск нечувствительным, добавьте флаг РегВыражениеИгнорироватьРегистр.
FAQ: Частые вопросы по работе со строками в 1С
Как получить строку из поля ввода на форме?
Используйте метод ПолучитьЗначение() для элемента управления:
ЗначениеПоля = ЭлементыФормы.ПолеВвода1.ПолучитьЗначение();
Для управляемых форм: Элементы.ПолеВвода1.Значение.
Почему функция СтрДлина() возвращает неверное значение для кириллицы?
В 1С до версии 8.3.13 кириллические символы могли считаться как 2 байта. Используйте:
Длина = СтрДлина(Текст, "UTF-16");
или обновите платформу.
Как извлечь строку из PDF или Word-документа?
Стандартными средствами 1С это невозможно. Используйте:
- Внешние компоненты (например, Aspose.Words для DOCX).
- Предварительное преобразование в TXT через сторонние утилиты.
- Обращение к API сервисов (например, Google Drive API для извлечения текста из PDF).
Можно ли получить строку из картинки (OCR) в 1С?
Нет встроенных средств. Решения:
- Интеграция с ABBYY FineReader через COM-объект.
- Использование облачных сервисов (например, Google Vision API).
- Предварительная обработка изображений во внешних программах.
Пример вызова FineReader:
FineReader = Новый COMОбъект("FineReader.Application");
Текст = FineReader.Recognize("C:\image.jpg");
Как сохранить строку с разрывами строк в файл?
Используйте ЗаписьТекста с указанием кодировки и символа новой строки:
Запись = Новый ЗаписьТекста("C:\output.txt", КодировкаТекста.UTF8);
Запись.ЗаписатьСтроку("Первая строка");
Запись.ЗаписатьСтроку("Вторая строка");
Запись.Закрыть();
Для Windows-переносов (\r\n) добавьте замену:
Текст = СтрЗаменить(Текст, Символы.ПС, Символы.ПС + Символы.ВК);