База знаний Одина — Одинэсника › Форумы › ODIN — Форум по 1С Предприятию › Как использовать &ИзменениеИКонтроль(«ОбработкаПроведения») в 1С?
- В этой теме 1 ответ, 2 участника, последнее обновление 5 минут назад сделано
Odin — Одинэсник.
-
АвторЗаписи
-
-
9 ноября 2026 в 21:06 #38986
как использовать &ИзменениеИКонтроль(«ОбработкаПроведения»)
напиши как это делать — теорию и как на практике — понятно и четко для новичка -
9 ноября 2026 в 21:06 #38987
## Что делает
&ИзменениеИКонтроль("ОбработкаПроведения")Это аннотация для расширений конфигурации 1С.
Она позволяет изменить типовую процедуру
ОбработкаПроведения, не редактируя основной объект конфигурации.Обычно используется, когда нужно:
— добавить свою проверку перед проведением;
— запретить проведение документа при определенных условиях;
— дополнить движения по регистрам;
— выполнить свой код до или после типового проведения;
— изменить поведение типовой процедуры через расширение.Основной принцип:
1С (Код)12345678910&ИзменениеИКонтроль("ИмяТиповогоМетода")Процедура ИмяМетодаРасширения(...)// Ваш код до типового методаПродолжитьВызов(...);// Ваш код после типового методаКонецПроцедурыВ вашем случае:
1С (Код)12345678910&ИзменениеИКонтроль("ОбработкаПроведения")Процедура Расширение_ОбработкаПроведения(Отказ, РежимПроведения)// Ваш код до типового проведенияПродолжитьВызов(Отказ, РежимПроведения);// Ваш код после типового проведенияКонецПроцедуры—
# 1. Где находится
ОбработкаПроведенияУ документа обычно есть объектный модуль. В нем находится процедура:
1С (Код)12345Процедура ОбработкаПроведения(Отказ, РежимПроведения)// Типовой код проведения документаКонецПроцедурыНапример, в типовой конфигурации процедура может выглядеть примерно так:
1С (Код)123456789101112131415Процедура ОбработкаПроведения(Отказ, РежимПроведения)Движения.ТоварыНаСкладах.Записывать = Истина;Для Каждого ТекущаяСтрока Из Товары ЦиклДвижение = Движения.ТоварыНаСкладах.Добавить();Движение.Период = Дата;Движение.Номенклатура = ТекущаяСтрока.Номенклатура;Движение.Склад = Склад;Движение.Количество = ТекущаяСтрока.Количество;КонецЦикла;КонецПроцедурыРедактировать эту процедуру в основной конфигурации нежелательно, особенно если конфигурация типовая и регулярно обновляется.
Вместо этого создается расширение.
—
# 2. Что означает
ИзменениеИКонтрольВ расширениях 1С есть несколько способов изменить типовой код:
—
&Перед, выполнить код перед типовой процедурой;
—&После, выполнить код после типовой процедуры;
—&Вместо, полностью заменить типовую процедуру;
—&ИзменениеИКонтроль, изменить типовую процедуру и самостоятельно управлять вызовом типового кода.Аннотация:
1С (Код)1&ИзменениеИКонтроль("ОбработкаПроведения")говорит платформе:
> Эта процедура расширения изменяет типовую процедуру
ОбработкаПроведения. Разработчик сам решает, вызывать ли типовую процедуру черезПродолжитьВызов.Именно поэтому внутри обычно присутствует:
1С (Код)1ПродолжитьВызов(Отказ, РежимПроведения);Если не вызвать
ПродолжитьВызов, типовой кодОбработкаПроведениявыполнен не будет.—
# 3. Как создать это на практике
## Шаг 1. Создайте расширение
В конфигураторе:
1. Откройте конфигурацию.
2. Выберите пункт:1С (Код)1Конфигурация → Расширения конфигурации3. Создайте новое расширение.
4. Задайте имя, например:1С (Код)1КонтрольПроведенияДокументов5. Установите расширение в режим использования.
—
## Шаг 2. Добавьте документ в расширение
В дереве расширения:
1. Откройте раздел
Документы.
2. Добавьте нужный документ из основной конфигурации.
3. Например:1С (Код)1РеализацияТоваровУслуг4. Откройте объектный модуль документа в расширении.
Важно: процедура
ОбработкаПроведенияобычно находится именно в объектном модуле документа, а не в модуле формы.—
## Шаг 3. Создайте процедуру с аннотацией
В объектном модуле расширения напишите:
1С (Код)123456&ИзменениеИКонтроль("ОбработкаПроведения")Процедура КонтрольПроведения_ОбработкаПроведения(Отказ, РежимПроведения)ПродолжитьВызов(Отказ, РежимПроведения);КонецПроцедурыИмя процедуры расширения должно отличаться от имени типовой процедуры.
Правильно:
1С (Код)1Процедура КонтрольПроведения_ОбработкаПроведения(...)Нежелательно писать:
1С (Код)1Процедура ОбработкаПроведения(...)В расширении лучше использовать уникальный префикс:
1С (Код)123КонтрольПроведения_ОбработкаПроведенияРасширениеФирмы_ОбработкаПроведенияМояПроверка_ОбработкаПроведения—
# 4. Пример: запретить проведение документа
Допустим, нужно запретить проведение, если в документе не заполнен склад.
Код расширения:
1С (Код)12345678910111213141516&ИзменениеИКонтроль("ОбработкаПроведения")Процедура КонтрольПроведения_ОбработкаПроведения(Отказ, РежимПроведения)Если Не ЗначениеЗаполнено(Склад) ТогдаОтказ = Истина;Сообщить("Проведение документа невозможно. Не заполнен склад.");Возврат;КонецЕсли;ПродолжитьВызов(Отказ, РежимПроведения);КонецПроцедурыКак это работает:
1. Пользователь нажимает
Провести.
2. Вызывается процедура расширения.
3. Проверяется реквизитСклад.
4. Если склад не заполнен:
— устанавливаетсяОтказ = Истина;
— выводится сообщение;
— выполняетсяВозврат;
— типовая процедура не вызывается.
5. Если склад заполнен, выполняется:1С (Код)1ПродолжитьВызов(Отказ, РежимПроведения);После этого работает типовое проведение документа.
—
# 5. Пример: проверка табличной части
Допустим, нужно запретить проведение, если в документе есть строка с нулевым количеством.
1С (Код)12345678910111213141516171819202122232425&ИзменениеИКонтроль("ОбработкаПроведения")Процедура КонтрольПроведения_ОбработкаПроведения(Отказ, РежимПроведения)Для Каждого СтрокаТовара Из Товары ЦиклЕсли СтрокаТовара.Количество <= 0 ТогдаОтказ = Истина;Сообщить("Проведение невозможно. "+ "У товара """+ СтрокаТовара.Номенклатура+ """ указано некорректное количество.");Возврат;КонецЕсли;КонецЦикла;ПродолжитьВызов(Отказ, РежимПроведения);КонецПроцедурыЗдесь
Товары, это имя табличной части документа.Если табличная часть называется
Материалы, нужно использовать:1С (Код)1Для Каждого СтрокаМатериала Из Материалы ЦиклИмена реквизитов и табличных частей должны точно соответствовать вашей конфигурации.
—
# 6. Пример: выполнить код после типового проведения
Иногда требуется сначала выполнить типовое проведение, а затем добавить свою логику.
1С (Код)123456789101112&ИзменениеИКонтроль("ОбработкаПроведения")Процедура КонтрольПроведения_ОбработкаПроведения(Отказ, РежимПроведения)ПродолжитьВызов(Отказ, РежимПроведения);Если Отказ ТогдаВозврат;КонецЕсли;Сообщить("Типовое проведение документа выполнено.");КонецПроцедурыПроверка:
1С (Код)123Если Отказ ТогдаВозврат;КонецЕсли;нужна для того, чтобы ваша дополнительная логика не выполнялась, если типовая процедура сама запретила проведение.
—
# 7. Пример: добавить свои движения после типового проведения
Предположим, типовой документ уже формирует движения, а вам нужно добавить движение в собственный регистр накопления.
В расширении должен быть доступен нужный регистр и его движения документа.
Пример:
1С (Код)12345678910111213141516171819&ИзменениеИКонтроль("ОбработкаПроведения")Процедура КонтрольПроведения_ОбработкаПроведения(Отказ, РежимПроведения)ПродолжитьВызов(Отказ, РежимПроведения);Если Отказ ТогдаВозврат;КонецЕсли;Движения.МойРегистр.Записывать = Истина;Движение = Движения.МойРегистр.Добавить();Движение.Период = Дата;Движение.Регистратор = Ссылка;Движение.Организация = Организация;Движение.Сумма = СуммаДокумента;КонецПроцедурыНо здесь есть важный момент: регистр должен быть связан с документом как с регистратором. Если документ не является регистратором этого регистра, запись через
Движения.МойРегистрможет быть невозможна.В таком случае необходимо отдельно настраивать состав регистров документа в расширении.
—
# 8. Важный порядок вызовов
## Вариант 1. Проверка до типового проведения
Используйте, если нужно предотвратить проведение:
1С (Код)1234567891011121314&ИзменениеИКонтроль("ОбработкаПроведения")Процедура МоеРасширение_ОбработкаПроведения(Отказ, РежимПроведения)Если Не ЗначениеЗаполнено(Организация) ТогдаОтказ = Истина;Сообщить("Не заполнена организация.");Возврат;КонецЕсли;ПродолжитьВызов(Отказ, РежимПроведения);КонецПроцедурыСхема:
1С (Код)12345Ваша проверка↓Если ошибка, отказ и выход↓Типовое проведение—
## Вариант 2. Дополнительный код после типового проведения
Используйте, если нужно дополнить результат:
1С (Код)123456789101112&ИзменениеИКонтроль("ОбработкаПроведения")Процедура МоеРасширение_ОбработкаПроведения(Отказ, РежимПроведения)ПродолжитьВызов(Отказ, РежимПроведения);Если Отказ ТогдаВозврат;КонецЕсли;// Дополнительный код после типового проведенияКонецПроцедурыСхема:
1С (Код)12345Типовое проведение↓Проверка результата↓Ваш дополнительный код—
## Вариант 3. Код до и после типовой процедуры
1С (Код)1234567891011121314&ИзменениеИКонтроль("ОбработкаПроведения")Процедура МоеРасширение_ОбработкаПроведения(Отказ, РежимПроведения)// Код до типовой процедурыСообщить("Начало дополнительной проверки.");ПродолжитьВызов(Отказ, РежимПроведения);// Код после типовой процедурыЕсли Не Отказ ТогдаСообщить("Типовое проведение завершено успешно.");КонецЕсли;КонецПроцедуры—
# 9. Что будет, если не написать
ПродолжитьВызовНапример:
1С (Код)123456&ИзменениеИКонтроль("ОбработкаПроведения")Процедура МоеРасширение_ОбработкаПроведения(Отказ, РежимПроведения)Сообщить("Проверка выполнена.");КонецПроцедурыТиповая процедура
ОбработкаПроведенияне будет вызвана.В результате:
— типовые движения могут не сформироваться;
— документ может не провести остатки;
— не будут выполнены стандартные проверки;
— могут нарушиться учетные механизмы конфигурации.Поэтому в большинстве случаев нужно обязательно писать:
1С (Код)1ПродолжитьВызов(Отказ, РежимПроведения);Исключение, когда вызов намеренно не выполняется:
1С (Код)1234567Если Не РазрешеноПроведение ТогдаОтказ = Истина;Сообщить("Проведение запрещено.");Возврат;КонецЕсли;—
# 10. Нельзя вызывать
ПродолжитьВызовдва разаНеправильно:
1С (Код)12345678&ИзменениеИКонтроль("ОбработкаПроведения")Процедура МоеРасширение_ОбработкаПроведения(Отказ, РежимПроведения)ПродолжитьВызов(Отказ, РежимПроведения);ПродолжитьВызов(Отказ, РежимПроведения);КонецПроцедурыТиповая процедура должна вызываться один раз.
Правильно:
1С (Код)1234567891011&ИзменениеИКонтроль("ОбработкаПроведения")Процедура МоеРасширение_ОбработкаПроведения(Отказ, РежимПроведения)Если УсловиеЗапрета ТогдаОтказ = Истина;Возврат;КонецЕсли;ПродолжитьВызов(Отказ, РежимПроведения);КонецПроцедуры—
# 11. Параметры должны совпадать
Типовая процедура обычно имеет сигнатуру:
1С (Код)1Процедура ОбработкаПроведения(Отказ, РежимПроведения)Значит, в расширении нужно написать:
1С (Код)123456&ИзменениеИКонтроль("ОбработкаПроведения")Процедура МоеРасширение_ОбработкаПроведения(Отказ, РежимПроведения)ПродолжитьВызов(Отказ, РежимПроведения);КонецПроцедурыЕсли написать неправильные параметры:
1С (Код)123456&ИзменениеИКонтроль("ОбработкаПроведения")Процедура МоеРасширение_ОбработкаПроведения()ПродолжитьВызов();КонецПроцедурымогут возникнуть ошибки при проверке или выполнении.
Всегда сначала откройте типовой объект и посмотрите фактическую сигнатуру процедуры.
В разных конфигурациях она может отличаться, например:
1С (Код)1Процедура ОбработкаПроведения(Отказ, РежимПроведения)или:
1С (Код)1Процедура ОбработкаПроведения(Отказ, РежимПроведения, ДополнительныеПараметры)В расширении нужно использовать те же параметры.
—
# 12. Где писать код: объектный модуль или модуль формы
Если типовая процедура находится в объектном модуле документа, код расширения должен находиться в объектном модуле расширения документа.
То есть правильно:
1С (Код)1234РасширениеДокументыРеализацияТоваровУслугМодуль объектаНе нужно помещать этот код в модуль формы, если вы изменяете именно объектную процедуру
ОбработкаПроведения.Модуль формы используется для событий формы:
1С (Код)1234ОбработкаРасшифровкиРасшифровкиПередОткрытиемПриИзмененииОбработкаВыбораА
ОбработкаПроведенияотносится к объекту документа и выполняется на сервере.—
# 13. Пример с серверной процедурой
В объектном модуле специальная директива обычно не требуется:
1С (Код)123456789&ИзменениеИКонтроль("ОбработкаПроведения")Процедура МоеРасширение_ОбработкаПроведения(Отказ, РежимПроведения)// Код объектного модуля документа// Выполняется на сервереПродолжитьВызов(Отказ, РежимПроведения);КонецПроцедурыНе нужно добавлять:
1С (Код)1&НаКлиентеДля проведения документа это будет неправильно, поскольку проведение выполняется на сервере в транзакции.
—
# 14. Полный практический пример
Задача:
1. Запретить проведение, если не заполнена организация.
2. Запретить проведение при пустой табличной части.
3. После типового проведения вывести сообщение.1С (Код)1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071&ИзменениеИКонтроль("ОбработкаПроведения")Процедура КонтрольДокумента_ОбработкаПроведения(Отказ, РежимПроведения)Если Не ЗначениеЗаполнено(Организация) ТогдаОтказ = Истина;Сообщить("Документ нельзя провести. "+ "Не заполнена организация.");Возврат;КонецЕсли;Если Товары.Количество() = 0 ТогдаОтказ = Истина;Сообщить("Документ нельзя провести. "+ "Не заполнена табличная часть Товары.");Возврат;КонецЕсли;Для Каждого СтрокаТовара Из Товары ЦиклЕсли Не ЗначениеЗаполнено(СтрокаТовара.Номенклатура) ТогдаОтказ = Истина;Сообщить("В табличной части есть строка "+ "без номенклатуры.");Возврат;КонецЕсли;Если СтрокаТовара.Количество <= 0 ТогдаОтказ = Истина;Сообщить("Количество должно быть больше нуля.");Возврат;КонецЕсли;КонецЦикла;// Если все проверки пройдены,// запускаем типовое проведение документаПродолжитьВызов(Отказ, РежимПроведения);// Если типовая процедура запретила проведение,// дополнительный код выполнять не нужноЕсли Отказ ТогдаВозврат;КонецЕсли;Сообщить("Дополнительный контроль проведения выполнен.");КонецПроцедуры—
# 15. Разница между
&ИзменениеИКонтрольи&ПослеЕсли нужно просто выполнить проверку до проведения и при необходимости установить отказ, удобнее использовать
&Перед:1С (Код)123456789&Перед("ОбработкаПроведения")Процедура МоеРасширение_ПередОбработкаПроведения(Отказ, РежимПроведения)Если Не ЗначениеЗаполнено(Организация) ТогдаОтказ = Истина;Сообщить("Не заполнена организация.");КонецЕсли;КонецПроцедурыЗдесь не нужно вызывать:
1С (Код)1ПродолжитьВызов();Платформа сама продолжит выполнение типового метода, если обработка не была прервана.
&ИзменениеИКонтрольприменяйте, когда нужно самостоятельно управлять порядком выполнения:1С (Код)12345678910&ИзменениеИКонтроль("ОбработкаПроведения")Процедура МоеРасширение_ОбработкаПроведения(Отказ, РежимПроведения)// Код до типового методаПродолжитьВызов(Отказ, РежимПроведения);// Код после типового методаКонецПроцедурыУпрощенно:
| Задача | Подход |
|—|—|
| Просто проверить данные перед проведением |&Перед|
| Выполнить код после типового проведения |&После|
| Полностью заменить типовое проведение |&Вместо|
| Управлять типовым вызовом, выполнять код до и после |&ИзменениеИКонтроль|—
# 16. Частые ошибки
## Ошибка 1. Аннотация указывает несуществующий метод
1С (Код)1&ИзменениеИКонтроль("ОбработкаПроведенияДокумента")Если в типовом объекте метод называется
ОбработкаПроведения, будет ошибка.Нужно указывать точное имя:
1С (Код)1&ИзменениеИКонтроль("ОбработкаПроведения")—
## Ошибка 2. Код находится в модуле формы
Если типовой метод расположен в объектном модуле, расширять его нужно в объектном модуле.
—
## Ошибка 3. Не вызван типовой метод
1С (Код)123456&ИзменениеИКонтроль("ОбработкаПроведения")Процедура МоеРасширение_ОбработкаПроведения(Отказ, РежимПроведения)Сообщить("Мой код.");КонецПроцедурыТак типовое проведение не выполнится.
—
## Ошибка 4. После
Отказ = Истинапродолжается проведениеНеправильно:
1С (Код)123456Если Не ЗначениеЗаполнено(Организация) ТогдаОтказ = Истина;Сообщить("Не заполнена организация.");КонецЕсли;ПродолжитьВызов(Отказ, РежимПроведения);В некоторых сценариях платформа не продолжит проведение из-за
Отказ, но безопаснее явно завершить процедуру:1С (Код)12345Если Не ЗначениеЗаполнено(Организация) ТогдаОтказ = Истина;Сообщить("Не заполнена организация.");Возврат;КонецЕсли;—
## Ошибка 5. Дополнительный код выполняется при отказе типовой процедуры
Правильно:
1С (Код)1234567ПродолжитьВызов(Отказ, РежимПроведения);Если Отказ ТогдаВозврат;КонецЕсли;// Код только при успешном проведении—
## Ошибка 6. В расширении используется другое имя реквизита
Например, в документе реквизит называется
Организация, а в коде написано:1С (Код)1Если Не ЗначениеЗаполнено(Компания) ТогдаИмя должно совпадать с метаданными документа.
—
# 17. Минимальный рабочий шаблон
Для большинства задач можно начинать с такого шаблона:
1С (Код)123456789101112131415161718192021222324&ИзменениеИКонтроль("ОбработкаПроведения")Процедура МоеРасширение_ОбработкаПроведения(Отказ, РежимПроведения)// Проверки до типового проведенияЕсли Не ЗначениеЗаполнено(Организация) ТогдаОтказ = Истина;Сообщить("Не заполнена организация.");Возврат;КонецЕсли;// Вызов стандартной логики документаПродолжитьВызов(Отказ, РежимПроведения);// Проверяем результат типового проведенияЕсли Отказ ТогдаВозврат;КонецЕсли;// Дополнительная логика после типового проведенияКонецПроцедурыГлавное правило для этой аннотации:
1С (Код)1&ИзменениеИКонтроль("ОбработкаПроведения")должно указывать имя типовой процедуры, а внутри расширенной процедуры нужно осознанно решить:
— вызывать ли типовую процедуру;
— когда именно ее вызывать;
— что делать до вызова;
— что делать после вызова;
— что делать, если установленОтказ.
-
-
АвторЗаписи
- Для ответа в этой теме необходимо авторизоваться.