Внешняя обработка 1С 8.3 своими руками: от пустого файла .epf до запуска в рабочей базе
Содержание
Чтобы создать обработку
в 1С, откройте базу в Конфигураторе и выберите Файл → Новый, затем тип «Внешняя обработка». Добавьте реквизиты, форму и код, сохраните объект в файл .epf через Файл → Сохранить. В режиме 1С:Предприятие файл открывают через главное меню Файл → Открыть или регистрируют в списке дополнительных обработок.
Типичная ситуация: главбух просит раз в месяц найти контрагентов без ИНН и выгрузить их списком. Типового отчёта под это нет, а дорабатывать конфигурацию и снимать её с поддержки ради одной кнопки никто не хочет. Внешняя обработка решает задачу без изменения конфигурации: это отдельный файл, который живёт рядом с базой и подключается по необходимости. Ниже весь путь на этом примере, в интерфейсе «Такси» на платформе 8.3.
Какой тип объекта выбрать и как его создать
Перед стартом решите, что именно вы делаете. У платформы три близких варианта, и путать их дорого.
| Вариант | Файл | Когда подходит | Что с конфигурацией |
|---|---|---|---|
| Внешняя обработка | .epf | Сервисные действия: заполнить, исправить, загрузить, выгрузить | Не меняется |
| Внешний отчёт | .erf | Нужен вывод данных с отбором и настройками на схеме компоновки | Не меняется |
| Обработка внутри конфигурации или расширения | нет отдельного файла | Функция нужна постоянно и всем пользователям | Меняется конфигурация или подключается расширение |
Для разовых и периодических задач почти всегда хватает внешней обработки. Если результат — таблица для печати с группировками, удобнее внешний отчёт на СКД.
Создание объекта в Конфигураторе
- Запустите 1С в режиме Конфигуратор. Подойдёт любая база, но лучше копия той, где обработка будет работать: тогда в типах реквизитов доступны её справочники и документы.
- Выберите
Файл → Новый(илиCtrl+N), в списке — «Внешняя обработка», нажмитеОК. - Откроется окно объекта с деревом: «Реквизиты», «Табличные части», «Формы», «Команды», «Макеты».
- Откройте свойства корневого элемента (
Alt+Enter) и задайте Имя латиницей или кириллицей без пробелов, напримерПоискКонтрагентовБезИНН, и понятный Синоним — его увидит пользователь в заголовке.
Конфигурацию базы открывать не нужно. Внешняя обработка редактируется отдельно и не требует монопольного режима.
Реквизиты и форма внешней обработки
Данные обработки хранятся в реквизитах объекта, а пользователь видит их через форму. Сначала опишите данные, потом рисуйте интерфейс.
Реквизиты и табличная часть
Для примера нужны:
- 📅 реквизит
ТолькоАктивныес типом «Булево» — флажок «не показывать помеченных на удаление»; - 📋 табличная часть
Результатс двумя реквизитами:Контрагент(типСправочникСсылка.Контрагенты) иИНН(строка длиной 12).
Реквизит добавляют кнопкой «Добавить» на ветке «Реквизиты», тип выбирают в палитре свойств. Табличная часть создаётся так же на своей ветке, а её колонки — внутри неё.
Создание основной формы
- Встаньте на ветку «Формы» и нажмите «Добавить».
- В конструкторе формы выберите «Форма обработки», оставьте флажок «Назначить форму основной», нажмите «Готово».
- Откроется редактор управляемой формы: слева вверху дерево элементов, справа — реквизиты формы, где уже есть реквизит
Объектс вашими данными. - Перетащите
Объект → ТолькоАктивныеиОбъект → Результатв дерево элементов. Платформа сама создаст флажок и таблицу с колонками. - На вкладке «Команды» добавьте команду
Заполнить. В свойстве «Действие» нажмите лупу: платформа предложит создать обработчик и спросит, где его разместить. Выберите вариант с клиентской процедурой и вызовом сервера. - Перетащите команду на форму или в командную панель — появится кнопка.
Если форма не назначена основной, при открытии обработки пользователь увидит не ту форму, которую вы рисовали. Проверить назначение можно в свойствах корневого элемента обработки, в поле «Основная форма».
Код обработки: модуль объекта и модуль формы
Новички пишут всё в модуле формы, и через месяц там каша. Рабочее правило: в модуле объекта — логика с данными, в модуле формы — реакция на кнопки и вызов сервера.
Модуль объекта
Модуль открывают через контекстное меню корневого элемента обработки, пункт «Открыть модуль объекта». Код выполняется на сервере, поэтому запросы и запись данных — здесь.
Процедура ЗаполнитьСписок() Экспорт
Результат.Очистить();
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Контрагенты.Ссылка КАК Контрагент,
| Контрагенты.ИНН КАК ИНН
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
|ГДЕ
| НЕ Контрагенты.ЭтоГруппа
| И Контрагенты.ИНН = """"
| И (НЕ &ТолькоАктивные ИЛИ НЕ Контрагенты.ПометкаУдаления)
|
|УПОРЯДОЧИТЬ ПО
| Контрагенты.Наименование";
Запрос.УстановитьПараметр("ТолькоАктивные", ТолькоАктивные);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
ЗаполнитьЗначенияСвойств(Результат.Добавить(), Выборка);
КонецЦикла;
КонецПроцедуры
Слово Экспорт обязательно: без него форма не увидит процедуру. Имена справочника и реквизитов взяты из 1С:Бухгалтерии 3.0. В другой конфигурации проверьте их в дереве метаданных.
Модуль формы
Форма на клиенте ничего не знает о запросах. Ей нужно передать управление на сервер, превратить данные формы в объект обработки, вызвать метод и вернуть результат обратно.
&НаКлиенте
Процедура Заполнить(Команда)
ЗаполнитьНаСервере();
ПоказатьОповещениеПользователя("Найдено записей: " + Формат(Объект.Результат.Количество(), "ЧН=0; ЧГ=0"));
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьНаСервере()
ОбработкаОбъект = РеквизитФормыВЗначение("Объект");
ОбработкаОбъект.ЗаполнитьСписок();
ЗначениеВРеквизитФормы(ОбработкаОбъект, "Объект");
КонецПроцедуры
Пара РеквизитФормыВЗначение и ЗначениеВРеквизитФормы — главный приём при работе с управляемой формой обработки. Первая функция даёт полноценный объект с методами модуля, вторая записывает изменения обратно в форму. Забыли вторую — таблица на экране останется пустой, хотя код отработал.
Значения по умолчанию при открытии формы
Пользователь не должен каждый раз ставить одни и те же флажки. Начальные значения задают в обработчике ПриСозданииНаСервере: в редакторе формы откройте свойства самой формы, найдите событие в списке и нажмите лупу.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Объект.ТолькоАктивные = Истина;
КонецПроцедуры
Здесь же удобно сразу заполнить таблицу, если список нужен при каждом открытии. Но долгий запрос в этом событии задерживает открытие формы. Для тяжёлых выборок оставьте отдельную кнопку Заполнить, чтобы пользователь сначала выставил отборы.
Директивы компиляции
| Директива | Где выполняется | Что можно |
|---|---|---|
&НаКлиенте | У пользователя | Диалоги, оповещения, работа с элементами формы |
&НаСервере | На сервере, с контекстом формы | Запросы, объекты базы, реквизиты формы |
&НаСервереБезКонтекста | На сервере, без данных формы | Быстрые вычисления по переданным параметрам |
Таблица значений в обработке: выборка, обход, вывод на форму
Табличная часть удобна, когда состав колонок известен заранее. Если колонки собираются в коде или данные нужны только для расчёта, берите таблицу значений.
Получение и обход таблицы значений
Результат запроса превращается в таблицу значений одной строкой:
ТЗ = Запрос.Выполнить().Выгрузить();
ТЗ.Колонки.Добавить("Комментарий", Новый ОписаниеТипов("Строка"));
Для Каждого Строка Из ТЗ Цикл
Если СтрДлина(Строка.ИНН) = 0 Тогда
Строка.Комментарий = "Заполнить ИНН";
КонецЕсли;
КонецЦикла;
ТЗ.Свернуть("Контрагент", "");
Полезные методы, которые нужны почти в каждой обработке:
- 🔍
НайтиСтроки(Новый Структура("ИНН", ""))— отбор строк по значениям колонок; - 🔢
Итог("Сумма")— сумма по числовой колонке; - 🧹
Свернуть("Группировки", "Суммируемые")— группировка с суммированием; - ↕️
Сортировать("Контрагент Возр")— сортировка.
Вывод таблицы значений на форму
Таблицу значений нельзя просто положить на клиент. Порядок такой:
- В реквизитах формы добавьте реквизит с типом «ТаблицаЗначений», например
ТаблицаДанных. - Раскройте его и добавьте колонки с теми же именами и типами, что в коде.
- Перетащите реквизит на форму.
- В серверной процедуре после расчёта выполните
ЗначениеВРеквизитФормы(ТЗ, "ТаблицаДанных").
Колонки, которых нет в реквизите формы, на экран не попадут. Это частая причина «пустой» колонки.
Изменение данных базы
Если обработка не только показывает, но и исправляет данные, запись идёт в модуле объекта через ПолучитьОбъект() и Записать(). Массовую запись оборачивайте в НачатьТранзакцию() / ЗафиксироватьТранзакцию() с обработкой исключения, чтобы при ошибке не осталось половины изменённых элементов.
Перед первым запуском записывающей обработки в рабочей базе сделайте резервную копию. Проверьте результат на копии: откатить сотни перезаписанных документов без бэкапа почти невозможно.
Сохранение и запуск внешней обработки в базе
Сохранение файла .epf
Нажмите Файл → Сохранить (Ctrl+S) и укажите имя файла. Внешняя обработка сохраняется с расширением .epf, внешний отчёт — .erf. Позже правки вносят так же: Файл → Открыть в Конфигураторе, изменения, сохранение.
Храните файлы в одной сетевой папке с версией в имени: ПоискКонтрагентов_v2.epf. Через полгода вы скажете себе спасибо.
Способ 1: разовый запуск через меню «Файл»
- Откройте базу в режиме 1С:Предприятие.
- Нажмите кнопку главного меню в заголовке окна и выберите
Файл → Открыть(илиCtrl+O). - Укажите файл
.epf. Платформа покажет предупреждение о том, что внешний файл может быть опасен, — подтвердите, если файл ваш.
Для такого запуска у пользователя должно быть право «Интерактивное открытие внешних обработок». В типовых конфигурациях на БСП его дают через профиль групп доступа «Открытие внешних отчетов и обработок».
Способ 2: регистрация в дополнительных обработках
В типовых конфигурациях на БСП обработку можно подключить постоянно, через Администрирование → Печатные формы, отчеты и обработки → Дополнительные отчеты и обработки. Тогда пользователи запускают её из раздела программы, а не из файла, и права на открытие внешних файлов им не нужны.
Для регистрации в модуль объекта добавляют экспортную функцию СведенияОВнешнейОбработке:
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.3.1.1");
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительнаяОбработка();
ПараметрыРегистрации.Версия = "1.0";
Команда = ПараметрыРегистрации.Команды.Добавить();
Команда.Представление = "Контрагенты без ИНН";
Команда.Идентификатор = "ОткрытьФорму";
Команда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыОткрытиеФормы();
Команда.ПоказыватьОповещение = Ложь;
Возврат ПараметрыРегистрации;
КонецФункции
В строке параметра указывают версию БСП, под которую написана обработка. Без этой функции программа откажется загружать файл в справочник дополнительных обработок.
| Способ запуска | Плюсы | Минусы |
|---|---|---|
Файл → Открыть | Быстро, без настройки | Нужно право на внешние файлы, файл лежит у пользователя |
| Дополнительные обработки | Видна в разделе, права по группам доступа, версии хранятся в базе | Нужна функция регистрации |
Отладка внешней обработки и типичные ошибки
Как отладить обработку
- В Конфигураторе откройте файл обработки и поставьте точку останова на нужной строке (
F9). - Запустите
Отладка → Начать отладку → 1С:Предприятие(F5). - В открывшемся клиенте откройте тот же самый файл через
Файл → Открыть. - Нажмите кнопку на форме — выполнение остановится, и в Конфигураторе можно смотреть значения переменных (
Shift+F9— вычислить выражение).
Отладчик останавливается только в той копии файла, которая открыта в Конфигураторе. Скопировали обработку в другую папку и запустили оттуда — точки останова не сработают.
В клиент-серверном варианте серверный код отлаживается, только если отладка разрешена на сервере 1С. Служба агента для этого запускается с параметром -debug. Включать его — дело администратора: перезапуск службы обрывает сеансы всех пользователей, поэтому делают это вне рабочего времени.
Ошибки, которые встречаются чаще других
Перед сохранением всегда запускайте синтаксический контроль модуля (Ctrl+F7). Ошибка в коде не помешает сохранить файл, но обработка упадёт уже у пользователя.