Что нужно, чтобы процедура программиста заработала в рабочей базе 1С

· 10 мин

Содержание

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

Если процедура уже написана, а в базе «не срабатывает», почти всегда виновато одно из трёх: не тот способ подключения, нехватка прав или серверный контекст, которого не было при проверке.

Способы интеграции процедуры в 1С и как выбрать свой

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

СпособКогда подходитЧто с обновлениямиРиски
Расширение конфигурации (.cfe)Дополнить проведение, форму, печать, добавить реквизит или новый объектТиповая остаётся на поддержке, обновляется штатноПосле обновления перехваченная процедура может измениться — расширение надо проверить
Внешняя обработка, подключённая через БСПРазовые и сервисные действия: загрузка, пересчёт, заполнение табличной части, печатная формаНе затрагивает конфигурацию вообщеСлабая связь с объектами: при переименовании реквизитов код падает в момент запуска
Правка модуля основной конфигурацииСамописная база или глубокая переработка, которую расширение не тянетКаждое обновление — сравнение и объединение вручнуюПотерянные правки, долгие обновления
Внешний модуль через COM или HTTP-сервисПроцедуру вызывает другая системаКонфигурацию трогать не нужно, если сервис уже опубликованБезопасность, настройка веб-сервера

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

Какая у вас задача?

Права доступа: почему процедура не выполняется у пользователя

Самая частая жалоба: «у меня работает, у бухгалтера нет». У программиста полные права, у пользователя — профиль с ограничениями. Причины обычно такие:

  • 🔒 Нет прав на новые объекты расширения. Реквизит или справочник, созданный в расширении, не получает права из ролей основной конфигурации автоматически. Нужна своя роль в расширении.
  • 🔒 Процедура читает данные, к которым у пользователя нет доступа. Типичный текст: Нарушение прав доступа!. Например, код в документе реализации читает регистр зарплаты.
  • 🔒 Запрещено открытие внешних обработок. Пользователь без соответствующего права не откроет .epf через Файл → Открыть. Это нормально: обработку надо зарегистрировать, тогда её запуск идёт через справочник.
  • 🔒 Расширение работает в безопасном режиме. Обращение к файлам, COM-объектам, внешним компонентам будет заблокировано.

Что делать по порядку:

  1. Создайте в расширении роль, например МоёРасш_ИспользованиеДоработки, и выдайте в ней права на собственные объекты расширения.
  2. В БП 3.0, ЗУП 3.1 и УТ 11 роль подключается через профили: Администрирование → Настройки пользователей и прав → Профили групп доступа. Добавьте роль в нужный профиль.
  3. Если процедура законно должна читать то, что пользователю не видно, вынесите эту часть в общий модуль с флагом Привилегированный или выполните её на сервере после УстановитьПривилегированныйРежим(Истина).

Привилегированный режим отключает проверку прав и ограничения на уровне записей. Включайте его только на узкий участок кода и никогда не принимайте в такой код произвольные параметры с клиента.

Как добавить процедуру через расширение, не меняя конфигурацию

Расширение — отдельный слой поверх типовой конфигурации. Поддерживается в платформе 8.3.6 и новее; удобные инструменты появились в последующих версиях, поэтому работайте на актуальной платформе.

Шаг 1. Создайте расширение

  1. Откройте базу в Конфигураторе.
  2. Меню Конфигурация → Расширения конфигурации, кнопка «Добавить».
  3. Задайте имя и префикс, например МоёРасш_. Префикс получат все новые объекты и процедуры — так их легко отличить от типовых.
  4. Назначение: «Дополнение».

Шаг 2. Заимствуйте объект и перехватите процедуру

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

Аннотации, которые нужно знать:

АннотацияЧто делаетКогда брать
&Перед("Имя")Ваш код выполняется до типовой процедурыПроверки, дозаполнение до записи
&После("Имя")Ваш код выполняется после типовойДополнительные движения, уведомления
&Вместо("Имя")Полностью заменяет типовую; вызвать оригинал можно через ПродолжитьВызов()Когда нужно изменить параметры вызова или пропустить типовую логику
&ИзменениеИКонтроль("Имя")Копия типовой процедуры, в которую вы вставляете строки между #Вставка и #КонецВставкиПравка в середине типового алгоритма

Пример: после типового проведения реализации записать сумму в свой регистр.

&После("ОбработкаПроведения")
Процедура МоёРасш_ОбработкаПроведения(Отказ, РежимПроведения)

	Если Отказ Тогда
		Возврат;
	КонецЕсли;

	Движения.МоёРасш_ПродажиПоМенеджерам.Записывать = Истина;
	Движение = Движения.МоёРасш_ПродажиПоМенеджерам.Добавить();
	Движение.Период   = Дата;
	Движение.Менеджер = Ответственный;
	Движение.Сумма    = СуммаДокумента;

КонецПроцедуры

Регистр МоёРасш_ПродажиПоМенеджерам создаётся в том же расширении, а у заимствованного документа его надо отметить в составе движений.

&ИзменениеИКонтроль полезна ещё и как сигнал: если после обновления типовая процедура изменилась, расширение не применится и Конфигуратор покажет расхождение. Ошибку вы увидите сразу, а не через месяц в отчётах.

Шаг 3. Перехват в модуле формы

В модуле формы аннотация перехвата пишется вместе с директивой компиляции:

&НаСервере
&После("ПриСозданииНаСервере")
Процедура МоёРасш_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	Если Объект.Ссылка.Пустая() Тогда
		Объект.Комментарий = "Создан менеджером " + Строка(Пользователи.ТекущийПользователь());
	КонецЕсли;
КонецПроцедуры

Шаг 4. Примените расширение в базе

Обновите конфигурацию базы данных (F7) в Конфигураторе. Если в расширении есть новые реквизиты или регистры, меняется структура базы — пользователей лучше попросить выйти.

Готовый файл .cfe в БП, ЗУП и УТ можно загрузить и без Конфигуратора: Администрирование → Печатные формы, отчеты и обработки → Расширения. Там же снимается флаг безопасного режима, если расширению нужен доступ к файлам или внешним компонентам.

Прямая правка конфигурации: когда это оправдано

Иногда расширение не справляется: сложная переделка типовых форм, изменение составов подсистем, много перехватов одной и той же процедуры. Тогда меняют саму конфигурацию.

Порядок:

  1. Сделайте выгрузку базы: Администрирование → Выгрузить информационную базу в Конфигураторе, файл .dt.
  2. Конфигурация → Поддержка → Настройка поддержки, включите возможность изменения.
  3. Для изменяемых объектов поставьте режим «Объект поставщика редактируется с сохранением поддержки». Тогда при обновлении вы увидите свои правки в окне сравнения.
  4. Внесите правки, пометьте их комментариями-маркерами.
  5. Обновите конфигурацию базы данных.

Снятие объекта с поддержки целиком отрезает его от обновлений поставщика: новые исправления фирмы 1С в этот объект не придут. Если всё же нужно — фиксируйте каждый такой объект в документации.

Маркеры в коде помогают при каждом следующем обновлении:

// МоёРасш_Начало ЗАДАЧА-142 Иванов 07.10
Если ЗначениеЗаполнено(Объект.Склад) Тогда
	ПроверитьОстатокНаСкладе(Объект.Склад);
КонецЕсли;
// МоёРасш_Конец ЗАДАЧА-142

Поиск по слову МоёРасш_ (Ctrl+Shift+F в Конфигураторе) находит все доработки за секунды.

Внешние обработки: как подключить процедуру кнопкой

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

Чтобы БСП приняла файл, в модуле объекта обработки нужны две экспортные процедуры.

Функция СведенияОВнешнейОбработке() Экспорт

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

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

	Возврат Параметры;

КонецФункции

Процедура ВыполнитьКоманду(ИдентификаторКоманды, ПараметрыВыполнения) Экспорт

	Если ИдентификаторКоманды = "ПересчитатьЦены" Тогда
		ПересчитатьЦены();
	КонецЕсли;

КонецПроцедуры

Дальше:

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

Ставьте БезопасныйРежим = Истина, если обработка не работает с файлами и COM. Администратору проще согласовать такой файл, а риск, что чужой код что-то сломает, ниже.

Когда обработку не стоит выбирать: если её надо запускать при каждом проведении. Вызов «из документа при записи» через внешнюю обработку — лишняя хрупкость, для этого есть расширение.

Отладка и тестирование процедуры до передачи в работу

Процедура, которая работает на одном документе, может упасть на тысяче. Проверку стоит строить в три этапа.

Где тестировать

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

Отладчик

  • Точка останова — F9 на строке кода.
  • Запуск: Отладка → Начать отладку (F5), в нужном клиенте.
  • Если процедура выполняется на сервере 1С:Предприятия, на сервере должна быть включена отладка. Без этого точки в серверном коде не сработают, хотя на файловой базе всё работало.
  • Подключиться к уже запущенному сеансу можно через Отладка → Подключение.

Что проверить обязательно

  • ✅ Пустые значения: документ без склада, без контрагента, с пустой табличной частью.
  • ✅ Пользователь с рабочим профилем, а не администратор.
  • ✅ Повторное проведение и отмена проведения — не задваиваются ли записи.
  • ✅ Групповое перепроведение за месяц — время выполнения.
  • ✅ Запуск в веб-клиенте, если им пользуются.

Для медленного кода включите Отладка → Замер производительности: он покажет строки, на которые уходит время. Обычно это запрос в цикле — выносите его из цикла одним запросом с временной таблицей.

Ошибки, которые встречаются чаще прочих:

Диагностика: выберите симптом

Как задокументировать и передать доработку

Через год никто не вспомнит, зачем в проведении реализации лишние три строки. Документация нужна минимальная, но обязательная.

В самом коде:

// Записывает продажу в регистр МоёРасш_ПродажиПоМенеджерам.
//
// Параметры:
//  Отказ - Булево - признак отказа от проведения.
//  РежимПроведения - РежимПроведенияДокумента - режим проведения.
//
// Задача: ЗАДАЧА-142, заказчик — коммерческий отдел.

В свойствах расширения или обработки: заполните поле «Версия» и меняйте его при каждой передаче. По номеру видно, какая сборка стоит у пользователей.

Отдельной запиской для администратора базы:

  1. Что делает доработка, одним абзацем.
  2. Какие объекты затронуты и какие роли добавлены.
  3. Нужна ли монопольная работа при установке.
  4. Что проверить после обновления типовой конфигурации.
  5. Как откатить: отключить расширение или удалить обработку из справочника.

Исходники держите в хранилище конфигурации или выгружайте в файлы (Конфигурация → Выгрузить конфигурацию в файлы) и кладите в Git. Так видна история правок, и откат делается за минуты.

Перед передачей доработки в рабочую базу
Выполнено: 0 / 6

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

Можно ли вызвать процедуру расширения из внешней обработки?
Да. Поместите её в общий модуль расширения, пометьте словом Экспорт и задайте флаги контекста (например, Сервер). Внешняя обработка вызовет её как обычный общий модуль, пока расширение подключено.
Слетит ли расширение после обновления конфигурации?
Расширение остаётся в базе. Но если изменилась перехваченная процедура или удалён заимствованный реквизит, оно может не примениться. После каждого обновления проверяйте расширения на совместимость.
Сколько расширений можно держать в одной базе?
Жёсткого лимита для обычной работы нет, но каждое добавляет время на запуск и перехват. Удобнее группировать доработки по смыслу: одно расширение для печатных форм, другое для учётной логики.
Чем &Вместо отличается от &ИзменениеИКонтроль?
&Вместо подменяет вызов целиком, а оригинал вызывается через ПродолжитьВызов(). &ИзменениеИКонтроль копирует тело типовой процедуры и даёт вставить строки внутрь, а при изменении оригинала поставщиком сообщает о расхождении.
Нужно ли выгонять пользователей при установке расширения?
Если расширение меняет структуру данных (новые реквизиты, регистры), обновление базы требует, чтобы пользователи вышли. Изменения только в коде модулей обычно применяются без этого, но новые сеансы увидят их после перезапуска.