INI-Файлы

04.09.15

Разработка - Универсальные функции

Да, устарели. Морально и физически.
Не пинайте, просто понадобилось.

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Демо конфа
.cf 14,80Kb
11
11 Скачать (1 SM) Купить за 1 850 руб.
Демо INI-Файл
.ini 342,89Kb
3
3 Скачать (1 SM) Купить за 1 850 руб.

Перед публикацией прочитал статью "Работа с 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 файл поместите в папку с базой.

ИНИ INI INI-Файл

См. также

Универсальные функции Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Благодаря этим пяти строчкам можно больше не заморачиваться с загрузкой из внешних файлов. Пользуюсь везде, всегда и постоянно.

21.05.2024    23021    dimanich70    81    

147

Универсальные функции Программист Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    4335    3    John_d    11    

57

Универсальные функции Программист Стажер Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    22209    atdonya    25    

58

Универсальные функции Программист Платформа 1С v8.3 Бесплатно (free)

На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.

30.11.2023    5828    ke.92@mail.ru    17    

65

WEB-интеграция Универсальные функции Механизмы платформы 1С Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    15817    YA_418728146    8    

170

Пакетная печать Печатные формы Адаптация типовых решений Универсальные функции Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Абонемент ($m)

Расширение для программ 1С:Управление торговлей, 1С:Комплексная автоматизация, 1С:ERP, которое позволяет распечатывать печатные формы для непроведенных документов. Можно настроить, каким пользователям, какие конкретные формы документов разрешено печатать без проведения документа.

2 стартмани

22.08.2023    3883    62    progmaster    9    

4

Инструментарий разработчика Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 1С:Розница 2 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Абонемент ($m)

Копирует в буфер значения из списков, из ячеек отчетов, таблиц, настроек списков, других отборов и вставляет в выбранную настройку отбора. Работает с Объект не найден. Работает как в одной так и между разными базами 1С. Использует комбинации [Alt+C] Копировать список, [Alt+V] Вставить список. Также для копирования данных используется стандартная [Ctrl+C] (например из открытого xls, mxl, doc и т.п. файла скопировать список наименований)

1 стартмани

13.10.2022    18878    174    sapervodichka    112    

136
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. dmpas 418 11.03.14 13:26 Сейчас в теме
Поддержка INI-файлов выполнена в виде функций общего модуля.

Хм. А поддержка XML выполнена в виде встроенных механизмов платформы.

Единственное оправдание - если INI-файл нужен внешней программе (или клиенту, начальнику...), как например для файла nethasp.ini. Да и в этом случае лично я сделал бы чтение из INI-файла в структуру и запись, соответственно, структуры в INI-файл.
3. gruk 18 11.03.14 17:41 Сейчас в теме
(1) baton_pk,
Да и в этом случае лично я сделал бы чтение из INI-файла в структуру и запись, соответственно, структуры в INI-файл.


я так и сделал, просто статья на скорую руку,может не очень понятно.
Сейчас поправлю.
4. gruk 18 11.03.14 18:35 Сейчас в теме
(2) the1,
пользую IniEdit - плагин для тотал коммандера

Пользую Far Colorer для Far manager :)
5. dmpas 418 11.03.14 21:16 Сейчас в теме
Вот навернёте потом работу с булями, датами, числами, экранирование символов в строках, плюнете и начнёте использовать XML.

Структуру я выбрал из-за удобства работы с ней, несмотря на ограничения, что ключи должны удовлетворять требованиям, предъявляемым к именованию переменных встроенного языка.

Ещё можно воспользоваться Соответствием. Удобств не сильно меньше, просто вместо Ини.Секция.Параметр будет Ини["Секция"]["Параметр"].
6. gruk 18 12.03.14 04:08 Сейчас в теме
(5) baton_pk,
Вот навернёте потом работу с булями, датами, числами, экранирование символов в строках

вы невнимательно читаете статью. були, даты, числа (в разных форматах) и даже двоичные данные (моя инициатива, просто хотел попробовать) сделаны. Просто не оформленны в статье в виде кода. На весь модуль у меня ушло несколько часов
плюнете и начнёте использовать XML.

XML пользую, серьезный обмен данными или сохранение большой кучи настроек без него трудоемко. Но, как вы правильно заметили в (1)
Единственное оправдание - если INI-файл нужен внешней программе (или клиенту, начальнику...)

поэтому не всегда так просто от него откреститься.
7. gruk 18 12.03.14 04:45 Сейчас в теме
Вообще согласен, что поддержка INI на такой мощной и современной платформе выглядит рудиментарно. Правильно, что разработчики ее не сделали (хотя INI парсер есть почти во всех средах разработки), ведь за кажущейся простотой есть куча проблем в виде ограниченности уровней дерева параметров (хотя както был проектик, где пришлось это сделать. Несложно. Получился какойто недоXML), несовместимости и неоднозначности типа хранимых данных. А то пошли бы 1С-ники кто влес, кто по дрова.

Не по 1С:
А лично я до сих пор использую INI файлы для конфигурации устройств на микроконтроллерах собственной разработки.
Плюсы:
1. Парсер пишется просто, занимает мало места в (не резиновой) памяти (по сравнению с XML, или тем более WWW конфигом).
2. Не нужен какойто спец. софт для конфигурирования устройства (как в случае с конфигом в виде бинарника).
3. Редактирование любым подручным средством. Понятная конечному пользователю простая структура.
Минусы:
На слабеньких микроконтроллерах (типа AT90S1200 with 1K Byte of In-System Programmable Flash and 64 Bytes of In-System Programmable EEPROM) парсер и сам INI файл хранить практически не где. Тут только бинарный конфиг.
8. пользователь 01.12.15 13:41
Сообщение было скрыто модератором.
...
9. donhenru 01.12.15 13:41 Сейчас в теме
Зачем пытаться загружать ini-файл в тип данных Структура?! ДеревоЗначений больше подходит. Из-за этого ваш алгоритм спотыкается если группа параметров с пробелами или с точками.

Вот, переделал:

СтруктураИни = Новый ДеревоЗначений;
	СтруктураИни.Колонки.Добавить("Параметр");
	СтруктураИни.Колонки.Добавить("Значение");
	
	Если Кодировка = Неопределено Тогда
		Кодировка = КодировкаТекста.ANSI;
	КонецЕсли;
	Попытка
		ТекстДок = Новый ЧтениеТекста(Файл, Кодировка);
	Исключение
		Возврат Неопределено;
	КонецПопытки;
	
	Группа = Неопределено;
	ВремСтр = ТекстДок.ПрочитатьСтроку();
	НомерСтр = 1;
	Пока ВремСтр <> Неопределено Цикл
		ВремСтр = СокрЛП(ВремСтр);
		Если Лев(ВремСтр, 1) = ";" Или ПустаяСтрока(ВремСтр)  Тогда
			//Закомментированная строка, пропускаем
		ИначеЕсли Лев(ВремСтр, 1) = "[" Тогда
			Если Прав(ВремСтр, 1) <> "]" Тогда
				Если Отладка Тогда
					Сообщить ("Ошибка синтаксиса формата INI: Строка " + НомерСтр);
				КонецЕсли;
				Возврат Неопределено;
			КонецЕсли;
			Группа = Сред(ВремСтр, 2, СтрДлина(ВремСтр) - 2);
			НовГруппа = СтруктураИни.Строки.Добавить();
			НовГруппа.Параметр = Группа;
		Иначе
			ПозицияРавно = Найти(ВремСтр, "=");
			Если Группа = Неопределено ИЛИ ПозицияРавно = 0 Тогда
				Если Отладка Тогда
					Сообщить("Ошибка синтаксиса формата INI: Строка " + НомерСтр);
				КонецЕсли;
				Возврат Неопределено;
			КонецЕсли;
			Значение = Сред(ВремСтр, ПозицияРавно + 1);
			НовПараметр = НовГруппа.Строки.Добавить();
			НовПараметр.Параметр = Лев(ВремСтр, ПозицияРавно - 1);
			НовПараметр.Значение = ?(ПустаяСтрока(Значение), Неопределено, Значение);
		КонецЕсли;
		
		ВремСтр = ТекстДок.ПрочитатьСтроку();
		НомерСтр = НомерСтр + 1;
	КонецЦикла;
	Возврат СтруктураИни;
Показать
10. gruk 18 02.12.15 08:03 Сейчас в теме
(9) donhenru, Спасибо
У меня тоже как-то попался файл с именем параметра не "ВСтилеИмен1С", переделывал структуру на соответствие. А с деревом работать неудобно, нельзя обратиться ИНИ.ИмяСекции.ИмяПараметра
Оставьте свое сообщение