Внешние формы в 1С:Предприятие — это мощный инструмент для расширения функциональности системы без глубокого вмешательства в конфигурацию. Они позволяют вынести интерфейсные элементы за пределы основной базы, упрощая обновления и кастомизацию. Но как правильно создать такую форму, чтобы она работала стабильно и соответствовала бизнес-процессам компании?

В этой статье мы разберём весь процесс — от подготовки среды разработки до тестирования готовой формы. Вы узнаете, какие ключевые ошибки допускают новички, как оптимизировать производительность и почему иногда проще использовать управляемые формы, а не обычные. Материал актуален для платформы 1С:Предприятие 8.3 (включая последние релизы 2026 года) и подходит как для программистов, так и для опытных пользователей, которые хотят автоматизировать рутинные задачи.

Особое внимание уделим двум критичным моментам: привязке формы к справочникам и документам без потери данных и настройке прав доступа, чтобы внешние решения не конфликтовали с основной конфигурацией. Если вы ранее работали только с встроенными формами, этот гайд поможет перейти на новый уровень кастомизации.

1. Чем внешняя форма отличается от обычной: плюсы и минусы

Прежде чем приступать к созданию, важно понять, когда именно стоит использовать внешние формы, а когда лучше обойтись стандартными средствами . Основное отличие — место хранения: внешние формы хранятся в отдельных файлах (.epf или .erf), тогда как обычные — прямо в конфигурации.

Это даёт несколько ключевых преимуществ:

  • 🔄 Лёгкое обновление: можно менять форму без перезагрузки всей базы.
  • 🛠️ Модульность: формы можно переносить между разными конфигурациями.
  • 🔒 Безопасность: ошибка в внешней форме не повредит основную базу.
  • 👥 Разграничение доступа: проще настраивать права для отдельных файлов.

Однако есть и недостатки. Например, внешние формы не поддерживают все события, доступные для обычных (например, ПриИзменении для некоторых элементов). Кроме того, их сложнее отлаживать: если форма "подвисает", проблема может крыться как в самом файле, так и в его взаимодействии с базой.

📊 Как часто вы используете внешние формы в 1С?
Постоянно, это основа моей работы
Иногда, для специфических задач
Раньше пробовал, но вернулся к обычным
Никогда не использовал

Ещё один нюанс — производительность. Внешние формы могут работать медленнее, если не оптимизировать обращения к базе. Например, частые запросы Выбрать... внутри формы приводят к лагам. Решение — кэшировать данные или использовать серверные вызовы.

2. Подготовка среды: что нужно для создания формы

Чтобы начать работу, убедитесь, что у вас есть:

  • 💻 1С:Предприятие 8.3 (релиз не ниже 8.3.10 — в более старых версиях ограниченная поддержка внешних форм).
  • 🔧 Права администратора или роль "Конфигуратор".
  • 📁 Доступ к каталогу базы (для сохранения файлов форм).
  • 📝 Техническое задание: какие данные должна отображать форма и какие действия выполнять.

Если вы работаете в файловом варианте , внешние формы сохраняются прямо в папке с базой. Для клиент-серверного варианта потребуется доступ к серверу или сетевому хранилищу. Обратите внимание: путь к файлу формы не должен содержать кириллических символов — это чревато ошибками при загрузке.

Установить последнюю версию платформы 1С|Проверить права доступа в конфигураторе|Создать резервную копию базы|Подготовить структуру папок для хранения форм|Согласовать ТЗ с заказчиком-->

Для удобства рекомендуем создать отдельную папку, например, ExtForms в корне каталога базы. Так вы не потеряете файлы при обновлениях. Также проверьте настройки :

  1. Откройте конфигуратор.
  2. Перейдите в Сервис → Параметры.
  3. На вкладке Запуск 1С:Предприятия убедитесь, что включён флажок Разрешить выполнение внешних обработок.

3. Пошаговая инструкция: создаём внешнюю форму

Рассмотрим процесс на примере формы для ввода данных о контрагентах. Мы создадим простую форму с полями "Наименование", "ИНН" и "Адрес", которая будет сохранять данные в справочник Контрагенты.

Шаг 1: Создание файла формы

В конфигураторе:

  1. Выберите Файл → Новый.
  2. В списке объектов выберите Внешняя обработка (даже если вам нужна форма, технически это будет обработка с формой).
  3. Укажите имя файла, например, Контрагенты_ВнешняяФорма.epf.

Шаг 2: Дизайн формы

Перейдите на вкладку Формы и добавьте новую форму. В конструкторе разместите элементы:

  • Поле ввода для наименования (свойство Имя = "Наименование").
  • Поле ввода для ИНН (тип Число, маска 000000000000).
  • Поле ввода для адреса (многострочное).
  • Кнопка "Сохранить" с обработчиком события Нажатие.

Пример кода для кнопки "Сохранить":


Процедура Сохранить(Команда)

НовыйКонтрагент = Справочники.Контрагенты.СоздатьЭлемент();

НовыйКонтрагент.Наименование = ЭлементыФормы.Наименование.Значение;

НовыйКонтрагент.ИНН = ЭлементыФормы.ИНН.Значение;

НовыйКонтрагент.Адрес = ЭлементыФормы.Адрес.Значение;

НовыйКонтрагент.Записать();

Сообщить("Контрагент сохранён!", СтатусСообщения.Информация);

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

Шаг 3: Подключение формы к базе

Сохраните файл .epf в папку ExtForms. Теперь нужно подключить его к конфигурации:

  1. В конфигураторе откройте нужный справочник или документ (например, Контрагенты).
  2. Перейдите на вкладку Формы и добавьте новую форму.
  3. В свойствах формы укажите путь к файлу ExtForms\Контрагенты_ВнешняяФорма.epf.
  4. Сохраните конфигурацию и обновите базу.
💡

Если форма не отображается после подключения, проверьте права доступа на файл .epf. Иногда антивирус блокирует выполнение внешних обработок — добавьте папку с формами в исключения.

4. Типичные ошибки и как их избежать

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

Ошибка Причина Решение
Форма не открывается Неверный путь к файлу или отсутствуют права Проверьте путь в свойствах формы и права на файл .epf
Данные не сохраняются Ошибка в коде обработчика или блокировка базы Добавьте отладку (Сообщить()) для проверки значений полей
Медленная работа формы Частые запросы к базе внутри цикла Используйте кэширование или серверные процедуры
Не отображаются элементы Конфликт имён элементов или версий платформы Проверьте свойства Имя и Видимость элементов

Одна из самых коварных ошибок — несоответствие версий платформы. Если форма создана в 1С 8.3.20, а база работает на 8.3.15, часть функций может не работать. Всегда проверяйте совместимость в свойствах файла .epf (вкладка Основные).

Что делать, если форма открывается, но "зависает" при сохранении?

Чаще всего это связано с блокировками базы. Проверьте, не открыт ли справочник или документ в другой сессии в режиме редактирования. Также причиной может быть длинная транзакция — добавьте НачатьТранзакцию() и ЗафиксироватьТранзакцию() в код сохранения.

Ещё один нюанс — работа с модулями. Если вы подключаете внешнюю форму к документу, убедитесь, что в модуле документа нет процедур с теми же именами, что и в форме. Это приведёт к конфликту. Используйте уникальные имена, например, добавляя префикс Внеш_:


Процедура Внеш_СохранитьДанные()

// Ваш код

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

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

Внешние формы могут тормозить, если не следить за их "аппетитом" к ресурсам. Вот ключевые правила оптимизации:

  • 🚀 Минимизируйте запросы к базе: вместо цикла с Выбрать... загружайте данные одним запросом.
  • 🗃️ Используйте кэш: сохраняйте часто используемые данные в переменные формы.
  • 🔄 Отключайте ненужные события: если поле не используется, удалите его обработчики.
  • 📊 Правильно настраивайте реквизиты: для больших списков используйте ДинамическийСписок.

Пример оптимизированного кода для загрузки данных:


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

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ ПЕРВЫЕ 100

| Контрагенты.Ссылка КАК Ссылка,

| Контрагенты.Наименование КАК Наименование

|ИЗ

| Справочник.Контрагенты КАК Контрагенты

|УПОРЯДОЧИТЬ ПО

| Наименование";

Результат = Запрос.Выполнить();

ЭлементыФормы.СписокКонтрагентов.Значение = Результат.Выгрузить();

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

Для сложных форм с большим количеством элементов рекомендуем использовать асинхронную загрузку. Например, данные для выпадающих списков можно подгружать по мере необходимости, а не сразу при открытии формы. Это особенно актуально для форм, которые открываются на слабых клиентских машинах.

💡

Самая частая причина тормозов — избыточные данные в формах. Всегда ограничивайте выборки (используйте ПЕРВЫЕ N) и избегайте загрузки ненужных реквизитов.

6. Безопасность и права доступа

Внешние формы — потенциальная брешь в безопасности, если не настроить права корректно. Основные риски:

  • 🔓 Несанкционированный доступ: пользователь может открыть форму через Файл → Открыть.
  • 📂 Изменение файлов: злоумышленник может подменить .epf на вредоносный.
  • 🔄 Конфликты обновлений: при обновлении конфигурации внешние формы могут перестать работать.

Чтобы минимизировать риски:

  1. Храните файлы форм в защищённой папке с ограниченным доступом.
  2. Настраивайте права на уровне : в ролях запретите открытие внешних обработок для обычных пользователей.
  3. Используйте цифровую подпись для файлов .epf (доступно в 1С:Предприятие 8.3.14+).
  4. В коде формы проверяйте права пользователя перед выполнением критичных операций:

Если НЕ ЗначениеЗаполнено(Пользователи.ТекущийПользователь()) ИЛИ

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

Сообщить("Доступ запрещён!", СтатусСообщения.Важное);

Возврат;

КонецЕсли;

Для клиент-серверных баз настройте права на уровне SQL-сервера, если формы работают с внешними источниками данных. Также полезно вести журнал обращений к внешним формам — это поможет отследить подозрительную активность.

💡

Если форма используется только администраторами, добавьте проверку в событие ПриОткрытии: Если НЕ Роли.Администратор.Пренадлежит(Пользователи.ТекущийПользователь()) Тогда Закрыть(); КонецЕсли;

7. Интеграция с другими системами

Внешние формы в часто используют для интеграции с другими системами — например, для обмена данными с CRM, ERP или веб-сервисами. Рассмотрим базовые сценарии:

Обмен данными через HTTP-запросы

Для взаимодействия с REST API используйте объект HTTPСоединение. Пример отправки данных о контрагенте в внешнюю систему:


Процедура ОтправитьВCRM()

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

Запрос = Новый HTTPЗапрос("/contragents");

Запрос.Заголовки.Вставить("Content-Type", "application/json");

Тело = Новый Структура();

Тело.Вставить("name", ЭлементыФормы.Наименование.Значение);

Тело.Вставить("inn", ЭлементыФормы.ИНН.Значение);

Запрос.УстановитьТекст(ТелоJSON.ЗаписатьJSON(Тело));

Ответ = Соединение.ОтправитьДляОбработки(Запрос);

Если Ответ.КодСостояния = 200 Тогда

Сообщить("Данные отправлены!");

Иначе

Сообщить("Ошибка: " + Ответ.ПолучитьТекст());

КонецЕсли;

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

Работа с файлами

Для импорта/экспорта данных в Excel или JSON используйте объекты ЧтениеJSON, ЗаписьJSON, ТабличныйДокумент. Пример экспорта данных в Excel:


Процедура ЭкспортироватьВExcel()

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

Таблица.ВывестиСтроку("Наименование;ИНН;Адрес");

Для Каждого Строки Из ЭлементыФормы.СписокКонтрагентов.Значение Цикл

Таблица.ВывестиСтроку(Строки.Наименование + ";" + Строки.ИНН + ";" + Строки.Адрес);

КонецЦикла;

Таблица.Записать("C:\Export\Контрагенты.xlsx", ТипФайлаТабличногоДокумента.XLSX);

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

При работе с внешними системами всегда обрабатывайте ошибки. Например, если сервис недоступен, форма не должна "падать" — лучше показать пользователю сообщение и предложить повторить попытку позже.

8. Тестирование и отладка

Перед внедрением формы в рабочую базу обязательно протестируйте её в тестовом окружении. Основные этапы тестирования:

  1. Функциональное тестирование: проверьте все кнопки, поля и сценарии (сохранение, редактирование, удаление).
  2. Тестирование производительности: откройте форму на слабом ПК с большим объёмом данных.
  3. Тестирование безопасности: попытайтесь получить доступ к форме под разными ролями.
  4. Кросс-платформенное тестирование: проверьте работу в разных версиях (если форма будет использоваться в нескольких базах).

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

  • 🐞 Точки останова в конфигураторе (Отладка → Точка останова).
  • 📝 Журнал регистрации (Администрирование → Журнал регистрации).
  • 🔍 Вывод сообщений (Сообщить()) для отслеживания значений переменных.

Пример отладочного кода для проверки значений:


Процедура ПроверитьДанные()

Сообщить("Наименование: " + ЭлементыФормы.Наименование.Значение);

Сообщить("ИНН: " + ЭлементыФормы.ИНН.Значение);

Если НЕ ЗначениеЗаполнено(ЭлементыФормы.ИНН.Значение) Тогда

Сообщить("Ошибка: ИНН не заполнен!", СтатусСообщения.Ошибка);

КонецЕсли;

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

Если форма используется в веб-клиенте или тонком клиенте, тестируйте её в соответствующем режиме — некоторые элементы могут отображаться иначе, чем в толстом клиенте.

💡

Никогда не тестируйте формы на боевой базе! Даже небольшая ошибка в коде может привести к потере данных или блокировке работы пользователей.

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

Можно ли создать внешнюю форму для мобильного приложения 1С?

Да, но с ограничениями. Внешние формы в мобильном клиенте поддерживаются начиная с версии 8.3.18. Однако не все элементы управления доступны (например, нет ТабличныйДокумент). Также учитывайте, что на мобильных устройствах формы должны быть максимально простыми — избегайте сложных таблиц и вложенных структур.

Как обновить внешнюю форму, если она уже используется пользователями?

Чтобы обновить форму без прерывания работы:

  1. Сохраните новую версию файла .epf с другим именем (например, Контрагенты_ВнешняяФорма_v2.epf).
  2. В конфигураторе измените путь к форме в свойствах объекта.
  3. Обновите конфигурацию базы.
  4. Удалите старый файл .epf после проверки работоспособности новой версии.

Если форма используется активно, сделайте обновление в нерабочее время.

Почему внешняя форма открывается медленно?

Причины могут быть разные:

  • Слишком много данных загружается при открытии (проверьте запросы в ПриОткрытии).
  • Форма содержит тяжелые элементы (например, ДеревоЗначений с тысячами строк).
  • Файл .epf повреждён или слишком большой (оптимизируйте код).
  • Медленное сетевое соединение (актуально для клиент-серверного варианта).

Используйте профилировщик производительности (Сервис → Профилировщик в конфигураторе), чтобы найти "узкие места".

Можно ли сделать внешнюю форму для отчёта?

Да, но технически это будет внешняя обработка с формой, которая генерирует отчёт. Алгоритм аналогичный:

  1. Создайте внешнюю обработку.
  2. Добавьте форму с параметрами отчёта (период, организация и т.д.).
  3. В обработчике кнопки "Сформировать" напишите код генерации отчёта (используйте ПостроительОтчёта).
  4. Подключите обработку к базе через Файл → Открыть или закрепите в панели навигации.

Пример кода для формирования простого отчёта:


Процедура СформироватьОтчёт()

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| Продажи.Дата КАК Дата,

| Продажи.Сумма КАК Сумма

|ИЗ

| Документ.РеализацияТоваровУслуг КАК Продажи

|ГДЕ

| Продажи.Дата МЕЖДУ &НачалоПериода И &КонецПериода";

Запрос.УстановитьПараметр("НачалоПериода", ЭлементыФормы.ПериодНачало.Значение);

Запрос.УстановитьПараметр("КонецПериода", ЭлементыФормы.ПериодКонец.Значение);

Результат = Запрос.Выполнить();

Таблица = Результат.Выгрузить();

ЭлементыФормы.ТаблицаОтчёта.Значение = Таблица;

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

Как защитить внешнюю форму от изменений?

Есть несколько способов:

  • 🔐 Цифровая подпись: подпишите файл .epf в конфигураторе (Файл → Подписать).
  • 🔒 Права на файл: настройте права доступа на уровне ОС (только чтение для пользователей).
  • 📌 Контрольные суммы: в коде формы проверяйте хэш файла при открытии.
  • 🔄 Версионность: храните формы в системе контроля версий (Git, SVN).

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


Процедура ПроверитьЦелостность()

Если НЕ ХэшСтроки(ПолучитьТекстМодуля()) = "ожидаемый_хэш" Тогда

Сообщить("Файл формы изменён! Обратитесь к администратору.", СтатусСообщения.Ошибка);

Закрыть();

КонецЕсли;

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