Сортируем ДанныеФормыДерево на клиенте
Разработка - Работа с интерфейсом
У ДанныеФормыКоллекция для сортировки есть специальный метод Сортировать(). Он доступен на клиенте и, хоть и делает вызов сервера, но, по понятным причинам, срабатывает крайне быстро.
А вот ДанныеФормыДерево платформа обделила такой возможностью. Вместо этого программисты обычно переходят «на сервер», преобразуют ДанныеФормыДерево в полноценное ДеревоЗначений, сортируют и преобразуют обратно.
ДеревоЗначений = ДанныеФормыВЗначение(ДанныеФормыДерево, Тип("ДеревоЗначений"));
ДеревоЗначений.Строки.Сортировать("КолонкиСортировки", Истина);
ЗначениеВДанныеФормы(ДанныеФормыДерево, ДеревоЗначений);
А ведь существуют ситуации, когда перебрасывать данные всей формы «на сервер» значительно затратнее, чем, оставаясь «на клиенте», отсортировать десяток строчек.
Для реализации Менеджер открытых форм опробовал разные алгоритмы сортировки ДанныеФормыДерево, доступные на клиенте. В результате, остановился на этом, что помогло ускорить открытие формы обработки в 2,5 раза.
Выкладываю процедуру. Она поможет в тех случаях, когда вам явно по одной колонке отсортировать коллекцию. Если будет ясно, что метод нуждается в расширении возможностей, то процедура со временем доработается и статья обновится.
P.S.: Есть альтернативные варианты процедуры? Выкладывайте в комментариях. Если наберётся достаточное количество интересных методов, то после можем провести нагрузочное тестирование, выложить результаты сравнения и выбрать процедуру-победитель.
&НаКлиентеНаСервереБезКонтекста
Процедура СортироватьДанныеФормыДерево(КоллекцияСортировки, КолонкаСортировки, ВключатьПодчиненные = Ложь)
КоллекцияСтрок = КоллекцияСортировки.ПолучитьЭлементы();
СортироватьДанныеФормыКоллекция(КоллекцияСтрок, КолонкаСортировки);
Если ВключатьПодчиненные Тогда
Для Каждого ТекущаяСтрока Из КоллекцияСтрок Цикл
СортироватьДанныеФормыДерево(ТекущаяСтрока, КолонкаСортировки, ВключатьПодчиненные);
КонецЦикла;
КонецЕсли;
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
Процедура СортироватьДанныеФормыКоллекция(КоллекцияСтрок, КолонкаСортировки)
ПараметрыЗначений = Новый Соответствие;
СортированныеЗначения = Новый СписокЗначений;
Для Каждого ТекущаяСтрока Из КоллекцияСтрок Цикл
ТекущееЗначение = ТекущаяСтрока[КолонкаСортировки];
ПараметрыЗначения = ПараметрыЗначений.Получить(ТекущееЗначение);
Если ПараметрыЗначения = Неопределено Тогда
ПараметрыЗначения = Новый Массив;
ПараметрыЗначений.Вставить(ТекущееЗначение, ПараметрыЗначения);
СортированныеЗначения.Добавить(ТекущееЗначение);
КонецЕсли;
ПараметрыЗначения.Добавить(ТекущаяСтрока);
КонецЦикла;
СортированныеЗначения.СортироватьПоЗначению(НаправлениеСортировки.Возр);
НовыйИндекс = 0;
Для Каждого ТекущееЗначение Из СортированныеЗначения Цикл
МассивСтрок = ПараметрыЗначений.Получить(ТекущееЗначение.Значение);
Для Каждого ТекущаяСтрока Из МассивСтрок Цикл
ТекущийИндекс = КоллекцияСтрок.Индекс(ТекущаяСтрока);
ШагСдвига = НовыйИндекс - ТекущийИндекс;
Если НЕ ШагСдвига = 0 Тогда
КоллекцияСтрок.Сдвинуть(ТекущийИндекс, ШагСдвига);
КонецЕсли;
НовыйИндекс = НовыйИндекс + 1;
КонецЦикла;
КонецЦикла;
КонецПроцедуры
Вступайте в нашу телеграмм-группу Инфостарт
УФ Сортировка Дерево ДанныеФормыДерево
Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».
- 0% комиссии — оплата напрямую исполнителю;
- Исполнители любого масштаба — от отдельных специалистов до команд под проект;
- Прямой обмен контактами между заказчиком и исполнителем;
- Безопасная сделка — при необходимости;
- Рейтинги, кейсы и прозрачная система откликов.
См. также
Работа с интерфейсом Анализ учета Мониторинг 1С:Предприятие 8 1С 8.3 1C:Бухгалтерия 1С:Бухгалтерия 3.0 1С:ERP Управление предприятием 2 1С:Управление холдингом 1С:Зарплата и Управление Персоналом 3.x 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Управление торговлей 11 Платные (руб)
Создайте свой функциональный интерфейс в любой конфигурации 1С с помощью расширения Infostart Dashboard. Настраивайте панели виджетов с метриками, индикаторами и показателями на начальном экране. Узнайте возможность внедрения подсистемы у себя в конфигурации с помощью бесплатной обработки "Анализ внедрения подсистемы 1С Infostart Dashboard"!
31720 руб.
27.03.2025 92221 69 44
Универсальные функции 1С 8.3 1С:Документооборот Россия Платные (руб)
ДО+ — расширение конфигурации, в котором собран постоянно пополняемый набор из 33 востребованных доработок для 1С:Документооборот КОРП 3.0: согласование задач прямо из мессенджеров MAX и Telegram, отзыв согласования и исполнения, гибкие повторные круги, эскалация с точностью до минут, контроль исполнительской дисциплины, выгрузка вложений в ZIP и склейка PDF, реестр документов в Excel, проверка дублей контрагентов и регистрационных номеров. Каждая возможность активируется отдельным флажком в режиме предприятия — включается только то, что нужно конкретной организации. Список функций расширяется с каждым релизом — текущая версия 2.1.0. Режим AddOn: типовая конфигурация не модифицируется, обновления ДО ставятся штатно, дополнительные лицензии и внешние компоненты не требуются. Внедрение силами администратора — около часа.
30000 руб.
09.07.2026 1396 1 0
Консолидация данных Работа с интерфейсом Разработчик Пользователь 1С:Предприятие 8 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 1C:ERP Узбекистан Беларусь Кыргызстан Россия Казахстан Платные (руб)
Знакомая ситуация? Пользователи, особенно менеджеры, уверены: отборов много не бывает. Идут пожелания добавить в форму списка еще один быстрый фильтр, еще два, еще пять... В итоге интерфейс превращается в нагромождение полей отбора, а потребность в «самом главном» отборе, который «вот прямо сейчас нужен», все равно не закрыта. Универсальное расширение, которое решает эту проблему элегантно и технологично. С его помощью в любую форму списка можно легко добавить панель настраиваемых кнопок-закладок, каждая из которых применяет сложный фильтр-запрос, а так же показывает актуальное количество элементов в реальном времени.
6088 руб.
17.10.2025 3636 3 0
Разработка Инструментарий разработчика Работа с интерфейсом Адаптация типовых решений Нейросети 1C:Бухгалтерия 1C:ERP 1С:ЗУП 1С:КА 1С:УНФ 1С:УТ 1С:Розница 1С:ДО 1С:ERP Управление предприятием 2 Платные (руб)
Разработка "Дизайнер форм 1С" реализована в виде расширения 1С и является универсальным инструментом для разработки прототипа форм с целью демонстраций, технических заданий и т.д. Без участия разработчика с возможностью экспорта в файл внешней обработки и генерации формы используя искусственный интеллект.
36600 руб.
28.08.2025 10306 2 2
Универсальные функции Разработчик 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)
Благодаря этим пяти строчкам можно больше не заморачиваться с загрузкой из внешних файлов. Пользуюсь везде, всегда и постоянно.
21.05.2024 68726 dimanich70 87
WEB-интеграция Универсальные функции Механизмы платформы 1С Разработчик 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)
При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.
28.08.2023 32079 YA_418728146 8
Пакетная печать Печатные формы Адаптация типовых решений Универсальные функции 1С:Предприятие 8 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Абонемент ($m)
Расширение для программ 1С:Управление торговлей, 1С:Комплексная автоматизация, 1С:ERP, которое позволяет распечатывать печатные формы для непроведенных документов. Можно настроить, каким пользователям, какие конкретные формы документов разрешено печатать без проведения документа.
2 стартмани
22.08.2023 10289 121 progmaster 23
Работа с интерфейсом Разработчик 1С:Предприятие 8 1C:Бухгалтерия Абонемент ($m)
"MVC плохо применима в 1С" - познакомьтесь с моделью состояния и, возможно, ваше мнение поменяется! Представленное решение является эволюционным развитием идеи реализации MVC для 1С. В новой версии добавлены DSL для описания модели состояния, а также параметризация свойств параметров и элементов формы.
1 стартмани
05.07.2022 17933 kalyaka 8
Проверяли так - генерили примитивную таблицу формы из рандомных чисел, а потом сортировали. Перебирали разные алгоритмы. Этим добились того, что 1000 элементов таблицы с рандомными числами диапазоном до 1000 сортируются меньше секунды. 10 000 строк с рандомом до 10 000 тратит время на сортировку ≈ 3 секунды.
Этой скорости нам достаточно для реализации механизма, где не будет больших объемов строк. Если же дерево более большое, то тут есть много факторов. Скорость клиентской машины, объём других данных на форме (помимо дерева) и так далее.
+ заметили в некоторых ситуациях такую вещь, что перепрыгивание на сервер иногда занимает совершенно неразумное время. Доходило до абсурдного, что для редактирования таблицы данных на сервере, приходилось использовать бесконтекстный вызов сервера, а передавать туда массив со структурами, обрабатывать там в ТЗ, корректировать,обратно превращать в массив со структурами, возвращать как результат функции, а далее уже на клиенте содержимое помещать в таблицу формы. Костыль редкостный, но увеличивал скорость работы в несколько раз.
Попробуем проанализировать ситуацию, если что-то интересное - будет статья.
Да, скорее всего не так классно будет.
Просто в разработке сортировок по ссылке стараемся максимально избегать. Даже уже привык сортировать по примитивным типам, которые заранее готовятся специально.
Однако, в данном алгоритме именно сортировка используется только один раз на уровень дерева - СортироватьПоЗначению(). Метод платформенный, никаких "ручных" сравнений нет. Но потестировать нужно, интересно
(8)
Проверил на ссылке. Добавил ссылочную колонку в таблицу формы. Заполнил таблицу ссылками на существующие документы (выбрал первые 10 000 документов и разбросал рандомно по таблице). Сортировка заняла 4 секунды и счётчик вызовов не показал.
Скорее всего СписокЗначений.СортироватьПоЗначению() использует ГУИДы, а не представления, поэтому обращений на сервер и не требовалось
Если у вас есть процедура быстрее, то выкладывайте. Хочется найти "самую-самую" и закрепить в статье.
Когда появится время, сделаю специальный инструмент для удобного тестирования методов сортировки. Чтобы можно было свою процедуру легко вставить и гонять по скорости
Вообще, какой-нибудь конкурс устроить. Пусть и символический.
И обработку общую сделать. Для теста с генерацией данных.
Все данные в ячейках я вношу в data-attribute, которые легализованы в HTML5. Чтобы метод sort() работал так, как мне надо -- данные привожу в к нижнему регистру и заменяю кавычки на апострофы, чтобы не возникла конфликта на уровне HTML.
СписокЗначенийСортировки = Новый СписокЗначений;
ДеревоДляСортировки = ДеревоСФормы.ПолучитьЭлементы();
Счетчик = 0;
Для Каждого СтрокаДерева Из ДеревоДляСортировки Цикл
СписокЗначенийСортировки.Добавить(СтрокаДерева.ОсновнаяСистема, Счетчик);
Счетчик = Счетчик + 1;
КонецЦикла;
СписокЗначенийСортировки.СортироватьПоЗначению();
НеобходимыйНомерСтроки = 0;
СмещениеВниз = 0;
Для Каждого ЗначениеСортировки Из СписокЗначенийСортировки Цикл
ТекущийНомерСтроки = Число(ЗначениеСортировки.Представление);
Если ТекущийНомерСтроки < НеобходимыйНомерСтроки Тогда
ТекущийНомерСтроки = ТекущийНомерСтроки + СмещениеВниз;
КонецЕсли;
Если ТекущийНомерСтроки <> НеобходимыйНомерСтроки Тогда
ДеревоДляСортировки.Сдвинуть(ТекущийНомерСтроки, НеобходимыйНомерСтроки - ТекущийНомерСтроки);
СмещениеВниз = СмещениеВниз + 1;
КонецЕсли;
НеобходимыйНомерСтроки = НеобходимыйНомерСтроки + 1;
КонецЦикла; Показать&НаКлиентеНаСервереБезКонтекста
Процедура СортироватьДанныеФормыДерево(КоллекцияСортировки, КолонкаСортировки, ВключатьПодчиненные = Ложь, ПоВозрастанию = Истина)
КоллекцияСтрок = КоллекцияСортировки.ПолучитьЭлементы();
СортироватьДанныеФормыКоллекция(КоллекцияСтрок, КолонкаСортировки, ПоВозрастанию);
Если ВключатьПодчиненные Тогда
Для Каждого ТекущаяСтрока Из КоллекцияСтрок Цикл
СортироватьДанныеФормыДерево(ТекущаяСтрока, КолонкаСортировки, ВключатьПодчиненные, ПоВозрастанию);
КонецЦикла;
КонецЕсли;
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
Процедура СортироватьДанныеФормыКоллекция(КоллекцияСтрок, КолонкаСортировки, ПоВозрастанию = Истина)
ПараметрыЗначений = Новый Соответствие;
СортированныеЗначения = Новый СписокЗначений;
Для Каждого ТекущаяСтрока Из КоллекцияСтрок Цикл
ТекущееЗначение = ТекущаяСтрока[КолонкаСортировки];
ПараметрыЗначения = ПараметрыЗначений.Получить(ТекущееЗначение);
Если ПараметрыЗначения = Неопределено Тогда
ПараметрыЗначения = Новый Массив;
ПараметрыЗначений.Вставить(ТекущееЗначение, ПараметрыЗначения);
СортированныеЗначения.Добавить(ТекущееЗначение);
КонецЕсли;
ПараметрыЗначения.Добавить(ТекущаяСтрока);
КонецЦикла;
СортированныеЗначения.СортироватьПоЗначению(?(ПоВозрастанию, НаправлениеСортировки.Возр, НаправлениеСортировки.Убыв));
НовыйИндекс = 0;
Для Каждого ТекущееЗначение Из СортированныеЗначения Цикл
МассивСтрок = ПараметрыЗначений.Получить(ТекущееЗначение.Значение);
Для Каждого ТекущаяСтрока Из МассивСтрок Цикл
ТекущийИндекс = КоллекцияСтрок.Индекс(ТекущаяСтрока);
ШагСдвига = НовыйИндекс - ТекущийИндекс;
Если НЕ ШагСдвига = 0 Тогда
КоллекцияСтрок.Сдвинуть(ТекущийИндекс, ШагСдвига);
КонецЕсли;
НовыйИндекс = НовыйИндекс + 1;
КонецЦикла;
КонецЦикла;
КонецПроцедуры ПоказатьНу и в друг, кому будет нужно:
Объясните кусок кода:
Для Каждого ТекущаяСтрока Из КоллекцияСтрок Цикл
ТекущееЗначение = ТекущаяСтрока[КолонкаСортировки];
ПараметрыЗначения = ПараметрыЗначений.Получить(ТекущееЗначение);
Если ПараметрыЗначения = Неопределено Тогда
ПараметрыЗначения = Новый Массив;
ПараметрыЗначений.Вставить(ТекущееЗначение, ПараметрыЗначения);
СортированныеЗначения.Добавить(ТекущееЗначение);
КонецЕсли;
ПараметрыЗначения.Добавить(ТекущаяСтрока);
КонецЦикла; ПоказатьДля чего здесь массив ПараметрыЗначения? Он ведь постоянно создаётся новый. Потом вставляется в ПараметрыЗначений этот пустой массив, а только потом в него добавляется элемент. И опять новый массив. Мне кажется тут что-то лишнее. Если нет, объясните, что в нём и зачем он в дальнейшем?
Ага, именно так)
Мы создаём массив. И 1С размещает его где-то в памяти, а нам в переменную отдаёт ссылку на массив.
Мы эту ссылку помещаем в соответствие. И если где-то в коде (где угодно) мы этот массив изменим, то и в соответствии он изменится. Потому что там лежит ссылка на оригинал, который мы меняем (так же по ссылке).
В функциональном стиле:
ОтсортированныеЭлементыДерева = атдМассив
.Массив(ЭлементыДерева)
.СортироватьПо("Наименование")
.ВМассив()
;
ОтсортированныеЭлементыДерева = ОбщегоНазначенияКлиентСервер.СкопироватьМассив(ЭлементыДерева);
РаботаСМассивом.СортироватьПо(ОтсортированныеЭлементыДерева, "Наименование");
В процедурном варианте объект вообще не создается.
Вместо Выполнить() используется Вычислить(). Разница не только в том, что вторая использует выражение, но и в том, что Вычислить() работает на всех клиентах в отличии от Выполнить().
Пожертвовав универсальностью можно заменить Вычислить() на функцию "Сравнить(А.Наименование, Б.Наименование)", быстродействие процентов на 20% примерно прибавится.
Вот что у меня получилось для двух алгоритмов: нативный и ваш:
---
Вариант нативно 2: 13 мс
Вариант нативно 2: 12 мс
Вариант нативно 2: 9 мс
Вариант нативно 2: 9 мс
Вариант нативно 2: 8 мс
Вариант список значений: 10 мс
Вариант список значений: 12 мс
Вариант список значений: 13 мс
Вариант список значений: 13 мс
Вариант список значений: 10 мс
---
Функция Сравнить(А, Б)
Если А = Б Тогда
Возврат 0;
КонецЕсли;
Если А < Б Тогда
Возврат -1;
КонецЕсли;
Возврат 1;
КонецФункции
ПоказатьВидно, что мой алгоритм даже работает быстрее. В моем алгоритме нет лишнего преобразования в массив, а алгоритм сортировки использован "Быстрая сортировка" (в платформе скорее всего такой же).
Но, здесь я использовал жестко заданное поле "Наименование" (можно любое другое, важно, что в алгоритме оно жестко прописывается). Поле можно передавать в функцию, тогда вызов будет "Сравнить(А[Поле], Б[Поле])" - скорость почти прежняя.
Ок, можно расширить количество полей сортировки, для этого нужно заменить на функцию СравнитьПо(А, Б, Поля). Вот что у меня получилось для полей сортировки "ВидНоменклатуры, Наименование":
---
Вариант нативно 3: 9 мс
Вариант нативно 3: 15 мс
Вариант нативно 3: 15 мс
Вариант нативно 3: 15 мс
Вариант нативно 3: 15 мс
---
Функция СравнитьПо(А, Б, Поля)
Для Каждого Поле Из СтрРазделить(Поля, ", ", Ложь) Цикл
Результат = Сравнить(А[Поле], Б[Поле]);
Если Результат < 0 Тогда
Возврат -1;
ИначеЕсли Результат > 0 Тогда
Возврат 1;
КонецЕсли;
КонецЦикла;
Возврат 0;
КонецФункции
ПоказатьЧто ж, результат немного хуже, но достаточно близок к вашему варианту. Однако этот алгоритм не имеет ограничения по количеству полей сортировки и он достаточно быстрый.
К этому посту прикреплена демо-обработка, запускать в демо-базе.
с использованием приоритетной очереди
ОтсортированныеЭлементыДерева = Новый Массив;
Для Каждого ЭлементДерева Из ЭлементыДерева Цикл
РаботаСМассивом.ПоложитьВОчередьСПриоритетом(ОтсортированныеЭлементыДерева, ЭлементДерева, "Сравнить(А.Наименование, Б.Наименование)");
КонецЦикла;
&НаКлиенте
Процедура СортироватьЭлементыНативно(Элементы, ВыражениеПредиката, НижнийПредел, ВерхнийПредел)
Начало = НижнийПредел;
Конец = ВерхнийПредел;
Б = Элементы[Цел((Начало + Конец)/2)];
Пока Истина Цикл
А = Элементы[Начало];
Пока Вычислить(ВыражениеПредиката) < 0 Цикл // Элементы[Начало] < Б
Начало = Начало + 1;
А = Элементы[Начало];
КонецЦикла;
А = Элементы[Конец];
Пока Вычислить(ВыражениеПредиката) > 0 Цикл // Элементы[Конец] > Б
Конец = Конец - 1;
А = Элементы[Конец];
КонецЦикла;
Если Начало <= Конец Тогда
// Дерево значений
// Начало -> Конец
// Конец -> Начало
ШагСдвига = Конец - Начало;
Если НЕ ШагСдвига = 0 Тогда
Элементы.Сдвинуть(Начало, ШагСдвига);
ШагСдвига = ШагСдвига - 1;
Если НЕ ШагСдвига = 0 Тогда
Элементы.Сдвинуть(Конец - 1, -ШагСдвига);
КонецЕсли;
КонецЕсли;
// Дерево значений
Начало = Начало + 1;
Конец = Конец - 1;
КонецЕсли;
Если Начало > Конец Тогда
Прервать;
КонецЕсли;
КонецЦикла;
Если НижнийПредел < Конец Тогда
СортироватьЭлементыНативно(Элементы, ВыражениеПредиката, НижнийПредел, Конец);
КонецЕсли;
Если Начало < ВерхнийПредел Тогда
СортироватьЭлементыНативно(Элементы, ВыражениеПредиката, Начало, ВерхнийПредел);
КонецЕсли;
КонецПроцедуры Показать Строки = КоллекцияСтрокДерева;
Список = Новый СписокЗначений;
Для Сч = 0 По Строки.Количество() - 1 Цикл
Список.Добавить(Сч, Строки[Сч].Имя);
КонецЦикла;
Список.СортироватьПоПредставлению();
Для Сч = 0 По Список.Количество() - 1 Цикл
ИндексСтрокиДерева = Список[Сч].Значение;
Строки.Сдвинуть(ИндексСтрокиДерева, Сч - ИндексСтрокиДерева);
Для каждого Эл Из Список Цикл
Если Эл.Значение < ИндексСтрокиДерева Тогда
Эл.Значение = Эл.Значение + 1;
КонецЕсли;
КонецЦикла;
КонецЦикла;
ПоказатьЯ победил ))
&НаКлиенте
Процедура СортироватьДерево(КолонкаСортировки)
Строки = Дерево.ПолучитьЭлементы();
Список = Новый СписокЗначений;
Для Сч = 0 По Строки.Количество() - 1 Цикл
Список.Добавить(Сч, Строки[Сч][КолонкаСортировки]);
КонецЦикла;
Список.СортироватьПоПредставлению();
Для Сч = 0 По Список.Количество() - 1 Цикл
ИндексСтрокиДерева = Список[Сч].Значение;
Если Сч = ИндексСтрокиДерева Тогда Продолжить КонецЕсли;
Строки.Сдвинуть(ИндексСтрокиДерева, Сч - ИндексСтрокиДерева);
Для каждого Эл Из Список Цикл
Если Эл.Значение < ИндексСтрокиДерева Тогда
Эл.Значение = Эл.Значение + 1;
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецПроцедуры ПоказатьВы можете заказать платную консультацию или разработку у автора. Будет создан приватный заказ на «Бирже заказов» для автора.
№ 1078137
Создание 18.06.19 01:22
Обновление 10.09.20 16:01
Просмотры 23766
Загрузки 0
Рейтинг
58
Комментарии 39
Код открыт Да
Рубрики Универсальные функции Работа с интерфейсом
Кому Разработчик
Тип файла Нет файла
Платформа 1С:Предприятие 8
Конфигурация 1C:Бухгалтерия
Операционная система Не имеет значения
Страна Не имеет значения
Отрасль Не имеет значения
Налоги Не имеет значения
Вид учета Не имеет значения
Доступ к файлу Бесплатно (free)