Как загрузить данные из сложной строки в таблицу значений в 1С 7.7 и сохранить результат в файл

Программист 1С v7.7
← На главную

Работа с текстовыми данными в 1С:Предприятие 7.7 существенно отличается от современных версий платформы. Отсутствие встроенных методов для быстрого разделения строк, таких как СтрРазделить, заставляет разработчиков прибегать к алгоритмическим хитростям. Разберем подробно, как преобразовать строку с перечнем улиц и проездов в структурированную ТаблицуЗначений, а затем надежно сохранить эту таблицу в файл для последующего использования.

Анализ исходных данных и постановка задачи

Предположим, у нас есть входящая строка следующего вида: "Улицы: Улица1, УлицаN; Переулки: Переулок1, ПереулокN; Проезды: Проезд1, ПроездN;". Наша цель — разложить её на составляющие и заполнить объект ТаблицаЗначений так, чтобы в одной колонке было название объекта, а во второй — его краткий тип (ул, пер, проезд).

Для реализации этой задачи проанализируем структуру строки. Мы видим иерархию разделителей:

  1. Точка с запятой (;) отделяет группы объектов (улицы от переулков).
  2. Двоеточие (:) отделяет заголовок группы от самих названий.
  3. Запятая (,) разделяет конкретные названия внутри группы.

Решение 1: Программный парсинг строки штатными средствами

В 1С 7.7 основным инструментом для работы со списками является замена разделителей на специальные символы переноса строки. Рассмотрим, как это реализовать. Воспользуемся типовым приемом: заменим разделители на системную константу РазделительСтрок.

Проанализируем алгоритм разбора по шагам:


// Сначала подготовим Таблицу Значений
ТЗ = СоздатьОбъект("ТаблицаЗначений");
ТЗ.НоваяКолонка("Название", "Строка");
ТЗ.НоваяКолонка("Тип", "Строка");

// Исходная строка
СтрИсточник = "Улицы: Улица1, УлицаN; Переулки: Переулок1, ПереулокN;";

// 1. Разбиваем на блоки по ";"
СтрБлоки = СтрЗаменить(СтрИсточник, ";", РазделительСтрок);
Для н1 = 1 По СтрКоличествоСтрок(СтрБлоки) Цикл
    ТекущийБлок = СтрПолучитьСтроку(СтрБлоки, н1);
    Если ПустаяСтрока(ТекущийБлок) = 1 Тогда Продолжить; КонецЕсли;
    
    // 2. Отделяем Тип от Названий по ":"
    ПозДвоеточия = Найти(ТекущийБлок, ":");
    Если ПозДвоеточия > 0 Тогда
        ЗаголовокТипа = Лев(ТекущийБлок, ПозДвоеточия - 1);
        СписокНазваний = Сред(ТекущийБлок, ПозДвоеточия + 1);
        
        // Определяем краткий тип
        КраткийТип = "";
        Если Найти(ЗаголовокТипа, "Улицы") > 0 Тогда КраткийТип = "ул";
        ИначеЕсли Найти(ЗаголовокТипа, "Переулки") > 0 Тогда КраткийТип = "пер";
        КонецЕсли;
        
        // 3. Разбиваем названия по ","
        СтрЭлементы = СтрЗаменить(СписокНазваний, ",", РазделительСтрок);
        Для н2 = 1 По СтрКоличествоСтрок(СтрЭлементы) Цикл
            ТЗ.НоваяСтрока();
            ТЗ.Название = СокрЛП(СтрПолучитьСтроку(СтрЭлементы, н2));
            ТЗ.Тип = КраткийТип;
        КонецЦикла;
    КонецЕсли;
КонецЦикла;

Этот метод считается классическим для 1С 7.7. Важно помнить, что функция СтрЗаменить чувствительна к регистру, а РазделительСтрок позволяет превратить любую строку в многострочный текст, который легко обрабатывать в цикле с помощью СтрПолучитьСтроку.

Использование функции глРазложить

В большинстве типовых конфигураций (например, "Торговля и Склад 7.7" или "Бухгалтерский учет 7.7") в Глобальном модуле уже реализована функция глРазложить. Выясним, как она упрощает код. Эта функция обычно принимает строку и разделитель, возвращая СписокЗначений.

Если в вашей конфигурации есть такая функция, код разбора станет значительно чище. Рассмотрим пример ее использования:


СписокГрупп = глРазложить(СтрИсточник, ";");
Для и = 1 По СписокГрупп.РазмерСписка() Цикл
    ТекстГруппы = СписокГрупп.ПолучитьЗначение(и);
    // Дальнейшая логика обработки...
КонецЦикла;

Решение 2: Сохранение и загрузка Таблицы Значений

После того как данные загружены в ТаблицаЗначений, встает вопрос их сохранения. В 1С 7.7 есть мощный инструмент — ЗначениеВФайл. Рассмотрим нюансы его работы, так как именно здесь часто возникают ошибки.

Функция ЗначениеВФайл(ИмяФайла, Значение, ПомещатьОбъекты) позволяет сериализовать объект в файл. Выясним причины, по которым она может не срабатывать:

  1. Права доступа: В современных операционных системах (Windows 10/11) запись в корень диска C:\ запрещена без прав администратора. Всегда указывайте полный путь к существующей папке, например "C:\Temp\data.txt".
  2. Формат пути: Убедитесь, что все папки в пути созданы. 1С 7.7 не умеет автоматически создавать каталоги при записи файла.
  3. Типы данных в ТЗ: Метод ЗначениеВФайл отлично работает со строками и числами, но может давать сбой, если в ячейках ТЗ содержатся специфические объекты внешних компонент.

Посмотрим на пример правильного сохранения и загрузки:


ПутьКФайлу = "C:\Users\Public\Documents\MyTable.dat";

// Сохранение
Попытка
    ЗначениеВФайл(ПутьКФайлу, ТЗ);
    Сообщить("Данные успешно сохранены");
Исключение
    Сообщить("Ошибка при сохранении: " + ОписаниеОшибки());
КонецПопытки;

// Загрузка
ТЗ_Загруженная = СоздатьОбъект("ТаблицаЗначений");
Если ФС.СуществуетФайл(ПутьКФайлу) = 1 Тогда
    ЗначениеИзФайла(ПутьКФайлу, ТЗ_Загруженная);
КонецЕсли;

Решение 3: Альтернативный метод через CSV

Если данные необходимо подготовить вне системы (например, в Excel или OpenOffice), лучшим решением будет использование формата CSV (текст с разделителями). Проанализируем, как загрузить такой файл в 1С 7.7.

Для работы с текстовыми файлами используем объект Текст. Выясним важный момент относительно кодировок: 1С 7.7 работает с кодировкой Windows-1251 (ANSI). Если вы сохраните файл в UTF-8, вместо русских букв вы увидите "иероглифы".


Т = СоздатьОбъект("Текст");
Т.Открыть(ПутьКФайлуCSV);
Для н = 1 По Т.КоличествоСтрок() Цикл
    Стр = Т.ПолучитьСтроку(н);
    // Допустим, разделитель в CSV - точка с запятой
    СписокПолей = глРазложить(Стр, ";");
    
    ТЗ.НоваяСтрока();
    ТЗ.Название = СписокПолей.ПолучитьЗначение(1);
    ТЗ.Тип = СписокПолей.ПолучитьЗначение(2);
КонецЦикла;

Рекомендации по оптимизации

Рассмотрим ситуацию, когда объем данных велик. Если список улиц составляет десятки тысяч записей, стандартная ТаблицаЗначений может работать медленно при поиске. В таких случаях программисты 7.7 часто используют:

Проанализировав все способы, можно сделать вывод: для разовых задач парсинга идеально подходит метод СтрЗаменить с РазделительСтрок. Для хранения данных внутри системы лучше использовать ЗначениеВФайл, а для обмена данными с внешним миром — текстовые файлы формата CSV в кодировке ANSI.

← На главную