Работа с формами обработок в 1С:Предприятие 8.3 — одна из ключевых задач для разработчиков, автоматизирующих бизнес-процессы. Форма обработки позволяет создать удобный интерфейс для выполнения специфических операций: от массового изменения данных до интеграции с внешними системами. В отличие от стандартных документов или справочников, обработки гибко настраиваются под уникальные требования бизнеса, что делает их незаменимым инструментом.
Эта статья подробно разберёт все этапы создания формы обработки: от базовой настройки через конструктор до тонкой кастомизации с помощью встроенного языка 1С. Мы рассмотрим типичные сценарии использования, разберём структуру формы на примерах и укажем на «подводные камни», с которыми сталкиваются даже опытные программисты. Особое внимание уделим динамическому формированию элементов формы в зависимости от прав пользователя и контекста выполнения — это одна из самых востребованных функций в корпоративных конфигурациях.
Если вы только начинаете осваивать разработку в 1С, статья поможет понять логику построения интерфейсов. Опытным специалистам будут полезны нюансы оптимизации кода и примеры нестандартных решений, например, работа с УправляемымиФормами в тонком клиенте или создание адаптивных форм для мобильных устройств.
Что такое форма обработки и зачем она нужна
Форма обработки в 1С:Предприятие — это визуальный интерфейс, который связывается с объектом конфигурации типа Обработка. В отличие от форм документов или справочников, она не привязана к конкретным данным базы и может выполнять произвольные действия: от простых расчётов до сложных многоэтапных операций.
Основные сценарии использования:
- 📊 Массовая обработка данных: изменение цен, пересчёт остатков, очистка устаревших записей.
- 🔄 Интеграция с внешними системами: выгрузка/загрузка данных в форматах
XML,JSON, работа сAPI. - 📈 Аналитические отчёты: построение нестандартных дашбордов с визуализацией данных.
- 🔧 Сервисные утилиты: резервное копирование, чистка кэша, диагностика производительности.
Преимущество форм обработок — в их гибкости. Например, вы можете создать форму для выборочного переноса данных между базами с настраиваемыми фильтрами, чего невозможно добиться стандартными средствами платформы. Или реализовать мастер настройки параметров отчёта с динамически изменяемыми полями в зависимости от выбранного периода.
Подготовка к созданию: объект конфигурации «Обработка»
Прежде чем приступать к разработке формы, необходимо создать сам объект Обработка в дереве конфигурации. Это основа, к которой будет привязана форма. Для этого:
- Откройте конфигуратор 1С:Предприятия в режиме редактирования.
- В дереве объектов найдите ветку
Обработкии добавьте новый элемент (кнопкаДобавитьили контекстное меню). - Задайте имя обработки (например,
МассовоеИзменениеЦен) и сохраните.
На этом этапе важно определиться с назначением обработки:
- 🔹 Будет ли она использоваться однократно (например, для разовой миграции данных) или станет частью повседневной работы?
- 🔹 Нужна ли ей серверная часть (для тяжелых вычислений) или достаточно клиентских процедур?
- 🔹 Требуется ли хранение настроек между сеансами (например, последние использованные фильтры)?
От ответов на эти вопросы зависит выбор типа формы (УправляемаяФорма или ОбычнаяФорма) и структура модуля обработки. Например, для серверных операций потребуется разделить код на клиентскую и серверную части, чтобы избежать блокировки интерфейса.
Если обработка будет использоваться в тонком клиенте или веб-интерфейсе, сразу выбирайте УправляемуюФорму — обычные формы в этих режимах не поддерживаются.
Создание формы через конструктор: пошаговый разбор
Самый быстрый способ создать форму обработки — использовать встроенный конструктор форм. Он автоматически генерирует базовую структуру, которую потом можно доработать вручную. Рассмотрим процесс на примере простой обработки для массового изменения цен номенклатуры.
Шаг 1. Запуск конструктора
В окне редактирования обработки нажмите кнопку Формы → Добавить → ОсновнаяФорма. Система предложит выбрать тип формы. Для современных конфигураций рекомендуется УправляемаяФорма.
Шаг 2. Настройка реквизитов
В конструкторе перейдите на вкладку Реквизиты и добавьте необходимые поля. Например, для нашей обработки понадобятся:
- 📅
Период(типСтроковыйилиДата) — для фильтрации данных. - 🔍
ФильтрПоНоменклатуре(типСправочникСсылка.Номенклатура) — выбор группы товаров. - 💰
ПроцентИзменения(типЧисло) — значение для изменения цен. - ✅
ПрименятьКПодгруппам(типБулево) — флаг для рекурсивной обработки.
Шаг 3. Размещение элементов на форме
На вкладке Элементы перетащите реквизиты из списка в макет формы. Конструктор автоматически создаст поля ввода (ПолеВвода), флажки (Флажок) и кнопки (Кнопка). Для удобства сгруппируйте элементы с помощью Группы или ЗаголовкаГруппы.
Шаг 4. Добавление команд
На вкладке Команды создайте кнопку ВыполнитьОбработку и свяжите её с процедурой в модуле формы. Конструктор сгенерирует заготовку кода для обработчика события.
☑️ Чек-лист перед сохранением формы
Ручная доработка формы: работа с модулем
Автоматически сгенерированная форма редко покрывает все требования. Как правило, требуется дополнительная логика в модуле формы. Рассмотрим ключевые моменты на примере обработки для массового изменения цен.
1. Обработчик кнопки «Выполнить»
В модуле формы найдите процедуру, связанную с командой ВыполнитьОбработку. Допишите код для выполнения основной логики:
&НаКлиенте
Процедура ВыполнитьОбработку(Команда)
// Проверка заполнения обязательных полей
Если НЕ ЗначениеЗаполнено(ПроцентИзменения) Тогда
ПоказатьПредупреждение("Укажите процент изменения цен!");
Возврат;
КонецЕсли;
// Вызов серверной процедуры для обработки данных
ИзменитьЦеныНаСервере();
КонецПроцедуры
&НаСервере
Процедура ИзменитьЦеныНаСервере()
// Получение данных с учётом фильтров
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Ссылка,
| Номенклатура.Цена КАК ТекущаяЦена
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.ЭтоГруппа = ЛОЖЬ
| И Номенклатура.ПометкаУдаления = ЛОЖЬ";
// Добавляем условия по фильтрам (период, группа номенклатуры)
Если ЗначениеЗаполнено(ФильтрПоНоменклатуре) Тогда
Запрос.Текст = Запрос.Текст + " И Номенклатура.Родитель = &Родитель";
Запрос.УстановитьПараметр("Родитель", ФильтрПоНоменклатуре);
КонецЕсли;
// ... остальной код обработки
КонецПроцедуры
2. Динамическое управление элементами
Часто требуется скрывать или показывать поля в зависимости от действий пользователя. Например, поле ПроцентИзменения можно сделать доступным только после выбора номенклатуры:
&НаКлиенте
Процедура ФильтрПоНоменклатуреПриИзменении(Элемент)
Элементы.ПроцентИзменения.Доступность = (ФильтрПоНоменклатуре <> Неопределено);
КонецПроцедуры
3. Валидация данных
Перед выполнением обработки критично проверять корректность введённых данных. Например, процент изменения не должен превышать разумные пределы:
Если ПроцентИзменения > 100 Тогда
ПоказатьПредупреждение("Максимально допустимое изменение — 100%!");
Возврат;
КонецЕсли;
Пример кода для рекурсивной обработки подгрупп номенклатуры
В процедуре ИзменитьЦеныНаСервере() можно добавить рекурсивный обход подгрупп, если установлен флаг ПрименятьКПодгруппам:
Если ПрименятьКПодгруппам Тогда
МассивГрупп = Новый Массив;
МассивГрупп.Добавить(ФильтрПоНоменклатуре);
Пока МассивГрупп.Количество() > 0 Цикл
ТекущаяГруппа = МассивГрупп[0];
МассивГрупп.Удалить(0);
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Ссылку ИЗ Справочник.Номенклатура ГДЕ Родитель = &ТекущаяГруппа";
Запрос.УстановитьПараметр("ТекущаяГруппа", ТекущаяГруппа);
Результат = Запрос.Выполнить();
Пока Результат.Следующий() Цикл
Если Результат.Ссылка.ЭтоГруппа Тогда
МассивГрупп.Добавить(Результат.Ссылка);
Иначе
// Обработка элемента номенклатуры
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецЕсли;
Типичные ошибки и как их избежать
Даже опытные разработчики сталкиваются с проблемами при создании форм обработок. Вот наиболее распространённые ошибки и способы их решения:
| Ошибка | Причина | Решение |
|---|---|---|
| Форма не открывается в тонком клиенте | Использована ОбычнаяФорма вместо УправляемойФормы |
Пересоздать форму с правильным типом или перенести логику в управляемую форму |
| Данные не сохраняются после закрытия формы | Не вызван метод Записать() для объекта обработки |
Добавить вызов в обработчик события ПередЗакрытием |
| Долгая загрузка формы при большом объёме данных | Выполнение тяжёлых запросов на клиенте | Перенести логику на сервер, использовать ПоказатьОжидание() |
| Элементы формы не обновляются после изменения данных | Не вызван метод Обновить() для динамического списка |
Добавить вызов после изменения фильтров или данных |
Особое внимание уделите разделению клиент-серверной логики. Например, если вы выполняете запрос к базе непосредственно в клиентском коде (что часто делают новички), это приведёт к блокировке интерфейса и потенциальным ошибкам при работе в сетевых базах. Все операции с данными должны выполняться на сервере!
Всегда проверяйте форму в пользовательском режиме (1С:Предприятие) — многие ошибки проявляются только при реальной работе, а не в конфигураторе.
Ещё одна частая проблема — некорректная работа с транзакциями. Если ваша обработка изменяет данные, обязательно оборачивайте операции в транзакцию, чтобы избежать частичных изменений при сбоях:
НачатьТранзакцию();
Попытка
// Код изменения данных
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
ВызватьИсключение;
КонецПопытки;
Продвинутые техники: динамические формы и адаптивность
Для сложных обработок стандартных средств конструктора недостаточно. Рассмотрим несколько продвинутых приёмов, которые позволят создать действительно гибкие и удобные формы.
1. Динамическое создание элементов
Иногда количество полей на форме заранее неизвестно. Например, если обработка должна позволять вводить разное число параметров в зависимости от выбранного сценария. В этом случае элементы можно создавать программно:
&НаКлиенте
Процедура СоздатьДинамическиеПоля(СписокПараметров)
Для Каждого Параметр Из СписокПараметров Цикл
НовоеПоле = Элементы.Добавить("ПолеВвода",
Тип("ПолеВвода"),,
"ДинПоле_" + Параметр.Идентификатор);
НовоеПоле.Подсказка = Параметр.Описание;
НовоеПоле.Значение = Параметр.ЗначениеПоУмолчанию;
КонецЦикла;
КонецПроцедуры
2. Адаптивность для разных устройств
Если обработка будет использоваться на планшетах или смартфонах, форму нужно адаптировать под маленькие экраны. Для этого:
- 📱 Используйте
Группыс вертикальным расположением элементов. - 🔄 Настраивайте свойство
Видимостьдля второстепенных полей (скрывайте их на мобильных устройствах). - 🎨 Увеличивайте размер шрифта для кнопок и полей ввода.
3. Сохранение пользовательских настроек
Чтобы пользователю не приходилось каждый раз заполнять одни и те же параметры, сохраняйте их в настройках обработки:
&НаСервере
Процедура СохранитьНастройки()
Настройки = ПолучитьНастройкиПользователя();
Настройки.Вставить("Обработка_МассовоеИзменениеЦен_Фильтр",
ФильтрПоНоменклатуре);
Настройки.Вставить("Обработка_МассовоеИзменениеЦен_Процент",
ПроцентИзменения);
СохранитьНастройкиПользователя(Настройки);
КонецПроцедуры
4. Интерактивные элементы
Для улучшения пользовательского опыта добавьте на форму:
- 📊 Диаграммы для визуализации результатов (например, распределение изменённых цен).
- 🔍 Поиск с подсказками для справочников (используйте
ПолеВводаСПодбором). - 📄 Вкладки для разделения логических блоков (например, "Фильтры", "Параметры", "Результаты").
Для динамического обновления диаграмм используйте событие ПриИзменении у полей фильтров. Это позволит показывать предварительные результаты без выполнения полной обработки.
Примеры готовых обработок с формами
Чтобы лучше понять структуру форм, рассмотрим несколько практических примеров с разным уровнем сложности.
1. Простая обработка для очистки помеченных объектов
Форма содержит:
- 🗑️ Кнопку
ВыполнитьОчистку. - 📋 Флажок
УдалятьБезПодтверждения. - 📊 Поле для вывода количества удалённых объектов.
Особенность: вся логика выполняется на сервере, форма только инициирует процесс и показывает результат.
2. Обработка для выгрузки данных в Excel
Форма включает:
- 📅 Поля для указания периода.
- 📂 Выбор каталога сохранения файла.
- 🔄 Флажки для выбора выгружаемых колонок.
- 🖥️ Прогресс-бар для отображения статуса выгрузки.
Особенность: использование ФайловыеОперации.Записать() и динамическое формирование структуры файла.
3. Сложная обработка для миграции данных между базами
Форма содержит:
- 🔗 Поля для подключения к внешней базе (сервер, имя базы, пользователь, пароль).
- 🔄 Две таблицы: исходные данные и результаты миграции.
- ⚙️ Вкладки с настройками правил преобразования данных.
- 📊 Лог операций с возможностью сохранения в файл.
Особенность: работа с COM-соединением или HTTP-сервисами, многопоточная обработка.
Для каждой из этих обработок структура формы и модуля будет принципиально отличаться. Например, в третьем случае потребуется:
- 🔒 Безопасное хранение паролей (используйте
ХранилищеНастроек). - 🔄 Асинхронное выполнение операций (чтобы не блокировать интерфейс).
- 📋 Журналирование ошибок с детализацией по каждой записи.
Тестирование и отладка формы обработки
Создание формы — только половина работы. Не менее важно протестировать её в разных сценариях и отладить возможные ошибки. Вот чек-лист для проверки:
☑️ Чек-лист тестирования формы обработки
Для отладки используйте:
- 🐞 Точки останова в модуле формы (особенно в обработчиках событий).
- 📝 Журнал регистрации для отслеживания серверных операций.
- 🔍 Вывод отладочной информации в сообщениях (например,
Сообщить(ЗначениеВСтроку(Переменная))).
Типичные ошибки, которые выявляются на этапе тестирования:
- 🔄 Зацикливание при рекурсивных операциях (например, при обходе справочников).
- 🔒 Блокировки при длительных транзакциях.
- 📉 Падение производительности при работе с большими выборками.
Для сложных обработок рекомендуется создавать тестовые сценарии с разными наборами данных. Например, если ваша обработка изменяет цены, протестируйте её на:
- 📌 Пустом справочнике номенклатуры.
- 📌 Справочнике с одной записью.
- 📌 Справочнике с иерархической структурой (группы и элементы).
- 📌 Данных с разными валютами или единицами измерения.
Всегда тестируйте обработку на копии рабочей базы. Даже если код кажется безобидным, он может затрагивать критичные данные.
Если обработка будет использоваться несколькими пользователями одновременно, проверьте её работу в многопользовательском режиме. Убедитесь, что:
- 🔄 Одновременное выполнение не приводит к конфликтам блокировок.
- 📊 Данные не дублируются при параллельной работе.
- 📋 Логи операций не перемешиваются между сеансами.
FAQ: Частые вопросы по созданию форм обработок
Как сделать форму обработки адаптивной для мобильных устройств?
Для адаптивности используйте:
- 📱
Группыс вертикальным расположением (РасположениеЭлементов = Вертикальное). - 🔄 Свойство
Видимостьдля скрытия второстепенных элементов на маленьких экранах. - 📏 Настройку минимальной ширины полей (
МинимальнаяШирина). - 🎨 Увеличение размера шрифта для кнопок (
Шрифт = Новый Шрифт(14)).
Также можно использовать УсловноеОформление для изменения стилей в зависимости от размера окна.
Можно ли создать форму обработки без использования конструктора?
Да, форму можно создать полностью вручную:
- В дереве объектов обработки добавьте новую форму (
Формы → Добавить). - В модуле формы вручную опишите структуру (реквизиты, элементы, команды).
- Используйте методы
Элементы.Добавить()для динамического создания интерфейса.
Однако это требует глубоких знаний структуры форм и обычно применяется для нестандартных решений.
Как передать параметры в форму обработки при её открытии?
Используйте метод ОткрытьФорму() с передачей параметров:
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("ДатаНачала", ТекущаяДата());
ПараметрыФормы.Вставить("ТолькоАктивные", Истина);
ОткрытьФорму("Обработка.МассовоеИзменениеЦен.Форма.ФормаОбработки", ПараметрыФормы);
В модуле формы обработайте событие ПриСозданииНаСервере(), чтобы получить переданные значения:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Параметры.Свойство("ДатаНачала") Тогда
ДатаНачала = Параметры.ДатаНачала;
КонецЕсли;
КонецПроцедуры
Почему форма обработки медленно открывается?
Причины медленной загрузки формы:
- 📊 Слишком много элементов на форме (особенно
ТабличныеПоляс большим количеством колонок). - 🔄 Выполнение тяжёлых запросов в обработчике
ПриОткрытии. - 📋 Отсутствие индексов в таблицах базы данных, к которым обращается форма.
- 🖼️ Большие растровые изображения или сложные элементы оформления.
Решения:
- 🔹 Перенесите загрузку данных в фоновый процесс (
ВыполнитьОбработкуНаСервереАсинхронно()). - 🔹 Используйте
ОтложеннаяЗагрузкадля табличных полей. - 🔹 Разделите форму на несколько вкладок, чтобы не грузить все элементы сразу.
Как сделать так, чтобы форма обработки запоминала последние введённые данные?
Для сохранения пользовательских настроек используйте ХранилищеНастроек:
&НаСервере
Процедура СохранитьНастройки()
Настройки = Новый Структура;
Настройки.Вставить("ПоследнийФильтр", ФильтрПоНоменклатуре);
Настройки.Вставить("ПоследнийПроцент", ПроцентИзменения);
Хранилище = Новый ХранилищеНастроек(
"Обработка_МассовоеИзменениеЦен_Настройки",
Новый УникальныйИдентификатор()
);
Хранилище.Записать(Настройки);
КонецПроцедуры
&НаСервере
Процедура ЗагрузитьНастройки()
Хранилище = Новый ХранилищеНастроек(
"Обработка_МассовоеИзменениеЦен_Настройки",
Новый УникальныйИдентификатор()
);
Если Хранилище.Существует() Тогда
Настройки = Хранилище.Прочитать();
ФильтрПоНоменклатуре = Настройки.ПоследнийФильтр;
ПроцентИзменения = Настройки.ПоследнийПроцент;
КонецЕсли;
КонецПроцедуры
Вызывайте ЗагрузитьНастройки() в обработчике ПриСозданииНаСервере(), а СохранитьНастройки() — при закрытии формы или нажатии кнопки "Сохранить".