Дополнительные обработки 1С — внешние обработки (.epf) и отчеты (.erf), загруженные в справочник «Дополнительные отчеты и обработки» БСП. Файл хранится в базе, команда появляется в разделе или в форме документа, типовая остается на поддержке. Ниже — настройка в типовой и код двух обработок: глобальной и назначаемой.
Имена процедур и тексты сообщений сверены с БСП 3.1.10 (КА 2.5) и 3.1.5 (УТ 11.4). Как создать сам файл в конфигураторе, рассказано в статье про внешнюю обработку, обзор подсистем — про БСП.
Конфигурация не меняется, поэтому обновления 1С доработку не затирают.
Настроить дополнительные обработки может администратор без конфигуратора.



Если раздел называется иначе, откройте «Все функции → Справочники → Дополнительные отчеты и обработки».
Глобальную обработку запускают в разделе: «Дополнительные обработки» (или «Дополнительные отчеты»), строка списка, «Выполнить». Назначаемая появляется в документе: в подменю «Заполнить», «Печать» или «Отчеты».
Подключать и настраивать обработки дает роль «Добавление и изменение дополнительных отчетов и обработок», запускать — «Чтение дополнительных отчетов и обработок», в УТ 11 и КА 2 для команд в разделах нужна еще «Использование дополнительных отчетов и обработок УТ». Роли входят в профили групп доступа, см. статью о правах доступа.
Частая ловушка — быстрый доступ. Окно «Дополнительные обработки» показывает пользователю только команды, включенные ему в быстрый доступ: администратором в карточке или им самим кнопкой «Настроить список». Без отметки обработка подключена, но в списке ее нет.
Новую версию удобно сначала проверить копией в «Режиме отладки».
В модуле объекта нужна экспортная функция СведенияОВнешнейОбработке(). Шаблон структуры возвращает ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке(ВерсияБСП): заполните Вид, Версия, Информация, Команды, для назначаемых — Назначение, для файлов и интернета — Разрешения. Вид определяет, где появится команда и как БСП вызовет код:
| Вид | Где команда | Обработчик в модуле объекта |
|---|---|---|
| ДополнительнаяОбработка, ДополнительныйОтчет | Разделы программы | ВыполнитьКоманду(ИдентификаторКоманды, ПараметрыВыполнения) |
| ЗаполнениеОбъекта, Отчет | «Заполнить» и «Отчеты» в формах объектов и списков | ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначения, ПараметрыВыполнения) |
| СозданиеСвязанныхОбъектов | Команда «Создание связанных объектов...» | ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначения, СозданныеОбъекты, ПараметрыВыполнения) |
| ПечатнаяФорма | Подменю «Печать» | Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) |
| ШаблонСообщения | Шаблоны писем и SMS | ПараметрыШаблона() и СформироватьСообщениеПоШаблону(Значения) |
В УТ 11 и КА 2 есть еще два вида для скидок, их добавила сама конфигурация. Печатные формы разобраны в статье о внешней печатной форме на БСП, отчеты — о внешнем отчете.
Тип команды задает колонка Использование:
| Тип | Что делает БСП |
|---|---|
| ОткрытиеФормы | Открывает основную форму, передает ИдентификаторКоманды, ДополнительнаяОбработкаСсылка, назначаемым — ОбъектыНазначения |
| ВызовКлиентскогоМетода | Вызывает экспортную ВыполнитьКоманду(ИдентификаторКоманды) основной формы, не открывая ее |
| ВызовСерверногоМетода | Вызывает ВыполнитьКоманду модуля объекта, из окна раздела — фоновым заданием; ставится на расписание |
| ЗаполнениеФормы | Только заполнение объекта: передает открытую форму без записи документа |
| ЗагрузкаДанныхИзФайла | Глобальные обработки при подсистеме «Загрузка данных из файла» |
| СценарийВБезопасномРежиме | Функции нет, только строка; в БСП 3.1 выполняется как серверный метод |
Вид и тип берите из функций ДополнительныеОтчетыИОбработкиКлиентСервер: опечатку в имени функции поймает проверка синтаксиса, в строке — только загрузка.
Безопасный режим и разрешения. По умолчанию обработка работает в безопасном режиме: запросы и запись объектов доступны, а COM, внешние компоненты, запуск программ, интернет и файлы вне временного каталога запрещены. Вместо отключения режима перечислите разрешения функциями РаботаВБезопасномРежиме.РазрешениеНа...(). Без профилей безопасности в кластере БСП подключит такую обработку без безопасного режима и покажет список на вкладке «Разрешения», с профилями — запустит в профиле, где разрешено только перечисленное.
Пример — выгрузка номенклатуры в CSV для сайта. Команда настройки открывает форму, команда выгрузки работает на сервере — из раздела, формы и по расписанию. Файл пишется в каталог сервера 1С, поэтому нужно разрешение. Постоянный двусторонний обмен — отдельная задача, см. обмен 1С с сайтом.
// Модуль объекта обработки «Выгрузка номенклатуры для сайта».
// Глобальная дополнительная обработка: форма настроек и серверная команда.
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
#Область ПрограммныйИнтерфейс
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.2.2.1");
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительнаяОбработка();
ПараметрыРегистрации.Версия = "1.1";
ПараметрыРегистрации.Информация = НСтр("ru = 'Выгрузка номенклатуры в CSV-файл для сайта'");
// Запись в каталог сервера: без разрешения ее запретит безопасный режим.
ПараметрыРегистрации.Разрешения.Добавить(
РаботаВБезопасномРежиме.РазрешениеНаИспользованиеКаталогаФайловойСистемы(
КаталогВыгрузки(), Ложь, Истина, НСтр("ru = 'Файл номенклатуры для сайта'")));
Команда = ПараметрыРегистрации.Команды.Добавить();
Команда.Представление = НСтр("ru = 'Выгрузка номенклатуры: настройка'");
Команда.Идентификатор = "ОткрытьНастройки";
Команда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыОткрытиеФормы();
Команда.ПоказыватьОповещение = Ложь;
Команда = ПараметрыРегистрации.Команды.Добавить();
Команда.Представление = НСтр("ru = 'Выгрузить номенклатуру для сайта'");
Команда.Идентификатор = "ВыгрузитьНоменклатуру";
Команда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода();
Команда.ПоказыватьОповещение = Истина;
Возврат ПараметрыРегистрации;
КонецФункции
// Серверная команда: запуск из раздела, из формы обработки и по расписанию.
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ПараметрыВыполнения) Экспорт
Если ИдентификаторКоманды <> "ВыгрузитьНоменклатуру" Тогда
ВызватьИсключение СтрШаблон(НСтр("ru = 'Неизвестная команда: %1'"), ИдентификаторКоманды);
КонецЕсли;
Настройки = ЗагрузитьНастройкиВыгрузки(ПараметрыВыполнения.ДополнительнаяОбработкаСсылка);
// Форма может передать значение, не сохраняя настройки.
Если ПараметрыВыполнения.Свойство("КонтекстТолькоСАртикулом") Тогда
Настройки.ТолькоСАртикулом = ПараметрыВыполнения.КонтекстТолькоСАртикулом;
КонецЕсли;
Выгружено = ВыгрузитьНоменклатуру(Настройки.ТолькоСАртикулом);
ПараметрыВыполнения.РезультатВыполнения.Вставить("Выгружено", Выгружено);
ЗаписьЖурналаРегистрации(НСтр("ru = 'Выгрузка номенклатуры для сайта'"),
УровеньЖурналаРегистрации.Информация, , ПараметрыВыполнения.ДополнительнаяОбработкаСсылка,
СтрШаблон(НСтр("ru = 'Выгружено позиций: %1'"), Выгружено));
КонецПроцедуры
// Настройки хранятся в карточке справочника, в реквизите ХранилищеНастроек.
Функция ЗагрузитьНастройкиВыгрузки(СсылкаНаОбработку) Экспорт
Настройки = Новый Структура("ТолькоСАртикулом", Ложь);
Если Не ЗначениеЗаполнено(СсылкаНаОбработку) Тогда
Возврат Настройки;
КонецЕсли;
Хранилище = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(СсылкаНаОбработку, "ХранилищеНастроек");
Сохраненные = ?(ТипЗнч(Хранилище) = Тип("ХранилищеЗначения"), Хранилище.Получить(), Неопределено);
Если ТипЗнч(Сохраненные) = Тип("Структура") Тогда
ЗаполнитьЗначенияСвойств(Настройки, Сохраненные);
КонецЕсли;
Возврат Настройки;
КонецФункции
Процедура СохранитьНастройкиВыгрузки(СсылкаНаОбработку, Настройки) Экспорт
НачатьТранзакцию();
Попытка
Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("Справочник.ДополнительныеОтчетыИОбработки");
ЭлементБлокировки.УстановитьЗначение("Ссылка", СсылкаНаОбработку);
Блокировка.Заблокировать();
КарточкаОбработки = СсылкаНаОбработку.ПолучитьОбъект();
КарточкаОбработки.ХранилищеНастроек = Новый ХранилищеЗначения(Настройки);
КарточкаОбработки.Записать();
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
Функция ВыгрузитьНоменклатуру(ТолькоСАртикулом)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Код КАК Код,
| Номенклатура.Артикул КАК Артикул,
| Номенклатура.Наименование КАК Наименование
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| НЕ Номенклатура.ЭтоГруппа
| И НЕ Номенклатура.ПометкаУдаления
| И (НЕ &ТолькоСАртикулом
| ИЛИ Номенклатура.Артикул <> """")
|
|УПОРЯДОЧИТЬ ПО
| Код";
Запрос.УстановитьПараметр("ТолькоСАртикулом", ТолькоСАртикулом);
Выборка = Запрос.Выполнить().Выбрать();
Файл = Новый ЗаписьТекста(КаталогВыгрузки() + "nomenclature.csv", КодировкаТекста.UTF8);
Попытка
Файл.ЗаписатьСтроку("code;article;name");
Пока Выборка.Следующий() Цикл
Файл.ЗаписатьСтроку(ПолеCSV(Выборка.Код) + ";" + ПолеCSV(Выборка.Артикул) + ";"
+ ПолеCSV(Выборка.Наименование));
КонецЦикла;
Исключение
Файл.Закрыть();
ВызватьИсключение;
КонецПопытки;
Файл.Закрыть();
Возврат Выборка.Количество();
КонецФункции
// Значение в кавычках, внутренние кавычки удваиваются: «;» в названии не ломает строку.
Функция ПолеCSV(Значение)
Возврат """" + СтрЗаменить(СокрЛП(Значение), """", """""") + """";
КонецФункции
// Каталог на сервере 1С, а не на компьютере пользователя. Должен существовать.
Функция КаталогВыгрузки()
Возврат "C:\Exchange\Site\";
КонецФункции
#КонецОбласти
#КонецЕсли
СведенияОВнешнейОбработке("2.2.2.1") — версия БСП строго из четырех чисел. Не ниже 1.2.1.4, иначе БСП вызовет ВыполнитьКоманду с одним параметром. Выше 2.2.2.0, иначе разрешения не учитываются.Разрешения — без них ЗаписьТекста упадет на ошибке безопасного режима.ДополнительнаяОбработкаСсылка — карточка обработки, в ее реквизите ХранилищеНастроек лежат настройки администратора. В БСП 3.1.10 для них есть ДополнительныеОтчетыИОбработки.СохранитьНастройки и ЗагрузитьНастройки, в 3.1.5 нет, поэтому функции свои.РезультатВыполнения — структура, которую БСП вернет форме, запустившей команду.ЗаписьЖурналаРегистрации — при запуске по расписанию итог ищут в журнале.Основную форму открывает команда «Открытие формы». Добавьте в обработку реквизит ТолькоСАртикулом (Булево), а в форму — параметр ДополнительнаяОбработкаСсылка: необъявленный параметр доступен только в ПриСозданииНаСервере, а здесь он нужен и на клиенте.
// Модуль основной формы той же обработки. Нужны: реквизит обработки
// ТолькоСАртикулом (Булево), параметр формы ДополнительнаяОбработкаСсылка
// (СправочникСсылка.ДополнительныеОтчетыИОбработки), команды Сохранить и ВыгрузитьСейчас.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Ссылки нет, если файл открыли через Файл - Открыть, а не из раздела.
Если Не ЗначениеЗаполнено(Параметры.ДополнительнаяОбработкаСсылка) Тогда
ВызватьИсключение НСтр("ru = 'Запустите обработку из раздела программы.'");
КонецЕсли;
Настройки = РеквизитФормыВЗначение("Объект").ЗагрузитьНастройкиВыгрузки(Параметры.ДополнительнаяОбработкаСсылка);
Объект.ТолькоСАртикулом = Настройки.ТолькоСАртикулом;
КонецПроцедуры
&НаКлиенте
Процедура Сохранить(Команда)
СохранитьНаСервере();
ПоказатьОповещениеПользователя(НСтр("ru = 'Настройки выгрузки сохранены'"));
КонецПроцедуры
&НаСервере
Процедура СохранитьНаСервере()
// Настройки пишутся в карточку справочника: нужно право на ее изменение.
Если Не ПравоДоступа("Изменение", Метаданные.Справочники.ДополнительныеОтчетыИОбработки) Тогда
ВызватьИсключение НСтр("ru = 'Настройки выгрузки может менять только администратор.'");
КонецЕсли;
Настройки = Новый Структура("ТолькоСАртикулом", Объект.ТолькоСАртикулом);
РеквизитФормыВЗначение("Объект").СохранитьНастройкиВыгрузки(Параметры.ДополнительнаяОбработкаСсылка, Настройки);
КонецПроцедуры
&НаКлиенте
Процедура ВыгрузитьСейчас(Команда)
ПараметрыКоманды = ДополнительныеОтчетыИОбработкиКлиент.ПараметрыВыполненияКомандыВФоне(
Параметры.ДополнительнаяОбработкаСсылка);
ПараметрыКоманды.СопровождающийТекст = НСтр("ru = 'Выгрузка номенклатуры...'");
// Свои параметры - с префиксом Контекст, чтобы не совпасть со служебными.
ПараметрыКоманды.Вставить("КонтекстТолькоСАртикулом", Объект.ТолькоСАртикулом);
Обработчик = Новый ОписаниеОповещения("ВыгрузитьСейчасЗавершение", ЭтотОбъект);
ДополнительныеОтчетыИОбработкиКлиент.ВыполнитьКомандуВФоне("ВыгрузитьНоменклатуру", ПараметрыКоманды, Обработчик);
КонецПроцедуры
&НаКлиенте
Процедура ВыгрузитьСейчасЗавершение(Результат, ДополнительныеПараметры) Экспорт
Если Результат = Неопределено Тогда
Возврат; // выгрузку отменили
ИначеЕсли Результат.Статус = "Ошибка" Тогда
ПоказатьПредупреждение(, Результат.КраткоеПредставлениеОшибки);
Возврат;
КонецЕсли;
РезультатВыполнения = ПолучитьИзВременногоХранилища(Результат.АдресРезультата);
ПоказатьОповещениеПользователя(НСтр("ru = 'Выгрузка завершена'"), ,
СтрШаблон(НСтр("ru = 'Позиций в файле: %1'"), РезультатВыполнения.Выгружено));
КонецПроцедуры
ВыполнитьКомандуВФоне запускает ту же серверную команду длительной операцией: форма не зависает, сообщения задания выводятся в нее, результат приходит через временное хранилище.
В карточке на вкладке «Команды» выделите «Выгрузить номенклатуру для сайта» и нажмите «Настроить расписание...». БСП создаст регламентное задание «Запуск дополнительных обработок», которое вызывает ту же ВыполнитьКоманду. Расписание есть только у глобальной обработки и только для команд «Вызов серверного метода» и «Сценарий в безопасном режиме»; отключенная публикация выключает задание. Запуск и завершение попадают в журнал регистрации с событием «Дополнительные отчеты и обработки». Как задания работают в файловой базе — в статье о регламентных заданиях.
Пример чистит табличную часть «Товары» от строк с нулевым количеством двумя командами: в открытой форме без записи и в выделенных документах списка с записью.
// Модуль объекта обработки «Нулевые строки в товарах».
// Вид «Заполнение объекта»: документы с табличной частью Товары и колонкой Количество.
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
#Область ПрограммныйИнтерфейс
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.2.2.1");
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиЗаполнениеОбъекта();
ПараметрыРегистрации.Версия = "1.0";
ПараметрыРегистрации.Информация = НСтр("ru = 'Удаляет строки товаров с нулевым количеством'");
// Имена для УТ 11 и БП 3.0: отсутствующие в конфигурации БСП пропустит.
ПараметрыРегистрации.Назначение.Добавить("Документ.ЗаказКлиента");
ПараметрыРегистрации.Назначение.Добавить("Документ.РеализацияТоваровУслуг");
ПараметрыРегистрации.Назначение.Добавить("Документ.ПриобретениеТоваровУслуг");
ПараметрыРегистрации.Назначение.Добавить("Документ.ПоступлениеТоваровУслуг");
Команда = ПараметрыРегистрации.Команды.Добавить();
Команда.Представление = НСтр("ru = 'Удалить строки с нулевым количеством'");
Команда.Идентификатор = "ОчиститьФорму";
Команда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыЗаполнениеФормы();
Команда.ПоказыватьОповещение = Ложь;
Команда = ПараметрыРегистрации.Команды.Добавить();
Команда.Представление = НСтр("ru = 'Удалить нулевые строки в непроведенных документах'");
Команда.Идентификатор = "ОчиститьДокументы";
Команда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода();
Команда.ПоказыватьОповещение = Истина;
Возврат ПараметрыРегистрации;
КонецФункции
// У назначаемых обработок в ВыполнитьКоманду три параметра.
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначения, ПараметрыВыполнения) Экспорт
Если ИдентификаторКоманды = "ОчиститьФорму" Тогда
// Документ не записывается: меняем данные открытой формы.
Форма = ПараметрыВыполнения.ЭтаФорма;
Удалено = УдалитьНулевыеСтроки(Форма.Объект.Товары);
Если Удалено > 0 Тогда
Форма.Модифицированность = Истина;
КонецЕсли;
ОбщегоНазначения.СообщитьПользователю(СтрШаблон(НСтр("ru = 'Удалено строк: %1'"), Удалено));
ИначеЕсли ИдентификаторКоманды = "ОчиститьДокументы" Тогда
ОчиститьДокументы(ОбъектыНазначения);
Иначе
ВызватьИсключение СтрШаблон(НСтр("ru = 'Неизвестная команда: %1'"), ИдентификаторКоманды);
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
// Подходит и для табличной части объекта, и для коллекции данных формы.
Функция УдалитьНулевыеСтроки(Товары)
Удалено = 0;
Индекс = Товары.Количество() - 1;
Пока Индекс >= 0 Цикл
СтрокаТоваров = Товары[Индекс];
Если СтрокаТоваров.Количество = 0 Тогда
Товары.Удалить(СтрокаТоваров);
Удалено = Удалено + 1;
КонецЕсли;
Индекс = Индекс - 1;
КонецЦикла;
Возврат Удалено;
КонецФункции
Процедура ОчиститьДокументы(ОбъектыНазначения)
Изменено = 0;
Ошибки = Новый Массив;
Для Каждого ДокументСсылка Из ОбъектыНазначения Цикл
ДокументОбъект = ДокументСсылка.ПолучитьОбъект();
// Удаленные и проведенные пропускаем, чтобы не менять движения.
Если ДокументОбъект = Неопределено Или ДокументОбъект.Проведен Тогда
Продолжить;
КонецЕсли;
Попытка
ДокументОбъект.Заблокировать();
Если УдалитьНулевыеСтроки(ДокументОбъект.Товары) > 0 Тогда
ДокументОбъект.Записать(РежимЗаписиДокумента.Запись);
Изменено = Изменено + 1;
КонецЕсли;
Исключение
Ошибки.Добавить(Строка(ДокументСсылка) + ": "
+ ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
КонецЦикла;
// Из окна списка команда идет фоновым заданием: сообщение там не видно, исключение - видно.
Если Ошибки.Количество() > 0 Тогда
ВызватьИсключение СтрШаблон(НСтр("ru = 'Изменено документов: %1. Не записаны:'"), Изменено)
+ Символы.ПС + СтрСоединить(Ошибки, Символы.ПС);
КонецЕсли;
ОбщегоНазначения.СообщитьПользователю(СтрШаблон(НСтр("ru = 'Изменено документов: %1'"), Изменено));
КонецПроцедуры
#КонецОбласти
#КонецЕсли
Назначение — полные имена объектов, допустима маска "Документ.*". Отсутствующие имена и объекты вне определяемого типа ОбъектСДополнительнымиКомандами БСП молча пропустит.ПараметрыВыполнения.ЭтаФорма, ОбъектыНазначения равно Неопределено. Обработчики формы не срабатывают: итоги, если они есть, пересчитайте в команде.Экспорт или лежит в модуле формы.БезопасныйРежим = Ложь — замените на разрешения.ВыполнитьКоманду вызывается только с идентификатором.Файл тот же, .epf. Внешнюю открывают через «Файл → Открыть», нужен файл и право на интерактивное открытие внешних обработок. Дополнительная зарегистрирована в справочнике: файл в базе, команда в интерфейсе, права, расписание и безопасный режим берет на себя БСП.
Все подключенные обработки — в справочнике «Дополнительные отчеты и обработки», с отборами по виду и публикации. «Сохранить как...» выгрузит файл из базы — так восстанавливают обработку с потерянным исходником.
Нет, обработка хранится как данные. Исключение — документ вне определяемого типа ОбъектСДополнительнымиКомандами: назначить ему обработку без изменения конфигурации нельзя, команду проще сделать в расширении.
Обработка — для действий поверх типовой: загрузка, выгрузка, отчеты, печать, групповая правка. Расширение — когда меняется поведение самой типовой: проведение, проверки, формы, реквизиты.
Если обработка нужна под ваши данные — загрузка прайса, выгрузка на сайт или маркетплейс, своя печатная форма, — быстрее отдать ее программисту, который соберет ее по правилам БСП и проверит на копии базы. Подробнее — на странице отчеты и обработки 1С. Опишите задачу и разместите ее бесплатно: оценка бесплатная, ответ в течение рабочего дня.
Станьте частью сообщества!
Войдите или зарегистрируйтесь, и вы сможете участвовать в обсуждениях.