Работа с текстовыми данными в 1С:Предприятие 7.7 существенно отличается от современных версий платформы. Отсутствие встроенных методов для быстрого разделения строк, таких как СтрРазделить, заставляет разработчиков прибегать к алгоритмическим хитростям. Разберем подробно, как преобразовать строку с перечнем улиц и проездов в структурированную ТаблицуЗначений, а затем надежно сохранить эту таблицу в файл для последующего использования.
Предположим, у нас есть входящая строка следующего вида: "Улицы: Улица1, УлицаN; Переулки: Переулок1, ПереулокN; Проезды: Проезд1, ПроездN;". Наша цель — разложить её на составляющие и заполнить объект ТаблицаЗначений так, чтобы в одной колонке было название объекта, а во второй — его краткий тип (ул, пер, проезд).
Для реализации этой задачи проанализируем структуру строки. Мы видим иерархию разделителей:
;) отделяет группы объектов (улицы от переулков).:) отделяет заголовок группы от самих названий.,) разделяет конкретные названия внутри группы.В 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 По СписокГрупп.РазмерСписка() Цикл
ТекстГруппы = СписокГрупп.ПолучитьЗначение(и);
// Дальнейшая логика обработки...
КонецЦикла;
После того как данные загружены в ТаблицаЗначений, встает вопрос их сохранения. В 1С 7.7 есть мощный инструмент — ЗначениеВФайл. Рассмотрим нюансы его работы, так как именно здесь часто возникают ошибки.
Функция ЗначениеВФайл(ИмяФайла, Значение, ПомещатьОбъекты) позволяет сериализовать объект в файл. Выясним причины, по которым она может не срабатывать:
C:\ запрещена без прав администратора. Всегда указывайте полный путь к существующей папке, например "C:\Temp\data.txt".ЗначениеВФайл отлично работает со строками и числами, но может давать сбой, если в ячейках ТЗ содержатся специфические объекты внешних компонент.Посмотрим на пример правильного сохранения и загрузки:
ПутьКФайлу = "C:\Users\Public\Documents\MyTable.dat";
// Сохранение
Попытка
ЗначениеВФайл(ПутьКФайлу, ТЗ);
Сообщить("Данные успешно сохранены");
Исключение
Сообщить("Ошибка при сохранении: " + ОписаниеОшибки());
КонецПопытки;
// Загрузка
ТЗ_Загруженная = СоздатьОбъект("ТаблицаЗначений");
Если ФС.СуществуетФайл(ПутьКФайлу) = 1 Тогда
ЗначениеИзФайла(ПутьКФайлу, ТЗ_Загруженная);
КонецЕсли;
Если данные необходимо подготовить вне системы (например, в Excel или OpenOffice), лучшим решением будет использование формата CSV (текст с разделителями). Проанализируем, как загрузить такой файл в 1С 7.7.
Для работы с текстовыми файлами используем объект Текст. Выясним важный момент относительно кодировок: 1С 7.7 работает с кодировкой Windows-1251 (ANSI). Если вы сохраните файл в UTF-8, вместо русских букв вы увидите "иероглифы".
Т = СоздатьОбъект("Текст");
Т.Открыть(ПутьКФайлуCSV);
Для н = 1 По Т.КоличествоСтрок() Цикл
Стр = Т.ПолучитьСтроку(н);
// Допустим, разделитель в CSV - точка с запятой
СписокПолей = глРазложить(Стр, ";");
ТЗ.НоваяСтрока();
ТЗ.Название = СписокПолей.ПолучитьЗначение(1);
ТЗ.Тип = СписокПолей.ПолучитьЗначение(2);
КонецЦикла;
Рассмотрим ситуацию, когда объем данных велик. Если список улиц составляет десятки тысяч записей, стандартная ТаблицаЗначений может работать медленно при поиске. В таких случаях программисты 7.7 часто используют:
Сортировать().Проанализировав все способы, можно сделать вывод: для разовых задач парсинга идеально подходит метод СтрЗаменить с РазделительСтрок. Для хранения данных внутри системы лучше использовать ЗначениеВФайл, а для обмена данными с внешним миром — текстовые файлы формата CSV в кодировке ANSI.