Что нужно, чтобы процедура программиста заработала в рабочей базе 1С
Содержание
Чтобы написанная программистом процедура заработала в базе 1С 8.3, нужно три вещи: место, откуда её вызовут (расширение, внешняя обработка или модуль самой конфигурации), права пользователя на запуск и данные, и проверка на копии базы. В типовых конфигурациях на платформе 8.3 первый выбор почти всегда — расширение конфигурации : процедура дополняет типовую, а сама конфигурация остаётся на поддержке и спокойно обновляется.
Если процедура уже написана, а в базе «не срабатывает», почти всегда виновато одно из трёх: не тот способ подключения, нехватка прав или серверный контекст, которого не было при проверке.
Способы интеграции процедуры в 1С и как выбрать свой
Способов четыре. Они отличаются тем, где живёт код и что будет при обновлении типовой конфигурации.
| Способ | Когда подходит | Что с обновлениями | Риски |
|---|---|---|---|
Расширение конфигурации (.cfe) | Дополнить проведение, форму, печать, добавить реквизит или новый объект | Типовая остаётся на поддержке, обновляется штатно | После обновления перехваченная процедура может измениться — расширение надо проверить |
| Внешняя обработка, подключённая через БСП | Разовые и сервисные действия: загрузка, пересчёт, заполнение табличной части, печатная форма | Не затрагивает конфигурацию вообще | Слабая связь с объектами: при переименовании реквизитов код падает в момент запуска |
| Правка модуля основной конфигурации | Самописная база или глубокая переработка, которую расширение не тянет | Каждое обновление — сравнение и объединение вручную | Потерянные правки, долгие обновления |
| Внешний модуль через COM или HTTP-сервис | Процедуру вызывает другая система | Конфигурацию трогать не нужно, если сервис уже опубликован | Безопасность, настройка веб-сервера |
Простое правило: если процедура должна выполняться автоматически при записи, проведении или открытии формы — это расширение. Если пользователь запускает её сам, кнопкой, — внешняя обработка. Правка конфигурации — крайний случай.
Права доступа: почему процедура не выполняется у пользователя
Самая частая жалоба: «у меня работает, у бухгалтера нет». У программиста полные права, у пользователя — профиль с ограничениями. Причины обычно такие:
- 🔒 Нет прав на новые объекты расширения. Реквизит или справочник, созданный в расширении, не получает права из ролей основной конфигурации автоматически. Нужна своя роль в расширении.
- 🔒 Процедура читает данные, к которым у пользователя нет доступа. Типичный текст:
Нарушение прав доступа!. Например, код в документе реализации читает регистр зарплаты. - 🔒 Запрещено открытие внешних обработок. Пользователь без соответствующего права не откроет
.epfчерезФайл → Открыть. Это нормально: обработку надо зарегистрировать, тогда её запуск идёт через справочник. - 🔒 Расширение работает в безопасном режиме. Обращение к файлам, COM-объектам, внешним компонентам будет заблокировано.
Что делать по порядку:
- Создайте в расширении роль, например
МоёРасш_ИспользованиеДоработки, и выдайте в ней права на собственные объекты расширения. - В БП 3.0, ЗУП 3.1 и УТ 11 роль подключается через профили:
Администрирование → Настройки пользователей и прав → Профили групп доступа. Добавьте роль в нужный профиль. - Если процедура законно должна читать то, что пользователю не видно, вынесите эту часть в общий модуль с флагом Привилегированный или выполните её на сервере после
УстановитьПривилегированныйРежим(Истина).
Привилегированный режим отключает проверку прав и ограничения на уровне записей. Включайте его только на узкий участок кода и никогда не принимайте в такой код произвольные параметры с клиента.
Как добавить процедуру через расширение, не меняя конфигурацию
Расширение — отдельный слой поверх типовой конфигурации. Поддерживается в платформе 8.3.6 и новее; удобные инструменты появились в последующих версиях, поэтому работайте на актуальной платформе.
Шаг 1. Создайте расширение
- Откройте базу в Конфигураторе.
- Меню
Конфигурация → Расширения конфигурации, кнопка «Добавить». - Задайте имя и префикс, например
МоёРасш_. Префикс получат все новые объекты и процедуры — так их легко отличить от типовых. - Назначение: «Дополнение».
Шаг 2. Заимствуйте объект и перехватите процедуру
Откройте модуль нужного объекта в основной конфигурации, встаньте на процедуру и через контекстное меню выберите добавление в расширение. Конфигуратор предложит вид перехвата и создаст заготовку.
Аннотации, которые нужно знать:
| Аннотация | Что делает | Когда брать |
|---|---|---|
&Перед("Имя") | Ваш код выполняется до типовой процедуры | Проверки, дозаполнение до записи |
&После("Имя") | Ваш код выполняется после типовой | Дополнительные движения, уведомления |
&Вместо("Имя") | Полностью заменяет типовую; вызвать оригинал можно через ПродолжитьВызов() | Когда нужно изменить параметры вызова или пропустить типовую логику |
&ИзменениеИКонтроль("Имя") | Копия типовой процедуры, в которую вы вставляете строки между #Вставка и #КонецВставки | Правка в середине типового алгоритма |
Пример: после типового проведения реализации записать сумму в свой регистр.
&После("ОбработкаПроведения")
Процедура МоёРасш_ОбработкаПроведения(Отказ, РежимПроведения)
Если Отказ Тогда
Возврат;
КонецЕсли;
Движения.МоёРасш_ПродажиПоМенеджерам.Записывать = Истина;
Движение = Движения.МоёРасш_ПродажиПоМенеджерам.Добавить();
Движение.Период = Дата;
Движение.Менеджер = Ответственный;
Движение.Сумма = СуммаДокумента;
КонецПроцедуры
Регистр МоёРасш_ПродажиПоМенеджерам создаётся в том же расширении, а у заимствованного документа его надо отметить в составе движений.
&ИзменениеИКонтроль полезна ещё и как сигнал: если после обновления типовая процедура изменилась, расширение не применится и Конфигуратор покажет расхождение. Ошибку вы увидите сразу, а не через месяц в отчётах.
Шаг 3. Перехват в модуле формы
В модуле формы аннотация перехвата пишется вместе с директивой компиляции:
&НаСервере
&После("ПриСозданииНаСервере")
Процедура МоёРасш_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Объект.Ссылка.Пустая() Тогда
Объект.Комментарий = "Создан менеджером " + Строка(Пользователи.ТекущийПользователь());
КонецЕсли;
КонецПроцедуры
Шаг 4. Примените расширение в базе
Обновите конфигурацию базы данных (F7) в Конфигураторе. Если в расширении есть новые реквизиты или регистры, меняется структура базы — пользователей лучше попросить выйти.
Готовый файл .cfe в БП, ЗУП и УТ можно загрузить и без Конфигуратора: Администрирование → Печатные формы, отчеты и обработки → Расширения. Там же снимается флаг безопасного режима, если расширению нужен доступ к файлам или внешним компонентам.
Прямая правка конфигурации: когда это оправдано
Иногда расширение не справляется: сложная переделка типовых форм, изменение составов подсистем, много перехватов одной и той же процедуры. Тогда меняют саму конфигурацию.
Порядок:
- Сделайте выгрузку базы:
Администрирование → Выгрузить информационную базув Конфигураторе, файл.dt. Конфигурация → Поддержка → Настройка поддержки, включите возможность изменения.- Для изменяемых объектов поставьте режим «Объект поставщика редактируется с сохранением поддержки». Тогда при обновлении вы увидите свои правки в окне сравнения.
- Внесите правки, пометьте их комментариями-маркерами.
- Обновите конфигурацию базы данных.
Снятие объекта с поддержки целиком отрезает его от обновлений поставщика: новые исправления фирмы 1С в этот объект не придут. Если всё же нужно — фиксируйте каждый такой объект в документации.
Маркеры в коде помогают при каждом следующем обновлении:
// МоёРасш_Начало ЗАДАЧА-142 Иванов 07.10
Если ЗначениеЗаполнено(Объект.Склад) Тогда
ПроверитьОстатокНаСкладе(Объект.Склад);
КонецЕсли;
// МоёРасш_Конец ЗАДАЧА-142
Поиск по слову МоёРасш_ (Ctrl+Shift+F в Конфигураторе) находит все доработки за секунды.
Внешние обработки: как подключить процедуру кнопкой
Внешняя обработка (.epf) хороша для действий, которые пользователь запускает сам. В типовых конфигурациях на БСП её регистрируют в справочнике дополнительных отчётов и обработок, после чего команда появляется в форме нужного документа или в разделе.
Чтобы БСП приняла файл, в модуле объекта обработки нужны две экспортные процедуры.
Функция СведенияОВнешнейОбработке() Экспорт
Параметры = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.4.1.1");
Параметры.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительнаяОбработка();
Параметры.Версия = "1.0";
Параметры.БезопасныйРежим = Истина;
Команда = Параметры.Команды.Добавить();
Команда.Представление = "Пересчитать цены в номенклатуре";
Команда.Идентификатор = "ПересчитатьЦены";
Команда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода();
Команда.ПоказыватьОповещение = Истина;
Возврат Параметры;
КонецФункции
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ПараметрыВыполнения) Экспорт
Если ИдентификаторКоманды = "ПересчитатьЦены" Тогда
ПересчитатьЦены();
КонецЕсли;
КонецПроцедуры
Дальше:
Администрирование → Печатные формы, отчеты и обработки → Дополнительные отчеты и обработки, кнопка «Добавить из файла».- Укажите
.epf. Карточка заполнится данными изСведенияОВнешнейОбработке. - На закладке команд задайте размещение (раздел) и пользователей, которым команда доступна.
- Запишите карточку.
Ставьте БезопасныйРежим = Истина, если обработка не работает с файлами и COM. Администратору проще согласовать такой файл, а риск, что чужой код что-то сломает, ниже.
Когда обработку не стоит выбирать: если её надо запускать при каждом проведении. Вызов «из документа при записи» через внешнюю обработку — лишняя хрупкость, для этого есть расширение.
Отладка и тестирование процедуры до передачи в работу
Процедура, которая работает на одном документе, может упасть на тысяче. Проверку стоит строить в три этапа.
Где тестировать
Не в рабочей базе. Загрузите .dt в отдельную файловую базу
или создайте копию на сервере. Расширения и обработки переносятся в копию тем же способом, что и в рабочую.
Отладчик
- Точка останова —
F9на строке кода. - Запуск:
Отладка → Начать отладку(F5), в нужном клиенте. - Если процедура выполняется на сервере 1С:Предприятия, на сервере должна быть включена отладка. Без этого точки в серверном коде не сработают, хотя на файловой базе всё работало.
- Подключиться к
уже запущенному сеансу можно через
Отладка → Подключение.
Что проверить обязательно
- ✅ Пустые значения: документ без склада, без контрагента, с пустой табличной частью.
- ✅ Пользователь с рабочим профилем, а не администратор.
- ✅ Повторное проведение и отмена проведения — не задваиваются ли записи.
- ✅ Групповое перепроведение за месяц — время выполнения.
- ✅ Запуск в веб-клиенте, если им пользуются.
Для медленного кода включите Отладка → Замер производительности: он покажет строки, на которые уходит время. Обычно это запрос в цикле — выносите его из цикла одним запросом с временной таблицей.
Ошибки, которые встречаются чаще прочих:
Как задокументировать и передать доработку
Через год никто не вспомнит, зачем в проведении реализации лишние три строки. Документация нужна минимальная, но обязательная.
В самом коде:
// Записывает продажу в регистр МоёРасш_ПродажиПоМенеджерам.
//
// Параметры:
// Отказ - Булево - признак отказа от проведения.
// РежимПроведения - РежимПроведенияДокумента - режим проведения.
//
// Задача: ЗАДАЧА-142, заказчик — коммерческий отдел.
В свойствах расширения или обработки: заполните поле «Версия» и меняйте его при каждой передаче. По номеру видно, какая сборка стоит у пользователей.
Отдельной запиской для администратора базы:
- Что делает доработка, одним абзацем.
- Какие объекты затронуты и какие роли добавлены.
- Нужна ли монопольная работа при установке.
- Что проверить после обновления типовой конфигурации.
- Как откатить: отключить расширение или удалить обработку из справочника.
Исходники держите в хранилище конфигурации или выгружайте в файлы (Конфигурация → Выгрузить конфигурацию в файлы) и кладите в Git. Так видна история правок, и откат делается за минуты.