Внешняя обработка 1С 8.3 своими руками: от пустого файла до команды в меню
Содержание
Обработку в 1С делают в Конфигураторе: Файл → Новый → Внешняя обработка, затем добавляют реквизиты, форму и код, сохраняют файл с расширением .epf и открывают его в режиме 1С:Предприятие. Пользователям такую обработку подключают через Администрирование → Печатные формы, отчеты и обработки → Дополнительные отчеты и обработки (БП 3.0, ЗУП 3.1, УТ 11).
Типичная ситуация: бухгалтеру нужно найти всех контрагентов без ИНН и проставить им признак. Руками — час работы. Своя обработка в 1С сделает это за секунды, а создать её можно за вечер, даже без опыта программиста. Ниже — рабочий пример целиком, от пустого файла до кнопки в разделе программы.
Всё описанное относится к платформе 8.3 и управляемым формам. Конфигурация роли почти не играет: внешняя обработка работает в любой типовой базе, если в ней есть объекты, к которым обращается код.
Какую обработку сделать: внешнюю, встроенную или в расширении
Прежде чем открывать Конфигуратор, решите, где будет жить обработка. От этого зависит, как её обновлять и кто сможет её запускать.
| Вариант | Файл / место | Когда выбирать | Минусы |
|---|---|---|---|
| Внешняя обработка | .epf на диске | Разовые задачи, типовая конфигурация на поддержке | Нужны права на открытие или регистрация в программе |
| Внешний отчёт | .erf на диске | Нужна выборка с группировками и отбором, без изменения данных | Только чтение и вывод |
| Обработка в расширении | .cfe в базе | Постоянный инструмент, который должен быть в меню у всех | Надо подключать расширение и обновлять конфигурацию БД |
| Обработка в основной конфигурации | Сама конфигурация | Своя, не типовая конфигурация | Снимает конфигурацию с поддержки, мешает обновлениям |
Для типовой базы на поддержке обычно выбирают внешнюю обработку . Она не трогает конфигурацию, переживает обновления релизов и открывается в любой копии базы.
Расширения конфигурации появились в платформе 8.3.6. Если обработка нужна каждый день и всем пользователям, расширение удобнее: оно встраивается в интерфейс без отдельной регистрации файла.
Создаём обработку в Конфигураторе: файл и реквизиты
Обработку нельзя сделать в пользовательском режиме. Нужен Конфигуратор любой базы (подойдёт и копия рабочей) или 1С:EDT.
Шаг 1. Новый файл
- Запустите базу в режиме Конфигуратор.
- Выберите
Файл → Новый, в списке — Внешняя обработка. - Откроется окно объекта. Заполните Имя латиницей или кириллицей без пробелов, например
КонтрагентыБезИНН, и Синоним — так обработку увидит пользователь.
Открывать конфигурацию базы для этого не нужно. Внешняя обработка — отдельный объект, она не меняет структуру базы.
Шаг 2. Реквизиты и табличная часть
Реквизиты хранят то, что пользователь вводит или видит: дату, организацию, флажки, результат отбора.
Для нашего примера:
- 📌 табличная часть
Результат; - 📌 в ней реквизит
Контрагентс типомСправочникСсылка.Контрагенты; - 📌 реквизит
Пометкас типомБулево— чтобы выбирать строки.
Добавляются они на вкладке Данные окна обработки: кнопка добавления над списком реквизитов или над списком табличных частей.
Шаг 3. Сохранение
Нажмите Ctrl+S и сохраните файл .epf в папку, к которой у вас есть доступ. Сохраняйте после каждой правки: обработка живёт только в этом файле, базу она не изменяет.
Тип СправочникСсылка.Контрагенты появится в списке, только если Конфигуратор открыт для базы, где есть такой справочник. Делайте обработку в копии той конфигурации, где она будет работать.
Где писать код обработки: модуль объекта и модуль формы
У внешней обработки два места для кода. Путают их чаще всего.
| Модуль | Где выполняется | Что туда писать |
|---|---|---|
| Модуль объекта | На сервере | Основную логику: запросы, запись данных, расчёты; функцию регистрации для БСП |
| Модуль формы | На клиенте и на сервере, по директивам | Обработчики кнопок, работу с диалогами, вызов серверной логики |
Модуль объекта открывается с вкладки Основные кнопкой Открыть модуль объекта или из контекстного меню объекта. Модуль формы — вкладка Модуль внизу редактора формы.
Директивы компиляции
В модуле формы каждая процедура помечается, где она работает:
- 🖥️
&НаКлиенте— реакция на нажатие, диалоги, вопросы пользователю; - 🗄️
&НаСервере— запросы и обращения к базе, с доступом к данным формы; - ⚡
&НаСервереБезКонтекста— серверный вызов без передачи формы, быстрее, но реквизиты формы в нём не видны.
Запрос к базе из процедуры &НаКлиенте выполнить нельзя. Правильная схема: клиентская процедура кнопки вызывает серверную.
Вызов логики из модуля объекта
Если основной код лежит в модуле объекта в экспортной процедуре ЗаполнитьРезультат(), из формы его вызывают так:
&НаСервере
Процедура ВыполнитьНаСервере()
ОбработкаОбъект = РеквизитФормыВЗначение("Объект");
ОбработкаОбъект.ЗаполнитьРезультат();
ЗначениеВРеквизитФормы(ОбработкаОбъект, "Объект");
КонецПроцедуры
РеквизитФормыВЗначение превращает данные формы в настоящий объект обработки, а ЗначениеВРеквизитФормы возвращает изменения обратно, чтобы пользователь их увидел.
Делаем форму обработки: реквизиты, команды, кнопки
Без формы внешняя обработка откроется пустым окном. Форму добавляют на вкладке Формы: кнопка добавления запускает конструктор формы обработки. Отметьте реквизиты, которые нужны на форме, и оставьте флажок «Назначить форму основной».
Команда и кнопка
- В редакторе формы перейдите на вкладку Команды (справа вверху).
- Добавьте команду
Заполнить, в свойстве Действие нажмите на лупу — Конфигуратор создаст обработчик в модуле формы. - Перетащите команду мышью в дерево элементов слева. Появится кнопка.
Повторите то же для команды ПроставитьПризнак, если обработка должна что-то менять.
Полный код примера
Обработка находит контрагентов с пустым ИНН и показывает их в табличной части.
&НаКлиенте
Процедура Заполнить(Команда)
ЗаполнитьНаСервере();
Если Объект.Результат.Количество() = 0 Тогда
ПоказатьПредупреждение(, "Контрагентов без ИНН не найдено.");
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьНаСервере()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Контрагенты.Ссылка КАК Контрагент,
| ИСТИНА КАК Пометка
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
|ГДЕ
| Контрагенты.ИНН = """"
| И НЕ Контрагенты.ЭтоГруппа
| И НЕ Контрагенты.ПометкаУдаления
|
|УПОРЯДОЧИТЬ ПО
| Контрагенты.Наименование";
Объект.Результат.Загрузить(Запрос.Выполнить().Выгрузить());
КонецПроцедуры
Колонки результата запроса называются так же, как реквизиты табличной части. Поэтому метод Загрузить() раскладывает их по местам без ручного цикла.
Если обработка меняет данные
Изменение элемента справочника — через объект: Ссылка.ПолучитьОбъект(), правка реквизита, Записать(). Делайте это в серверной процедуре и только для строк с Пометка = Истина.
Обработка, которая записывает данные, сначала запускается на копии базы. Отменить массовую запись кнопкой нельзя — только восстановлением из резервной копии.
Для документов вместо Записать() без параметров используют Записать(РежимЗаписиДокумента.Проведение), если нужно перепровести. Перепроведение закрытого периода меняет отчётность — согласуйте это с главным бухгалтером.
Как запустить и отладить обработку в 1С
Запуск в режиме 1С:Предприятие
- Откройте базу в обычном режиме.
- Нажмите
Ctrl+Oили откройте главное меню (кнопка с тремя полосками слева вверху) и выберитеФайл → Открыть. - Укажите файл
.epf.
При первом открытии платформа покажет предупреждение о безопасности: внешний файл может содержать любой код. Если файл ваш — подтвердите открытие.
Если вместо формы появляется сообщение о нарушении прав доступа, у пользователя нет права «Интерактивное открытие внешних обработок». В типовых конфигурациях его дают роли полных прав. Обычным пользователям обработку подключают через регистрацию — об этом ниже.
Отладка
Отладчик избавляет от гадания, почему таблица пустая.
- В Конфигураторе, где открыт файл
.epf, поставьте точку останова: двойной щелчок слева от строки илиF9. - Запустите
Отладка → Начать отладку → 1С:Предприятие(илиF5). - В открывшемся сеансе откройте тот же самый файл через
Файл → Открыть. - Нажмите кнопку на форме. Выполнение остановится на точке, значения переменных видны по наведению мыши и в окне Табло.
После правки кода сохраните файл и закройте форму обработки в сеансе 1С:Предприятие, затем откройте файл заново. Иначе будет работать старая версия.
Проверка перед выпуском
Внешние отчёты и загрузка данных из файлов
Внешний отчёт на СКД
Когда задача — только показать данные, делайте не обработку, а внешний отчёт.
Файл → Новый → Внешний отчет.- На вкладке Основные нажмите кнопку открытия схемы компоновки данных — создастся основная схема.
- Добавьте набор данных «Запрос», напишите запрос или соберите его конструктором.
- На вкладке Настройки нажмите на волшебную палочку (конструктор настроек) и выберите вид: список или таблица.
- Сохраните файл
.erf.
Форму рисовать не нужно: платформа даст стандартную форму с кнопкой Сформировать, отборами и настройками. Открывается отчёт так же, как обработка, — через Файл → Открыть.
Загрузка из CSV или Excel
Частый сценарий — загрузить прайс, остатки или список сотрудников из файла. Сложность в том, что файл лежит на компьютере пользователя, а запись в базу идёт на сервере. Файл сначала передают на сервер через временное хранилище.
&НаКлиенте
Процедура ЗагрузитьФайл(Команда)
Оповещение = Новый ОписаниеОповещения("ПослеВыбораФайла", ЭтотОбъект);
НачатьПомещениеФайла(Оповещение, , , Истина, УникальныйИдентификатор);
КонецПроцедуры
&НаКлиенте
Процедура ПослеВыбораФайла(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт
Если Результат Тогда
ПрочитатьНаСервере(Адрес);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ПрочитатьНаСервере(Адрес)
ИмяФайла = ПолучитьИмяВременногоФайла("csv");
ПолучитьИзВременногоХранилища(Адрес).Записать(ИмяФайла);
Текст = Новый ТекстовыйДокумент;
Текст.Прочитать(ИмяФайла, КодировкаТекста.UTF8);
Для НомерСтроки = 2 По Текст.КоличествоСтрок() Цикл
Части = СтрРазделить(Текст.ПолучитьСтроку(НомерСтроки), ";");
// Части[0] — первая колонка, Части[1] — вторая и т. д.
// здесь ищете элемент по Части[0] и заполняете строку табличной части
КонецЦикла;
УдалитьФайлы(ИмяФайла);
КонецПроцедуры
Цикл начинается со второй строки, потому что в первой обычно заголовки колонок. Если файл сохранён из Excel в кодировке Windows, вместо КодировкаТекста.UTF8 укажите КодировкаТекста.ANSI.
Для .xlsx вместо текстового документа используют ТабличныйДокумент: его метод Прочитать() открывает файлы Excel, а значения ячеек берут через ПолучитьОбласть() или обращение к области по адресу R2C1.
Работа с файлами на сервере ограничена, если обработка зарегистрирована в безопасном режиме. Для загрузчиков флаг безопасного режима при регистрации снимают — и тем внимательнее проверяют код.
Как подключить обработку для пользователей и не навредить базе
Регистрация в «Дополнительных отчетах и обработках»
Типовые конфигурации построены на БСП. Чтобы файл можно было добавить в программу, в модуле объекта нужна экспортная функция СведенияОВнешнейОбработке():
Функция СведенияОВнешнейОбработке() Экспорт
Параметры = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.2.2.1");
Параметры.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительнаяОбработка();
Параметры.Версия = "1.0";
Параметры.БезопасныйРежим = Истина;
Команда = Параметры.Команды.Добавить();
Команда.Представление = "Контрагенты без ИНН";
Команда.Идентификатор = "ОткрытьФорму";
Команда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыОткрытиеФормы();
Команда.ПоказыватьОповещение = Ложь;
Возврат Параметры;
КонецФункции
Дальше в программе:
Администрирование → Печатные формы, отчеты и обработки, включите флажок Дополнительные отчеты и обработки.- Перейдите по ссылке Дополнительные отчеты и обработки, нажмите Добавить из файла и выберите
.epf. - В карточке на вкладке размещения укажите раздел, например «Справочники» или «Покупки».
- Сохраните. Команда появится в выбранном разделе в списке дополнительных обработок.
Без функции регистрации программа откажется добавлять файл: сообщит, что он не поддерживает подключение. Для внешнего отчёта в поле Вид указывают ВидОбработкиДополнительныйОтчет().
Что делает обработку безопасной
- 🔒 Безопасный режим. С флагом
БезопасныйРежим = Истинакод не обращается к файлам, внешним компонентам и COM. Для обработок, которые только читают и пишут данные базы, этого достаточно. - 🧪 Копия базы. Любая запись данных сначала проверяется на копии.
- 🗂️ Резервная копия перед запуском на рабочей базе, если обработка меняет больше нескольких объектов.
- 👀 Чужие файлы. Внешняя обработка выполняется с правами того, кто её открыл. Файл
.epfиз незнакомого источника может удалить данные или отправить их наружу. Открывайте только то, код чего вы видели. - 🏷️ Версия. Меняйте
Параметры.Версияпри каждом выпуске — в карточке будет видно, какая копия загружена.
Хранение исходников
Файл .epf — двоичный, изменения в нём не сравнить. Если обработок много, выгружайте их в XML-файлы и храните в Git. В пакетном режиме Конфигуратора для этого есть параметр /DumpExternalDataProcessorOrReportToFiles, обратная загрузка — /LoadExternalDataProcessorOrReportFromFiles.
Частые вопросы
Можно ли сделать обработку без Конфигуратора?
Переживёт ли внешняя обработка обновление конфигурации?
Почему обработка открывается в одной базе и не работает в другой?
Контрагенты не заработает в ЗУП, где такого справочника нет.