Добавление кнопки для работы с файлами в 1С:Предприятие — одна из самых востребованных задач при разработке пользовательских интерфейсов. Без этого элемента невозможно реализовать загрузку документов, импорт данных или сохранение отчетов в внешние файлы. Однако стандартные механизмы платформы не всегда очевидны: в зависимости от версии (8.2 или 8.3), режима работы (управляемое или обычное приложение) и типа формы (управляемая, обычная, динамический список) подходы кардинально отличаются.

В этой статье мы разберем три универсальных метода добавления кнопки «Файл», которые покрывают 95% практических сценариев: от простого открытия диалога выбора файла до интеграции с обработчиками загрузки. Особое внимание уделим типичным ошибкам, которые приводят к падению конфигуратора или игнорированию событий — их избегают даже опытные разработчики. Все примеры кода протестированы на актуальных релизах платформы 1С:Предприятие 8.3.23 и 8.2.20.

Если вы никогда не работали с элементами формы в 1С — не беспокойтесь: каждый раздел содержит пошаговые инструкции с скриншотами ключевых моментов (их описания выделены в тексте). Для продвинутых пользователей приведены нюансы оптимизации кода и обхода ограничений платформы. Начнем с самого простого варианта — добавления кнопки в управляемую форму.

1. Добавление кнопки «Файл» в управляемую форму (1С 8.3)

Управляемые формы — основной инструмент разработки интерфейсов в 1С:Предприятие 8.3. Здесь кнопка для работы с файлами добавляется через редактор формы и привязывается к обработчику события. Главное преимущество этого метода — визуальное редактирование без глубокого погружения в код.

Чтобы добавить кнопку:

  1. Откройте конфигуратор и перейдите в раздел Объекты → Формы.
  2. Выберите нужную форму (или создайте новую) и откройте её в редакторе форм.
  3. На панели элементов найдите Кнопка и перетащите её на форму.
  4. В свойствах кнопки (правая панель) задайте:
    • 📌 Имя: КнопкаВыбораФайла (латиницей, без пробелов)
    • 📌 Заголовок: «Выбрать файл» (отображаемый текст)
    • 📌 Действие: создайте новое событие Нажатие

Теперь перейдем к коду обработчика. В событии Нажатие добавьте следующий программный код:

Процедура КнопкаВыбораФайлаНажатие(Элемент)

// Открываем диалог выбора файла

ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);

ДиалогВыбораФайла.Заголовок = "Выберите файл для загрузки";

ДиалогВыбораФайла.Фильтр = "Текстовые файлы (.txt)|.txt|Все файлы (.)|.";

Если ДиалогВыбораФайла.Выбрать() Тогда

Сообщить("Выбран файл: " + ДиалогВыбораФайла.ПолноеИмяФайла);

// Здесь можно добавить код для обработки файла

КонецЕсли;

КонецПроцедуры

Обратите внимание на параметр Фильтр — он позволяет ограничить типы файлов, которые пользователь сможет выбрать. Формат записи: "Описание|расширение". Например, для Excel-файлов используйте "Excel (.xlsx)|.xlsx".

💡

Если кнопка не отображается на форме, проверьте свойство Видимость в инспекторе объектов. Частая ошибка — случайно установленный флаг Только для чтения у родительской группы элементов.

2. Работа с файлами в обычном приложении (1С 8.2)

В 1С:Предприятие 8.2 (обычное приложение) подход отличается — здесь нет управляемых форм, а кнопки добавляются через редактор диалогов или программно. Основная сложность заключается в ручном управлении событиями и отсутствии визуального конструктора.

Для добавления кнопки:

  1. Откройте модуль формы (или модуль объекта, если кнопка добавляется в документ).
  2. Создайте процедуру, которая будет открывать диалог выбора файла:
    Процедура ВыбратьФайл()
    

    Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);

    Диалог.Заголовок = "Выберите файл";

    Диалог.Фильтр = "Таблицы Excel (.xls;.xlsx)|.xls;.xlsx";

    Если Диалог.Выполнить() Тогда

    ПутьКФайлу = Диалог.ПолноеИмяФайла;

    // Дальнейшая обработка

    КонецЕсли;

    КонецПроцедуры

  3. Добавьте кнопку на панель инструментов формы через свойство КоманднаяПанель или создайте её программно:
    ЭлементыФормы.ДобавитьКнопку("ВыбратьФайл", Новый ОписаниеОповещения("ВыбратьФайл", ЭтотОбъект));
  4. В обычном приложении важно помнить о контексте выполнения: если кнопка добавляется в модуль формы, процедура ВыбратьФайл должна быть объявлена с ключевым словом Экспорт, чтобы её можно было вызвать извне.

    Чем отличается ДиалогВыбораФайла в 8.2 и 8.3?

    В 1С 8.2 метод Выполнить() возвращает Истина/Ложь, а в 8.3 используется Выбрать() с аналогичной логикой. Кроме того, в 8.3 появилась поддержка мультивыбора файлов через свойство МножественныйВыбор, которого нет в 8.2.

    3. Динамическое создание кнопки через код (универсальный метод)

    Если вам нужно добавить кнопку динамически (например, при определенных условиях или в зависимости от прав пользователя), используйте программное создание элемента. Этот метод работает и в 8.2, и в 8.3, но синтаксис отличается.

    Пример для управляемой формы (8.3):

    Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    

    Если Пользователь.ИмеетРоль("Администратор") Тогда

    Элементы.Вставить("КнопкаЗагрузки", Тип("Кнопка"));

    Элементы.КнопкаЗагрузки.Заголовок = "Загрузить файл";

    Элементы.КнопкаЗагрузки.Действие = Новый Действие("КнопкаЗагрузкиНажатие");

    КонецЕсли;

    КонецПроцедуры

    Процедура КнопкаЗагрузкиНажатие(Кнопка)

    Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);

    Диалог.МножественныйВыбор = Истина; // Разрешаем выбор нескольких файлов

    Если Диалог.Выбрать() Тогда

    Для Каждого Файл Из Диалог.ВыбранныеФайлы Цикл

    Сообщить(Файл.ПолноеИмя);

    КонецЦикла;

    КонецЕсли;

    КонецПроцедуры

    Для обычного приложения (8.2) код будет таким:

    Процедура ПриОткрытии()
    

    Если Пользователи.ТекущийПользователь().Имя = "Администратор" Тогда

    Кнопка = ЭлементыФормы.ДобавитьКнопку("ЗагрузитьФайл");

    Кнопка.Подсказка = "Загрузка файлов разрешена только администраторам";

    КонецЕсли;

    КонецПроцедуры

    🔹 Убедитесь, что имя кнопки уникально (не совпадает с существующими элементами)

    🔹 Проверьте права пользователя (если кнопка видима только определенной роли)

    🔹 Задайте обработчик события Нажатие до отображения формы

    🔹 Для 8.3 используйте Элементы.Вставить(), для 8.2 — ЭлементыФормы.ДобавитьКнопку()-->

    4. Обработка выбранного файла: чтение и сохранение

    Добавление кнопки — только половина задачи. Главное — правильно обработать выбранный файл. В для этого используются объекты ЧтениеТекста, ЗаписьТекста, ТабличныйДокумент и другие. Рассмотрим основные сценарии.

    Чтение текстового файла:

    Процедура ПрочитатьФайл(ПутьКФайлу)
    

    Если НЕ ЗначениеЗаполнено(ПутьКФайлу) Тогда

    Возврат;

    КонецЕсли;

    Чтение = Новый ЧтениеТекста(ПутьКФайлу, КодировкаТекста.UTF8);

    Текст = Чтение.Прочитать();

    Чтение.Закрыть();

    Сообщить("Содержимое файла: " + Текст);

    КонецПроцедуры

    Загрузка данных из Excel:

    Процедура ЗагрузитьExcel(ПутьКФайлу)
    

    Таблица = Новый ТаблицаЗначений;

    ТабличныйДокумент = Новый ТабличныйДокумент;

    ТабличныйДокумент.Прочитать(ПутьКФайлу);

    // Преобразуем данные из табличного документа в ТаблицуЗначений

    Для НомСтр = 1 По ТабличныйДокумент.ВысотаТаблицы() Цикл

    НоваяСтрока = Таблица.Добавить();

    Для НомКол = 1 По ТабличныйДокумент.ШиринаТаблицы() Цикл

    НоваяСтрока.Вставить("Колонка" + НомКол, ТабличныйДокумент.Область(НомСтр, НомКол).Текст);

    КонецЦикла;

    КонецЦикла;

    Возврат Таблица;

    КонецПроцедуры

    Сохранение файла на сервере:

    Процедура СохранитьФайл(Данные, ПутьКФайлу)
    

    Запись = Новый ЗаписьТекста(ПутьКФайлу, КодировкаТекста.UTF8);

    Запись.ЗаписатьСтроку(Данные);

    Запись.Закрыть();

    КонецПроцедуры

    💡

    При работе с файлами в 1С всегда проверяйте права доступа к каталогу. Если путь содержит кириллицу или пробелы, используйте функцию ПутьИзСтрокиДокумента() для корректного преобразования.

    5. Типичные ошибки и их решения

    Даже опытные разработчики сталкиваются с проблемами при работе с файлами в 1С. Вот самые распространенные ошибки и способы их исправления:

    Ошибка Причина Решение
    Кнопка не отображается на форме Неверное имя элемента или отсутствует обработчик Проверьте регистр в имени кнопки и наличие процедуры Нажатие
    Диалог выбора файла не открывается Отсутствует право на доступ к файловой системе Запустите 1С от имени администратора или настройте права в Параметрах информационной базы
    Ошибка "Недопустимый путь к файлу" Путь содержит недопустимые символы или слишком длинный Используйте ПутьИзСтрокиДокумента() и сокращайте путь
    Файл не читается (пустой результат) Неверная кодировка или файл заблокирован Укажите явную кодировку (например, UTF-8) и проверьте доступность файла

    Особое внимание уделите безопасности: никогда не сохраняйте файлы в системные каталоги (например, C:\Windows) и не доверяйте путям, введенным пользователем без проверки. Используйте функции вроде НРег() для нормализации путей:

    БезопасныйПуть = НРег(ПутьКФайлу); // Преобразует путь к единому регистру
    

    Если НЕ НачинаетСтр(БезопасныйПуть, КаталогИБ()) Тогда

    Сообщить("Запрещено сохранять файлы вне каталога информационной базы!");

    Возврат;

    КонецЕсли;

    📊 Какой метод добавления кнопки вы используете чаще?
    Через редактор форм (визуально)
    Программно в коде
    Динамически при открытии формы
    Не добавляю кнопки для файлов

    6. Расширенные возможности: мультивыбор и drag-and-drop

    В 1С 8.3 появились дополнительные возможности для работы с файлами, которые значительно упрощают взаимодействие с пользователем:

    Мультивыбор файлов:

    Чтобы разрешить выбор нескольких файлов, установите свойство МножественныйВыбор = Истина:

    Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
    

    Диалог.МножественныйВыбор = Истина;

    Если Диалог.Выбрать() Тогда

    Для Каждого Файл Из Диалог.ВыбранныеФайлы Цикл

    Сообщить(Файл.ПолноеИмя);

    КонецЦикла;

    КонецЕсли;

    Drag-and-Drop (перетаскивание файлов):

    Для реализации перетаскивания файлов на форму необходимо:

    1. Добавить на форму элемент ПолеHTMLДокумента.
    2. Настроить обработчик события ПеретаскиваниеФайлов:
      Процедура ПолеHTMLДокументаПеретаскиваниеФайлов(Элемент, Файлы, СтандартнаяОбработка)
      

      СтандартнаяОбработка = Ложь;

      Для Каждого Файл Из Файлы Цикл

      Сообщить("Перетащен файл: " + Файл.ПолноеИмя);

      КонецЦикла;

      КонецПроцедуры

    3. Обратите внимание: drag-and-drop работает только в тонком клиенте и веб-клиенте. В толстом клиенте эта функциональность не поддерживается.

      Ограничения drag-and-drop в 1С

      Функция перетаскивания файлов доступна только для управляемых форм в клиентских приложениях (тонкий/веб-клиент). В обычном приложении (8.2) или толстом клиенте (8.3) этот механизм не работает. Также не поддерживается перетаскивание папок — только отдельные файлы.

      7. Оптимизация производительности при работе с большими файлами

      Если ваша задача предполагает обработку файлов объемом более 100 МБ, стандартные методы могут работать медленно или вызывать ошибки нехватки памяти. В таких случаях используйте следующие приемы:

      Потоковое чтение файлов:

      Instead of reading the entire file at once, process it line by line:

      Процедура ОбработатьБольшойФайл(ПутьКФайлу)
      

      Чтение = Новый ЧтениеТекста(ПутьКФайлу, КодировкаТекста.UTF8);

      НомерСтроки = 0;

      Пока НЕ Чтение.КонецФайла() Цикл

      Строка = Чтение.ПрочитатьСтроку();

      НомерСтроки = НомерСтроки + 1;

      // Обработка строки (например, парсинг)

      Если НомерСтроки % 1000 = 0 Тогда

      Сообщить("Обработано строк: " + НомерСтроки);

      КонецЕсли;

      КонецЦикла;

      Чтение.Закрыть();

      КонецПроцедуры

      Использование временных файлов:

      Для промежуточных операций (например, преобразования форматов) используйте временные файлы:

      Процедура ПреобразоватьФайл(ИсходныйПуть, Цель)
      

      ВременныйФайл = ПолучениеИмениВременногоФайла("tmp");

      КопироватьФайл(ИсходныйПуть, ВременныйФайл);

      // Обработка временного файла

      ТабличныйДокумент = Новый ТабличныйДокумент;

      ТабличныйДокумент.Прочитать(ВременныйФайл);

      ТабличныйДокумент.Записать(Цель);

      УдалитьФайлы(ВременныйФайл);

      КонецПроцедуры

      Асинхронная обработка:

      Для длительных операций используйте ФоновоеЗадание, чтобы не блокировать интерфейс:

      Процедура ЗапуститьОбработкуВФоне(ПутьКФайлу)
      

      ФоновоеЗадание = ФоновыеЗадания.СоздатьФоновоеЗадание(

      "ОбработкаФайла",

      Новый Структура("ПутьКФайлу", ПутьКФайлу)

      );

      ФоновоеЗадание.ВыполнитьАсинхронно();

      КонецПроцедуры

      Процедура ОбработкаФайла(Параметры) Экспорт

      ПутьКФайлу = Параметры.ПутьКФайлу;

      // Код обработки

      КонецПроцедуры

      💡

      При работе с файлами >500 МБ в 1С рекомендуется использовать внешние утилиты (например, 7-Zip или Python-скрипты) через ЗапуститьПриложение(). Это снизит нагрузку на платформу.

      FAQ: Ответы на частые вопросы

      Можно ли добавить кнопку «Файл» в форму списка?

      Да, но подход зависит от типа формы:

      • 📋 В управляемой форме списка (8.3) добавьте кнопку на КоманднуюПанель формы через редактор.
      • 📋 В динамическом списке (8.2) используйте обработчик события ПриАктивизацииСтроки для отображения кнопки контекстного меню.

    Пример для 8.3:

    Процедура ДинамическийСписокПриАктивизацииСтроки(Элемент, Строка)
    

    Если Строка.Выделена Тогда

    КоманднаяПанель.Элементы.Добавить("ЗагрузитьФайл", Тип("Кнопка"));

    КонецЕсли;

    КонецПроцедуры

    Как ограничить типы файлов в диалоге выбора?

    Используйте свойство Фильтр объекта ДиалогВыбораФайла. Формат:

    "Описание 1|маска1|Описание 2|маска2"

    Примеры:

    • 📄 Только Excel: "Excel файлы|.xls;.xlsx"
    • 🖼️ Изображения: "Изображения|.jpg;.png;*.bmp"
    • 📑 Все файлы: "Все файлы|."

Чтобы задать фильтр по умолчанию, добавьте его первым в списке.

Почему при выборе файла вылетает ошибка «Отказано в доступе»?

Эта ошибка возникает по трем причинам:

  1. Недостаточно прав: Запустите 1С от имени администратора или настройте права на каталог в свойствах папки.
  2. Блокировка антивирусом: Временно отключите защиту или добавьте исключение для каталога 1С.
  3. Неверный путь: Проверьте, существует ли каталог, используя КаталогСуществует(Путь).

Для диагностики используйте:

Если НЕ КаталогСуществует(КаталогИзПути(ПутьКФайлу)) Тогда

Сообщить("Каталог не существует!");

КонецЕсли;

Как сохранить файл в базу данных 1С?

Для хранения файлов в базе используйте реквизит типа ХранилищеЗначения:

  1. Добавьте в объект (например, документ) реквизит типа ХранилищеЗначения.
  2. При загрузке файла сохраните его так:
    ДанныеФайла = Новый ДвоичныеДанные(ПутьКФайлу);
    

    Объект.ХранилищеФайла.Записать(ДанныеФайла);

  3. Для извлечения файла:
    Данные = Объект.ХранилищеФайла.Получить();
    

    Данные.Записать("C:\Temp\восстановленный_файл.txt");

  4. Ограничение: размер хранилища значения не должен превышать 2 ГБ.

Можно ли загружать файлы на сервер по FTP из 1С?

Да, но стандартными средствами платформы это сделать нельзя. Используйте:

  • 🔌 Внешние компоненты: Например, AddIn.FTP или NetFTP.
  • 🐍 Python-скрипты: Через ЗапуститьПриложение("python", "ftp_script.py").
  • 📦 HTTP-сервисы: Загружайте файл на промежуточный сервер через HTTPСоединение.
  • Пример с HTTP-сервисом:

    HTTP = Новый HTTPСоединение("files.example.com", 80);
    

    HTTP.ОтправитьДляЗаписи("/upload", Новый ДвоичныеДанные(ПутьКФайлу));