Программное добавление элементов на управляемую форму
Разработка - Работа с интерфейсом
Файлы
ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.
Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний
Оформите подписку на компанию для решения рабочих задач
Оформить подписку и скачать решение со скидкойВы можете заказать платную доработку или адаптацию этой разработки под вашу конфигурацию на «Бирже заказов».
- 0% комиссии — оплата напрямую исполнителю;
- Исполнители любого масштаба — от отдельных специалистов до команд под проект;
- Прямой обмен контактами между заказчиком и исполнителем;
- Безопасная сделка — при необходимости;
- Рейтинги, кейсы и прозрачная система откликов.
Преимущества программной доработки форм:
- Можно использовать в расширениях
- Легко копировать / переносить доработки
- Различия видны при сравнении конфигурации
- Легче производить обновление конфигурации
В данном примере все элементы формы будут добавлены в событии формы ПриСозданииНаСервере()
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
//Добавление команды формы
Команда = Команды.Добавить(
"ПоказатьПредупреждение"); //Имя команды
Команда.Заголовок = "Показать предупреждение";
Команда.Действие = "КомандаПоказатьПредупреждение"; //Имя связанной процедуры
//Полный перечень свойств команды в синтакс-помощнике
// Интерфейс (управляемый)->Форма клиентского приложения->КомандаФормы
//Добавление кнопки формы
КнопкаФормы = Элементы.Добавить(
"КнопкаПоказатьПредупреждение", //Имя кнопки
Тип("КнопкаФормы"), //Тип, всегда КнопкаФормы
ЭтаФорма); //Контейнер для кнопки (Форма, Группа, Командная панель)
КнопкаФормы.ИмяКоманды = "ПоказатьПредупреждение"; //Связь с командой по имени
//Возможные варианты вида кнопки:
// -Гиперссылка
// -ГиперссылкаКоманднойПанели
// -КнопкаКоманднойПанели
// -ОбычнаяКнопка
//Если контейнер для формы - командная панель
//то вид кнопки должен быть КнопкаКоманднойПанели
КнопкаФормы.Вид = ВидКнопкиФормы.ОбычнаяКнопка;
//Полный перечень свойств кнопки формы в синтакс-помощнике
// Интерфейс (управляемый)->Кнопка формы
КонецПроцедуры
//Процедура вызываемая командой "ПоказатьПредупреждение"
&НаКлиенте
Процедура КомандаПоказатьПредупреждение(Команда)
ПоказатьПредупреждение(, "ОК!");
КонецПроцедуры
//Пример:
//Добавление поля ввода для реквизита объекта "Комментарий"

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ПолеВвода = Элементы.Добавить(
"Комментарий", //Имя элемента формы
Тип("ПолеФормы"), //Тип, всегда ПолеФормы
ЭтаФорма); //Контейнер для поля ввода (Форма,Группа,Страница)
ПолеВвода.Заголовок = "Комментарий";
ПолеВвода.Вид = ВидПоляФормы.ПолеВвода;
//Установка связи элемента с данными
ПолеВвода.ПутьКДанным = "Объект.Комментарий";
//Можно добавить обработчик события
//См. синтакс-помощник чтобы узнать список событий
// Интерфейс (управляемый) -> Поле формы -> ПолеФормы -> События
// а так же остальные варианты расширения поля формы в зависимости от вида кнопки
// Интерфейс (управляемый) -> Поле формы -> Расширение поля ввода -> События
// и прочее
ПолеВвода.УстановитьДействие(
"ПриИзменении", //Имя события
"ПриИзмененииКомментария"); //Имя процедуры обработчика
КонецПроцедуры
&НаКлиенте
Процедура ПриИзмененииКомментария(Элемент)
Сообщить("Поле ""Комментарий"" изменено!");
КонецПроцедуры
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
//Пример:
//Добавление реквизита с именем "АдресДоставки", тип Строка
ДобавляемыеРеквизиты = Новый Массив;
ТипРеквизита = Новый ОписаниеТипов("Строка");
РеквизитФормы = Новый РеквизитФормы(
"АдресДоставки", //Имя реквизита формы
ТипРеквизита, //Тип
"", //Путь (Пусто, "Объект", ИмяТЧ)
// например "Объект.Товары"
"Адрес доставки");//Заголовок
ДобавляемыеРеквизиты.Добавить(РеквизитФормы);
//Заставляем форму создать новые реквизиты
ИзменитьРеквизиты(ДобавляемыеРеквизиты);
//Обращение к реквизиту формы из кода
ЭтаФорма.АдресДоставки = "ул. Пушкина";
//Вывод реквизита на форму (при необходимости)
ПолеВвода = Элементы.Добавить("ФормаАдресДоставки", Тип("ПолеФормы"), ЭтаФорма);
ПолеВвода.Вид = ВидПоляФормы.ПолеВвода;
ПолеВвода.ПутьКДанным = "АдресДоставки";
КонецПроцедуры
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
//Пример:
//Добавление группы формы
//Добавление элементов в группу формы
Группа = Элементы.Добавить(
"ГруппаШапка",
Тип("ГруппаФормы"),
ЭтаФорма);
Группа.Вид = ВидГруппыФормы.ОбычнаяГруппа;
Группа.Заголовок = "Реквизиты объекта:";
//Добавить поле ввода в группу
ПолеВвода = Элементы.Добавить("ФормаКомментарий", Тип("ПолеФормы"), Группа);
ПолеВвода.Вид = ВидПоляФормы.ПолеВвода;
ПолеВвода.ПутьКДанным = "Объект.Комментарий";
КонецПроцедуры
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
//Пример:
//Добавление группы страниц
//Добавление страниц
//Добавление элементов на страницы
СтраницыФормы = Элементы.Добавить(
"СтраницыФормы",
Тип("ГруппаФормы"),
ЭтаФорма);
СтраницыФормы.Вид = ВидГруппыФормы.Страницы;
//Подключить обработчик при смене страницы
СтраницыФормы.УстановитьДействие("ПриСменеСтраницы", "ДействиеПриСменеСтраницы");
//Добавление 1-й страницы
СтраницаФормы1 = Элементы.Добавить(
"Страница1",
Тип("ГруппаФормы"),
СтраницыФормы);
СтраницаФормы1.Вид = ВидГруппыФормы.Страница;
СтраницаФормы1.Заголовок = "Первая страница";
//Добавление 2-й страницы
СтраницаФормы2 = Элементы.Добавить(
"Страница2",
Тип("ГруппаФормы"),
СтраницыФормы);
СтраницаФормы2.Вид = ВидГруппыФормы.Страница;
СтраницаФормы2.Заголовок = "Вторая страница";
//Добавить поле ввода на страницу 1
ПолеВвода = Элементы.Добавить("ФормаКомментарий", Тип("ПолеФормы"), СтраницаФормы1);
ПолеВвода.Вид = ВидПоляФормы.ПолеВвода;
ПолеВвода.ПутьКДанным = "Объект.Комментарий";
//Добавить поле ввода на страницу 2
ПолеВвода = Элементы.Добавить("ФормаКомментарий2", Тип("ПолеФормы"), СтраницаФормы2);
ПолеВвода.Вид = ВидПоляФормы.ПолеВвода;
ПолеВвода.ПутьКДанным = "Объект.Комментарий";
КонецПроцедуры
&НаКлиенте
Процедура ДействиеПриСменеСтраницы(Элемент)
Сообщить("Изменена страница");
КонецПроцедуры
Обработка тестировалась на релизе платформы 8.3.13.1513.
Вступайте в нашу телеграмм-группу Инфостарт
См. также
Работа с интерфейсом Анализ учета Мониторинг 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 92356 69 44
Консолидация данных Работа с интерфейсом Разработчик Пользователь 1С:Предприятие 8 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 1C:ERP Узбекистан Беларусь Кыргызстан Россия Казахстан Платные (руб)
Знакомая ситуация? Пользователи, особенно менеджеры, уверены: отборов много не бывает. Идут пожелания добавить в форму списка еще один быстрый фильтр, еще два, еще пять... В итоге интерфейс превращается в нагромождение полей отбора, а потребность в «самом главном» отборе, который «вот прямо сейчас нужен», все равно не закрыта. Универсальное расширение, которое решает эту проблему элегантно и технологично. С его помощью в любую форму списка можно легко добавить панель настраиваемых кнопок-закладок, каждая из которых применяет сложный фильтр-запрос, а так же показывает актуальное количество элементов в реальном времени.
6088 руб.
17.10.2025 3673 3 0
Разработка Инструментарий разработчика Работа с интерфейсом Адаптация типовых решений Нейросети 1C:Бухгалтерия 1C:ERP 1С:ЗУП 1С:КА 1С:УНФ 1С:УТ 1С:Розница 1С:ДО 1С:ERP Управление предприятием 2 Платные (руб)
Разработка "Дизайнер форм 1С" реализована в виде расширения 1С и является универсальным инструментом для разработки прототипа форм с целью демонстраций, технических заданий и т.д. Без участия разработчика с возможностью экспорта в файл внешней обработки и генерации формы используя искусственный интеллект.
36600 руб.
28.08.2025 10372 2 2
Работа с интерфейсом Разработчик Стажер 1С:Предприятие 8 Бесплатно (free)
Это инструкция по дизайну форм в среде 1С. Гайд охватывает рекомендации и стандарты для оптимизации пользовательского интерфейса. В гайде содержатся указания по использованию элементов интерфейса, включая как основные, так и продвинутые аспекты. Предоставляются также примеры и антипримеры для наглядного понимания принципов дизайна
20.08.2024 57449 mrXoxot 44
Работа с интерфейсом Разработчик 1С:Предприятие 8 Бесплатно (free)
Пример простого и симпатичного прогресс-бара в динамическом списке, без картинок, используя редактирование запроса.
27.05.2024 30015 smielka 39
Инструментарий разработчика Работа с интерфейсом Разработчик 1С 8.3 Абонемент ($m)
Подходит для создания web-страниц для замены управляемых форм 1С, красивых отчетов, интерфейса мобильного приложения на платформе 1С и для простых страниц веб-сайтов.
1 стартмани
10.04.2023 19491 190 acces969 31
Работа с интерфейсом Разработчик 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)
Питничная фантазия на возможности в разработке интерфейсов формы с помощью Платформы 1С - делаем свою подсказку. Публикация содержит готовую библиотеку программного формирования данной подсказки.
12.08.2022 16979 top_1c 39
Работа с интерфейсом Разработчик 1С:Предприятие 8 1C:Бухгалтерия Абонемент ($m)
"MVC плохо применима в 1С" - познакомьтесь с моделью состояния и, возможно, ваше мнение поменяется! Представленное решение является эволюционным развитием идеи реализации MVC для 1С. В новой версии добавлены DSL для описания модели состояния, а также параметризация свойств параметров и элементов формы.
1 стартмани
05.07.2022 17979 kalyaka 8
Я давно перешел на такой способ добавления реквизитов на форму (в шапки документа, в табличную часть). Правда основной кусок кода выносится в Общие модули.
Тоже элементы добавляю программно. При сравнении-объединении сразу видны изменения. И не нужно потом еще форму руками менять.
/Можно добавить обработчик события
//См. синтакс-помощник чтобы узнать список событий
// Интерфейс (управляемый) -> Поле формы -> ПолеФормы -> События
// а так же остальные варианты расширения поля формы в зависимости от вида кнопки
// Интерфейс (управляемый) -> Поле формы -> Расширение поля ввода -> События
// и прочее
ПолеВвода.УстановитьДействие(
"ПриИзменении", //Имя события
"ПриИзмененииКомментария"); //Имя процедуры обработчика
Если есть какой-то способ обойти это "ограничение" - буду рад если поделитесь со мной.
Кнопка = Элементы.Добавить("МояКнопка", Тип("ДекорацияФормы"), ЭтотОбъект);
Кнопка.Заголовок = Новый ФорматированнаяСтрока(НСтр("ru = 'Сотрудники.'"),,,, "e1cib/command/Справочник.Команда.СотрудникиВнештатные");Подключаемый_ВыполнитьПереопределяемуюКоманду(Команда)
которая ведет в общий модуль СобытияФормКлиент.ВыполнитьПереопределяемуюКоманду
Там в свою очередь, есть вызов ОбщегоМодуля МодификацияКонфигурацииКлиентПереопределяемый.ВыполнитьПереопределяемуюКоманду(Форма, Команда, ДополнительныеПараметры);
где по имени команды и формы, можно определить свою, и напилить свои обработчики.
В итоге, получим абсолютно неизмененный объект, на поддержке...но в нем, программно добавленная кнопка и свой обработчик событий...
единственное, что у некоторых элементов параметров, предполагается много...и они как бы будут недоступны..но тут приходится или маневры искать, или немного усовершенствовать.. но в простых случаях, вполне себе все решаемо
Но если копнуть глубже, и рассматривать некую систему в которой есть оснастка, в которую разные модули (подсистемы) добавляют нужные им элементы управления (списки, диаграммы, таблицы со связью один ко многим и т.п.). Да еще и замахнуться на механику, когда пользователь сам решает какие модули и подсистемы ему нужны... Другими словами, разработать решение в стиле "плагинов" как во всяких там WinAmp-ах и прочих модных штуках. И тут получается нужно в форме-оснастке предусмотреть все возможные типы событий (который на ИТС кстати рекомендуют обрамлять префиксом "Подключаемый_"), а потом еще и у этих событий предусмотреть модель поведения когда нужны: а) только клиентские вызовы, б) клиентские и внеконтекстные сервеные, в) клиентские и контекстные серверные вызовы.
Поэтому да, многое можно, но навык "танец с бубном" должен быть 99lvl
И речь в данном случае не о "сферическом слоне в вакууме", а о например Рабочем Месте, которое настраивается в зависимости от роли пользователя, подразделении пользователя, полномочиям которые ему делегировали временно или постоянно и т.п.
В целом, я не пытаюсь очернить, или критиковать подходы. Просто думаю разумно было бы - побольше раскрыть нюансы именно обработки событий программно-добавленных элементов. Описать на какие подводные грабли можно наступить, как обойти.
Когда придет время обновлять расширение, эти вопросы обязательно могут возникнуть.
Ранее да, на ОФ именно программным кодом пользовался, и вот ни разу не визуально, и весьма проблематично. Пользовался обработкой с инфостарта по декомпиляции форм. Т.е. сперва визуально делаешь, потом в програмный код. Так вот телодвижений и в УФ осталось много. С расширением все намного проще. Мое имхо, конечно же.
Если Элементы.Найти("Владелец") = Неопределено Тогда
ПолеВвода = Элементы.Добавить("Владелец", Тип("ПолеФормы"), ЭтаФорма);
ПолеВвода.Заголовок = "Владелец";
ПолеВвода.Вид = ВидПоляФормы.ПолеВвода;
ПолеВвода.ПутьКДанным = "Объект.Владелец";
КонецЕсли;
Они ведь иногда появляются, когда 1с-овцы трезвеют...
К тому же, если на форме много изменений, процесс перехода на расширение может занять большое время, и элемент всё ещё может присутствовать в конфигурации на форме, поэтому надо включать защиту от дурака уже заранее.
Максимум, 1с-овцы могут добавить аналогичное по содержанию поле. И их будет 2 на форме.
Если КонтекстноеМеню.ПодчиненныеЭлементы.Количество() > 0 Тогда
Кнопка = Форма.Элементы.Вставить("ИмяКнопки", Тип("КнопкаФормы"), КонтекстноеМеню, КонтекстноеМеню.ПодчиненныеЭлементы[0]);
Иначе
Кнопка = Форма.Элементы.Добавить("ИмяКнопки", Тип("КнопкаФормы"), КонтекстноеМеню);
КонецЕсли;Заранее не знаю сколько там будет элементов
Как вариант, сначала создать список значений как реквизит формы, затем добавить поля формы и связать их с реквизитом формы, указав в пути к данным путь "ИмяРеквизитаСпискаЗначений[ИндексСтроки].Пометка" и "ИмяРеквизитаСпискаЗначений[ИндексСтроки].Представление"
Любое изменение флажка будет так же влиять и на список значений.
ДобавляемыеРеквизиты = Новый Массив;
ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("МойСписок", Новый ОписаниеТипов("СписокЗначений")));
ИзменитьРеквизиты(ДобавляемыеРеквизиты);
ЭтотОбъект.МойСписок.Добавить("Вариант 1");
ЭтотОбъект.МойСписок.Добавить("Вариант 2");
ЭтотОбъект.МойСписок.Добавить("Вариант 3");
ЭтотОбъект.МойСписок.Добавить("Вариант 4");
Индекс = 0;
Для Каждого ЭлементСписка Из ЭтотОбъект.МойСписок Цикл
ГруппаЭлементов = Элементы.Добавить("Группа_" + Формат(Индекс, "ЧГ=0"),
Тип("ГруппаФормы"),
ЭтотОбъект);
ГруппаЭлементов.Вид = ВидГруппыФормы.ОбычнаяГруппа;
ГруппаЭлементов.Группировка = ГруппировкаПодчиненныхЭлементовФормы.ГоризонтальнаяВсегда;
ФлажокЭлемента = Элементы.Добавить("МойСписокПометка_" + Формат(Индекс, "ЧН=0; ЧГ=0"),
Тип("ПолеФормы"),
ГруппаЭлементов);
ФлажокЭлемента.Вид = ВидПоляФормы.ПолеФлажка;
ФлажокЭлемента.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет;
ФлажокЭлемента.ПутьКДанным = СтрШаблон("МойСписок[%1].Пометка", Формат(Индекс, "ЧГ=0"));
ФлажокЭлемента.УстановитьДействие("ПриИзменении", "ПриИзмененииФлажка");
ПолеЭлемента = Элементы.Добавить("МойСписокЭлемент_" + Формат(Индекс, "ЧГ=0"),
Тип("ПолеФормы"),
ГруппаЭлементов);
ПолеЭлемента.Вид = ВидПоляФормы.ПолеНадписи;
ПолеЭлемента.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет;
ПолеЭлемента.ПутьКДанным = СтрШаблон("МойСписок[%1].Представление", Формат(Индекс, "ЧГ=0"));
Индекс = Индекс + 1;
КонецЦикла;
Показатьдля добавление реквизитов с помощью расширений очень удобно
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Добавляем новый реквизит формы
НовыеРеквизиты = Новый Массив;
НовыеРеквизиты.Добавить(Новый РеквизитФормы("фСтрока", Новый ОписаниеТипов("ФорматированнаяСтрока"),, "Форматированная строка"));
ЭтаФорма.ИзменитьРеквизиты(НовыеРеквизиты);
// Добавляем новый элемент формы
элФормы = ЭтаФорма.Элементы.Добавить("фСтрока", Тип("ПолеФормы"));
элФормы.Вид = ВидПоляФормы.ПолеНадписи;
элФормы.ПутьКДанным = "фСтрока";
// Задаем значение строки
ЭтаФорма.фСтрока = Новый ФорматированнаяСтрока("Это форматированная строка",, WebЦвета.Аквамарин);
КонецПроцедуры Показать
&НаКлиенте
Процедура КомандаПоказатьПредупреждение()
ПоказатьПредупреждение(,"Ок!");
КонецПроцедуры
&НаСервере
Процедура ПоказатьКнопкуПриИзмененииНаСервере()
Команда = Команды.Добавить("ПоказатьПредупреждение");
Команда.Заголовок = "Показать предпреждение";
Команда.Действие = "КомандаПоказатьПредупреждение";
КнопкаПредупреждения = Элементы.Добавить("ПоказатьПредупреждение", Тип("КнопкаФормы"), ЭтаФорма);
КнопкаПредупреждения.ИмяКоманды = "ПоказатьПредупреждение";
КнопкаПредупреждения.Вид = ВидКнопкиФормы.ОбычнаяКнопка;
КонецПроцедуры
&НаСервере
Процедура УдалитьКнопку()
Кнопка = ЭтаФорма.Элементы.Найти("ПоказатьПредупреждение");
ЭтаФорма.Элементы.Удалить(Кнопка);
Команда = Команды.Найти("ПоказатьПредупреждение");
Команды.Удалить(Команда);
КонецПроцедуры
&НаКлиенте
Процедура ПоказатьКнопкуПриИзменении(Элемент)
Если ПоказатьКнопку = Истина Тогда
ПоказатьКнопкуПриИзмененииНаСервере();
Иначе
УдалитьКнопку();
КонецЕсли;
КонецПроцедуры
ПоказатьНовыеРеквизиты = Новый Массив;
НовыеРеквизиты.Добавить(Новый РеквизитФормы("ПолеСтр", Новый ОписаниеТипов("Строка"), "Объект.Товары"));
ИзменитьРеквизиты(НовыеРеквизиты);
НовыйЭлемент = Элементы.Добавить("ТоварыПолеСтр", ТИП("ПолеФормы"), Элементы.Товары);
НовыйЭлемент.ПутьКДанным = "Объект.Товары.ПолеСтр";
НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
Группа_НомерМеста = Элементы.Добавить("ГруппаШапка", Тип("ГруппаФормы"), ЭтаФорма);
Группа_НомерМеста.Вид = ВидГруппыФормы.ОбычнаяГруппа;
{МКТ Документ.РеализацияТоваровУслуг.Форма.ФормаДокумента.Форма(132)}:Группа_НомерМеста = Элементы.Добавить("ГруппаШапка", Тип("ГруппаФормы"), ЭтаФорма);
{ОбщийМодуль.ОбщегоНазначенияУТКлиент.Модуль(292)}:ПоказатьЗначение(Неопределено, ТекущиеДанные.Ссылка);
{Обработка.ЖурналДокументовПродажи.Форма.СписокДокументов.Форма(418)}:ОбщегоНазначенияУТКлиент.ИзменитьЭлемент(Элемент);
по причине:
Недопустимое значение параметров
ТипРеквизита = Новый ОписаниеТипов("Строка");заменить на
ТипРеквизита = Новый ОписаниеТипов("СправочникСсылка.Пользователи");Или
ТипРеквизита = Новый ОписаниеТипов("ДокументСсылка.АктВыполненныхРабот");Вы можете заказать платную консультацию или разработку у автора. Будет создан приватный заказ на «Бирже заказов» для автора.
№ 997060
Создание 13.02.19 11:46
Обновление 13.02.19 11:46
Просмотры 245107
Загрузки 112
Рейтинг
315
Комментарии 51
Код открыт Да
Рубрики Работа с интерфейсом
Кому Разработчик
Тип файла Внешняя обработка (ert,epf)
Платформа 1С:Предприятие 8
Конфигурация 1C:Бухгалтерия
Операционная система Не имеет значения
Страна Россия
Отрасль Не имеет значения
Налоги Не имеет значения
Вид учета Не имеет значения
Доступ к файлу Абонемент ($m)