Внешняя обработка 1С 8.3 своими руками: от пустого файла до команды в меню

· 10 мин

Содержание

Обработку в 1С делают в Конфигураторе: Файл → Новый → Внешняя обработка, затем добавляют реквизиты, форму и код, сохраняют файл с расширением .epf и открывают его в режиме 1С:Предприятие. Пользователям такую обработку подключают через Администрирование → Печатные формы, отчеты и обработки → Дополнительные отчеты и обработки (БП 3.0, ЗУП 3.1, УТ 11).

Типичная ситуация: бухгалтеру нужно найти всех контрагентов без ИНН и проставить им признак. Руками — час работы. Своя обработка в 1С сделает это за секунды, а создать её можно за вечер, даже без опыта программиста. Ниже — рабочий пример целиком, от пустого файла до кнопки в разделе программы.

Всё описанное относится к платформе 8.3 и управляемым формам. Конфигурация роли почти не играет: внешняя обработка работает в любой типовой базе, если в ней есть объекты, к которым обращается код.

Какую обработку сделать: внешнюю, встроенную или в расширении

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

ВариантФайл / местоКогда выбиратьМинусы
Внешняя обработка.epf на дискеРазовые задачи, типовая конфигурация на поддержкеНужны права на открытие или регистрация в программе
Внешний отчёт.erf на дискеНужна выборка с группировками и отбором, без изменения данныхТолько чтение и вывод
Обработка в расширении.cfe в базеПостоянный инструмент, который должен быть в меню у всехНадо подключать расширение и обновлять конфигурацию БД
Обработка в основной конфигурацииСама конфигурацияСвоя, не типовая конфигурацияСнимает конфигурацию с поддержки, мешает обновлениям

Для типовой базы на поддержке обычно выбирают внешнюю обработку . Она не трогает конфигурацию, переживает обновления релизов и открывается в любой копии базы.

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

Создаём обработку в Конфигураторе: файл и реквизиты

Обработку нельзя сделать в пользовательском режиме. Нужен Конфигуратор любой базы (подойдёт и копия рабочей) или 1С:EDT.

Шаг 1. Новый файл

  1. Запустите базу в режиме Конфигуратор.
  2. Выберите Файл → Новый, в списке — Внешняя обработка.
  3. Откроется окно объекта. Заполните Имя латиницей или кириллицей без пробелов, например КонтрагентыБезИНН, и Синоним — так обработку увидит пользователь.

Открывать конфигурацию базы для этого не нужно. Внешняя обработка — отдельный объект, она не меняет структуру базы.

Шаг 2. Реквизиты и табличная часть

Реквизиты хранят то, что пользователь вводит или видит: дату, организацию, флажки, результат отбора.

Для нашего примера:

  • 📌 табличная часть Результат;
  • 📌 в ней реквизит Контрагент с типом СправочникСсылка.Контрагенты;
  • 📌 реквизит Пометка с типом Булево — чтобы выбирать строки.

Добавляются они на вкладке Данные окна обработки: кнопка добавления над списком реквизитов или над списком табличных частей.

Шаг 3. Сохранение

Нажмите Ctrl+S и сохраните файл .epf в папку, к которой у вас есть доступ. Сохраняйте после каждой правки: обработка живёт только в этом файле, базу она не изменяет.

Тип СправочникСсылка.Контрагенты появится в списке, только если Конфигуратор открыт для базы, где есть такой справочник. Делайте обработку в копии той конфигурации, где она будет работать.

Где писать код обработки: модуль объекта и модуль формы

У внешней обработки два места для кода. Путают их чаще всего.

МодульГде выполняетсяЧто туда писать
Модуль объектаНа сервереОсновную логику: запросы, запись данных, расчёты; функцию регистрации для БСП
Модуль формыНа клиенте и на сервере, по директивамОбработчики кнопок, работу с диалогами, вызов серверной логики

Модуль объекта открывается с вкладки Основные кнопкой Открыть модуль объекта или из контекстного меню объекта. Модуль формы — вкладка Модуль внизу редактора формы.

Директивы компиляции

В модуле формы каждая процедура помечается, где она работает:

  • 🖥️ &НаКлиенте — реакция на нажатие, диалоги, вопросы пользователю;
  • 🗄️ &НаСервере — запросы и обращения к базе, с доступом к данным формы;
  • ⚡ &НаСервереБезКонтекста — серверный вызов без передачи формы, быстрее, но реквизиты формы в нём не видны.

Запрос к базе из процедуры &НаКлиенте выполнить нельзя. Правильная схема: клиентская процедура кнопки вызывает серверную.

Вызов логики из модуля объекта

Если основной код лежит в модуле объекта в экспортной процедуре ЗаполнитьРезультат(), из формы его вызывают так:

&НаСервере
Процедура ВыполнитьНаСервере()
	ОбработкаОбъект = РеквизитФормыВЗначение("Объект");
	ОбработкаОбъект.ЗаполнитьРезультат();
	ЗначениеВРеквизитФормы(ОбработкаОбъект, "Объект");
КонецПроцедуры

РеквизитФормыВЗначение превращает данные формы в настоящий объект обработки, а ЗначениеВРеквизитФормы возвращает изменения обратно, чтобы пользователь их увидел.

Делаем форму обработки: реквизиты, команды, кнопки

Без формы внешняя обработка откроется пустым окном. Форму добавляют на вкладке Формы: кнопка добавления запускает конструктор формы обработки. Отметьте реквизиты, которые нужны на форме, и оставьте флажок «Назначить форму основной».

Команда и кнопка

  1. В редакторе формы перейдите на вкладку Команды (справа вверху).
  2. Добавьте команду Заполнить, в свойстве Действие нажмите на лупу — Конфигуратор создаст обработчик в модуле формы.
  3. Перетащите команду мышью в дерево элементов слева. Появится кнопка.

Повторите то же для команды ПроставитьПризнак, если обработка должна что-то менять.

Полный код примера

Обработка находит контрагентов с пустым ИНН и показывает их в табличной части.

&НаКлиенте
Процедура Заполнить(Команда)
	ЗаполнитьНаСервере();
	Если Объект.Результат.Количество() = 0 Тогда
		ПоказатьПредупреждение(, "Контрагентов без ИНН не найдено.");
	КонецЕсли;
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьНаСервере()
	Запрос = Новый Запрос;
	Запрос.Текст =
	"ВЫБРАТЬ
	|	Контрагенты.Ссылка КАК Контрагент,
	|	ИСТИНА КАК Пометка
	|ИЗ
	|	Справочник.Контрагенты КАК Контрагенты
	|ГДЕ
	|	Контрагенты.ИНН = """"
	|	И НЕ Контрагенты.ЭтоГруппа
	|	И НЕ Контрагенты.ПометкаУдаления
	|
	|УПОРЯДОЧИТЬ ПО
	|	Контрагенты.Наименование";
	Объект.Результат.Загрузить(Запрос.Выполнить().Выгрузить());
КонецПроцедуры

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

Если обработка меняет данные

Изменение элемента справочника — через объект: Ссылка.ПолучитьОбъект(), правка реквизита, Записать(). Делайте это в серверной процедуре и только для строк с Пометка = Истина.

Обработка, которая записывает данные, сначала запускается на копии базы. Отменить массовую запись кнопкой нельзя — только восстановлением из резервной копии.

Для документов вместо Записать() без параметров используют Записать(РежимЗаписиДокумента.Проведение), если нужно перепровести. Перепроведение закрытого периода меняет отчётность — согласуйте это с главным бухгалтером.

Как запустить и отладить обработку в 1С

Запуск в режиме 1С:Предприятие

  1. Откройте базу в обычном режиме.
  2. Нажмите Ctrl+O или откройте главное меню (кнопка с тремя полосками слева вверху) и выберите Файл → Открыть.
  3. Укажите файл .epf.

При первом открытии платформа покажет предупреждение о безопасности: внешний файл может содержать любой код. Если файл ваш — подтвердите открытие.

Если вместо формы появляется сообщение о нарушении прав доступа, у пользователя нет права «Интерактивное открытие внешних обработок». В типовых конфигурациях его дают роли полных прав. Обычным пользователям обработку подключают через регистрацию — об этом ниже.

Отладка

Отладчик избавляет от гадания, почему таблица пустая.

  1. В Конфигураторе, где открыт файл .epf, поставьте точку останова: двойной щелчок слева от строки или F9.
  2. Запустите Отладка → Начать отладку → 1С:Предприятие (или F5).
  3. В открывшемся сеансе откройте тот же самый файл через Файл → Открыть.
  4. Нажмите кнопку на форме. Выполнение остановится на точке, значения переменных видны по наведению мыши и в окне Табло.

После правки кода сохраните файл и закройте форму обработки в сеансе 1С:Предприятие, затем откройте файл заново. Иначе будет работать старая версия.

Проверка перед выпуском

Перед тем как отдать обработку пользователям
Выполнено: 0 / 6

Внешние отчёты и загрузка данных из файлов

Внешний отчёт на СКД

Когда задача — только показать данные, делайте не обработку, а внешний отчёт.

  1. Файл → Новый → Внешний отчет.
  2. На вкладке Основные нажмите кнопку открытия схемы компоновки данных — создастся основная схема.
  3. Добавьте набор данных «Запрос», напишите запрос или соберите его конструктором.
  4. На вкладке Настройки нажмите на волшебную палочку (конструктор настроек) и выберите вид: список или таблица.
  5. Сохраните файл .erf.

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

Загрузка из CSV или Excel

Частый сценарий — загрузить прайс, остатки или список сотрудников из файла. Сложность в том, что файл лежит на компьютере пользователя, а запись в базу идёт на сервере. Файл сначала передают на сервер через временное хранилище.

&НаКлиенте
Процедура ЗагрузитьФайл(Команда)
	Оповещение = Новый ОписаниеОповещения("ПослеВыбораФайла", ЭтотОбъект);
	НачатьПомещениеФайла(Оповещение, , , Истина, УникальныйИдентификатор);
КонецПроцедуры

&НаКлиенте
Процедура ПослеВыбораФайла(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт
	Если Результат Тогда
		ПрочитатьНаСервере(Адрес);
	КонецЕсли;
КонецПроцедуры

&НаСервере
Процедура ПрочитатьНаСервере(Адрес)
	ИмяФайла = ПолучитьИмяВременногоФайла("csv");
	ПолучитьИзВременногоХранилища(Адрес).Записать(ИмяФайла);

	Текст = Новый ТекстовыйДокумент;
	Текст.Прочитать(ИмяФайла, КодировкаТекста.UTF8);
	Для НомерСтроки = 2 По Текст.КоличествоСтрок() Цикл
		Части = СтрРазделить(Текст.ПолучитьСтроку(НомерСтроки), ";");
		// Части[0] — первая колонка, Части[1] — вторая и т. д.
		// здесь ищете элемент по Части[0] и заполняете строку табличной части
	КонецЦикла;

	УдалитьФайлы(ИмяФайла);
КонецПроцедуры

Цикл начинается со второй строки, потому что в первой обычно заголовки колонок. Если файл сохранён из Excel в кодировке Windows, вместо КодировкаТекста.UTF8 укажите КодировкаТекста.ANSI.

Для .xlsx вместо текстового документа используют ТабличныйДокумент: его метод Прочитать() открывает файлы Excel, а значения ячеек берут через ПолучитьОбласть() или обращение к области по адресу R2C1.

Работа с файлами на сервере ограничена, если обработка зарегистрирована в безопасном режиме. Для загрузчиков флаг безопасного режима при регистрации снимают — и тем внимательнее проверяют код.

Как подключить обработку для пользователей и не навредить базе

Регистрация в «Дополнительных отчетах и обработках»

Типовые конфигурации построены на БСП. Чтобы файл можно было добавить в программу, в модуле объекта нужна экспортная функция СведенияОВнешнейОбработке():

Функция СведенияОВнешнейОбработке() Экспорт
	Параметры = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.2.2.1");
	Параметры.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительнаяОбработка();
	Параметры.Версия = "1.0";
	Параметры.БезопасныйРежим = Истина;

	Команда = Параметры.Команды.Добавить();
	Команда.Представление = "Контрагенты без ИНН";
	Команда.Идентификатор = "ОткрытьФорму";
	Команда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыОткрытиеФормы();
	Команда.ПоказыватьОповещение = Ложь;

	Возврат Параметры;
КонецФункции

Дальше в программе:

  1. Администрирование → Печатные формы, отчеты и обработки, включите флажок Дополнительные отчеты и обработки.
  2. Перейдите по ссылке Дополнительные отчеты и обработки, нажмите Добавить из файла и выберите .epf.
  3. В карточке на вкладке размещения укажите раздел, например «Справочники» или «Покупки».
  4. Сохраните. Команда появится в выбранном разделе в списке дополнительных обработок.

Без функции регистрации программа откажется добавлять файл: сообщит, что он не поддерживает подключение. Для внешнего отчёта в поле Вид указывают ВидОбработкиДополнительныйОтчет().

Что делает обработку безопасной

  • 🔒 Безопасный режим. С флагом БезопасныйРежим = Истина код не обращается к файлам, внешним компонентам и COM. Для обработок, которые только читают и пишут данные базы, этого достаточно.
  • 🧪 Копия базы. Любая запись данных сначала проверяется на копии.
  • 🗂️ Резервная копия перед запуском на рабочей базе, если обработка меняет больше нескольких объектов.
  • 👀 Чужие файлы. Внешняя обработка выполняется с правами того, кто её открыл. Файл .epf из незнакомого источника может удалить данные или отправить их наружу. Открывайте только то, код чего вы видели.
  • 🏷️ Версия. Меняйте Параметры.Версия при каждом выпуске — в карточке будет видно, какая копия загружена.

Хранение исходников

Файл .epf — двоичный, изменения в нём не сравнить. Если обработок много, выгружайте их в XML-файлы и храните в Git. В пакетном режиме Конфигуратора для этого есть параметр /DumpExternalDataProcessorOrReportToFiles, обратная загрузка — /LoadExternalDataProcessorOrReportFromFiles.

Частые вопросы

Можно ли сделать обработку без Конфигуратора?
Да, в 1С:EDT — это отдельная среда разработки. В пользовательском режиме 1С:Предприятия создать обработку нельзя.
Переживёт ли внешняя обработка обновление конфигурации?
Файл не меняется при обновлении. Но если в новом релизе переименовали реквизит или справочник, к которому обращается код, обработка выдаст ошибку при выполнении. После крупных обновлений проверяйте её на копии.
Почему обработка открывается в одной базе и не работает в другой?
Код ссылается на объекты конкретной конфигурации. Обработка для БП 3.0 с обращением к справочнику Контрагенты не заработает в ЗУП, где такого справочника нет.
Чем дополнительная обработка отличается от печатной формы?
Это разные виды в регистрационных данных. Печатная форма привязывается к документу или справочнику и появляется в меню печати, дополнительная обработка — в разделе программы.
Работает ли внешняя обработка в веб-клиенте?
Да, если код написан для управляемых форм и не использует COM, внешние компоненты и синхронные вызовы диалогов.