Перед публикацией прочитал статью "Работа с INI-файлами" //infostart.ru/public/85150/
Подумал: "Ну хоть не я один мамонтов реинкарнирую" :)
Хотя даже скептики признают удобство и простоту редактирования этих файлов.
Поддержка INI-файлов выполнена в виде функций общего модуля.
При открытии инифайла создается структура, где ключи - это названия секций, а значения - структуры с парами ключ-значение из соответствующей секции файла.
Структуру я выбрал из-за удобства работы с ней, несмотря на ограничения, что ключи должны удовлетворять требованиям, предъявляемым к именованию переменных встроенного языка.
Вот функции открытия и записи INI файла
// Читает INI файл в структуру и возвращает ее.
// При отсутствии файла возвращает пустую структуру
// по умолчанию - КодировкаТекста.ANSI
// показывает в какой строке произошла ошибка чтения
Функция Открыть(Файл, Кодировка = Неопределено, Отладка = Истина) Экспорт
СтруктураИни = Новый Структура;
Если Кодировка = Неопределено Тогда
Кодировка = КодировкаТекста.ANSI;
КонецЕсли;
Попытка
Текст = Новый ЧтениеТекста(Файл, Кодировка);
Исключение
Возврат Новый Структура;//Неопределено;
КонецПопытки;
Группа = Неопределено;
Стр = Текст.ПрочитатьСтроку();
НомерСтр = 1;
Пока Стр <> Неопределено Цикл // строки читаются до символа перевода строки
Стр = СокрЛП(Стр);
Если Лев(Стр, 1) = ";" Или ПустаяСтрока(Стр) Тогда //Игнорируем комментарий
//Перейти ~Следующий;
ИначеЕсли Лев(Стр, 1) = "[" Тогда //Нашли секцию
Если Прав(Стр, 1) <> "]" Тогда
Если Отладка Тогда
Сообщить ("Ошибка синтаксиса формата INI: Строка " + НомерСтр);
КонецЕсли;
Возврат Неопределено;
КонецЕсли;
Группа = Сред(Стр, 2, СтрДлина(Стр) - 2);
СтруктураИни.Вставить(Группа, Новый Структура);
Иначе //Параметр
ПозицияРавно = Найти(Стр, "=");
Если Группа = Неопределено ИЛИ ПозицияРавно = 0 Тогда
Если Отладка Тогда
Сообщить ("Ошибка синтаксиса формата INI: Строка " + НомерСтр);
КонецЕсли;
Возврат Неопределено;
КонецЕсли;
Значение = Сред(Стр, ПозицияРавно + 1);
СтруктураИни[Группа].Вставить(Лев(Стр, ПозицияРавно - 1), ?(ПустаяСтрока(Значение), Неопределено, Значение));
КонецЕсли;
//~Следующий:
Стр = Текст.ПрочитатьСтроку();
НомерСтр = НомерСтр + 1;
КонецЦикла;
Возврат СтруктураИни;
КонецФункции
// Сохраняет структуру в ини файл. Ключи структуры сохраняются как названия секций,
// Если значением структуры является структура, то ее ключи сохраняются в эту секцию как
// названия параметров, значения как значения параметров.
// Если элемент структуры не строка или не структура, он будет пропущен
// - Задает расширение файла для резервного копирования INI файла перед записью (Можно сточкой или без)
Функция Сохранить(Ини, Файл, Знач Резерв = Неопределено, Кодировка = Неопределено) Экспорт
Если Не ПустаяСтрока(Резерв) Тогда
ВыводИни = Новый Файл(Файл);
Если ВыводИни.Существует() Тогда
Если Лев(Резерв, 1) <> "." Тогда
Резерв = "." + Резерв;
КонецЕсли;
КопироватьФайл(Файл, ВыводИни.Путь + ВыводИни.ИмяБезРасширения + Резерв);
КонецЕсли;
ВыводИни = Неопределено;
КонецЕсли;
Если Кодировка = Неопределено Тогда
Кодировка = КодировкаТекста.ANSI;
КонецЕсли;
ВыводИни = Новый ЗаписьТекста(Файл, Кодировка);
Для Каждого Секция Из Ини Цикл
Если ТипЗнч(Секция.Значение) <> Тип("Структура") Тогда
Продолжить;
КонецЕсли;
ВыводИни.ЗаписатьСтроку("[" + Секция.Ключ + "]");
Для Каждого Параметр Из Секция.Значение Цикл
Если ТипЗнч(Параметр.Значение) <> Тип("Строка") Тогда
Продолжить;
КонецЕсли;
ВыводИни.ЗаписатьСтроку(Параметр.Ключ + "=" + Параметр.Значение);
КонецЦикла;
ВыводИни.ЗаписатьСтроку("");
КонецЦикла;
ВыводИни.Закрыть();
КонецФункции
Пример работы со структурой
Ини = ИниФайл.Открыть("С:\ИниФайл.ini");
Значение = Ини.Секция.Параметр;
Так же есть возможность работы со структурой в стиле Delphi
// Базовая функция чтения строки. Ини (Структура) - Структура INI файла,
// Секция (Строка) - Имя секции, Ключ (Строка) - Имя параметра,
// Данные (Произвольный) - Будет возвращено, если секции или параметра
// не существует или значение параметра пустая строка
Функция ПолучитьСтроку(Ини, Секция, Ключ, Данные = Неопределено) Экспорт
// Базовая функция записи строки. Ини (Структура) - Структура INI файла,
// Секция (Строка) - Имя секции, Ключ (Строка) - Имя параметра,
// Данные (Произвольный) - в структуру будет записано строковое представление.
// Если секция или параметр не существует, то он будет создан.
Процедура ЗаписатьСтроку(Ини, Секция, Ключ, Данные) Экспорт
Остальные функции работы с ключами структуры используют эти две функции и имеют те же основные параметры.
ПолучитьБулево, ЗаписатьБулево - Работает с разными представлениями записи логических переменных, можно задать своё.
ПолучитьЦелое, ЗаписатьЦелое - Целые так же могут быть в двоичном, шестнадцатеричном и восьмиричном представлении.
ПолучитьВещественное, ЗаписатьВещественное - Поддерживаются числа в полулогарифмической (нормальной) форме.
ПолучитьДатуВремя, ЗаписатьДатуВремя - В каноническом или локальном формате
ПолучитьДвоичныеДанные, ЗаписатьДвоичныеДанные - Пришлось записать картинку в одну строку, интересно, когда строка треснет?
Не реализованы Получить/Записать Дату, Время
Так же есть функции для работы с секциями.
// Возвращает число - количесво секций
Функция КоличествоСекций(Ини) Экспорт
Возврат Ини.Количество();
КонецФункции
// Проверка существования секции, возвращает булево
Функция СекцияСуществует(Ини, Секция) Экспорт
Возврат Ини.Свойство(Секция);
КонецФункции
// Удаляет секцию
Процедура УдалитьСекцию(Ини, Секция) Экспорт
Ини.Удалить(Секция);
КонецПроцедуры
// Возвращает список секций в виде списка значений или в виде массива
Функция ПолучитьСекции(Ини, Массив = Ложь) Экспорт
Секции = ?(Массив, Новый Массив, Новый СписокЗначений);
Для Каждого Секция Из Ини Цикл
Секции.Добавить(Секция.Ключ);
КонецЦикла;
Возврат Секции;
КонецФункции
// Возвращает список параметров в секции и их значений
// в виде Списка значений(Значение Функция ПолучитьСекцию(Ини, Секция) Экспорт
СтруктураСекция = Неопределено;
Если Не Ини.Свойство(Секция, СтруктураСекция) Тогда
Возврат Неопределено;
КонецЕсли;
Параметры = Новый СписокЗначений;
Для Каждого Параметр Из СтруктураСекция Цикл
Параметры.Добавить(Параметр.Ключ, Параметр.Значение);
КонецЦикла;
Возврат Параметры;
КонецФункции
// Возвращает список значений параметров в секции в виде
// списка значений (Значение Функция ПолучитьЗначенияСекции(Ини, Секция, Массив = Ложь) Экспорт
СтруктураСекция = Неопределено;
Если Не Ини.Свойство(Секция, СтруктураСекция) Тогда
Возврат Неопределено;
КонецЕсли;
Значения = ?(Массив, Новый Массив, Новый СписокЗначений);
Для Каждого Параметр Из СтруктураСекция Цикл
Значения.Добавить(Параметр.Значение);
КонецЦикла;
Возврат Значения;
КонецФункции
// Возвращает количество параметров в секции или Неопределено, если секция не существует
Функция КоличествоПараметров(Ини, Секция) Экспорт
СтруктураСекция = Неопределено;
Если Не Ини.Свойство(Секция, СтруктураСекция) Тогда
Возврат Неопределено;
КонецЕсли;
Возврат СтруктураСекция.Количество();
КонецФункции
Вобщем смотрите демку. Тестовый INI файл поместите в папку с базой.