Как использовать &ИзменениеИКонтроль(«ОбработкаПроведения») в 1С?

База знаний Одина — Одинэсника › Форумы › ODIN — Форум по 1С Предприятию › Как использовать &ИзменениеИКонтроль(«ОбработкаПроведения») в 1С?

Просмотр 1 ветки ответов
  • Автор
    Записи
    • #38986
      Фото аватараOdineski
      Участник

        как использовать &ИзменениеИКонтроль(«ОбработкаПроведения»)
        напиши как это делать — теорию и как на практике — понятно и четко для новичка

      • #38987
        bot_avaOdin — Одинэсник
        Участник

          ## Что делает &ИзменениеИКонтроль("ОбработкаПроведения")

          Это аннотация для расширений конфигурации 1С.

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

          Обычно используется, когда нужно:

          — добавить свою проверку перед проведением;
          — запретить проведение документа при определенных условиях;
          — дополнить движения по регистрам;
          — выполнить свой код до или после типового проведения;
          — изменить поведение типовой процедуры через расширение.

          Основной принцип:

          В вашем случае:

          —

          # 1. Где находится ОбработкаПроведения

          У документа обычно есть объектный модуль. В нем находится процедура:

          Например, в типовой конфигурации процедура может выглядеть примерно так:

          Редактировать эту процедуру в основной конфигурации нежелательно, особенно если конфигурация типовая и регулярно обновляется.

          Вместо этого создается расширение.

          —

          # 2. Что означает ИзменениеИКонтроль

          В расширениях 1С есть несколько способов изменить типовой код:

          — &Перед , выполнить код перед типовой процедурой;
          — &После , выполнить код после типовой процедуры;
          — &Вместо , полностью заменить типовую процедуру;
          — &ИзменениеИКонтроль , изменить типовую процедуру и самостоятельно управлять вызовом типового кода.

          Аннотация:

          говорит платформе:

          > Эта процедура расширения изменяет типовую процедуру ОбработкаПроведения. Разработчик сам решает, вызывать ли типовую процедуру через ПродолжитьВызов.

          Именно поэтому внутри обычно присутствует:

          Если не вызвать ПродолжитьВызов, типовой код ОбработкаПроведения выполнен не будет.

          —

          # 3. Как создать это на практике

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

          В конфигураторе:

          1. Откройте конфигурацию.
          2. Выберите пункт:

          3. Создайте новое расширение.
          4. Задайте имя, например:

          5. Установите расширение в режим использования.

          —

          ## Шаг 2. Добавьте документ в расширение

          В дереве расширения:

          1. Откройте раздел Документы.
          2. Добавьте нужный документ из основной конфигурации.
          3. Например:

          4. Откройте объектный модуль документа в расширении.

          Важно: процедура ОбработкаПроведения обычно находится именно в объектном модуле документа, а не в модуле формы.

          —

          ## Шаг 3. Создайте процедуру с аннотацией

          В объектном модуле расширения напишите:

          Имя процедуры расширения должно отличаться от имени типовой процедуры.

          Правильно:

          Нежелательно писать:

          В расширении лучше использовать уникальный префикс:

          —

          # 4. Пример: запретить проведение документа

          Допустим, нужно запретить проведение, если в документе не заполнен склад.

          Код расширения:

          Как это работает:

          1. Пользователь нажимает Провести.
          2. Вызывается процедура расширения.
          3. Проверяется реквизит Склад.
          4. Если склад не заполнен:
          — устанавливается Отказ = Истина;
          — выводится сообщение;
          — выполняется Возврат;
          — типовая процедура не вызывается.
          5. Если склад заполнен, выполняется:

          После этого работает типовое проведение документа.

          —

          # 5. Пример: проверка табличной части

          Допустим, нужно запретить проведение, если в документе есть строка с нулевым количеством.

          Здесь Товары , это имя табличной части документа.

          Если табличная часть называется Материалы, нужно использовать:

          Имена реквизитов и табличных частей должны точно соответствовать вашей конфигурации.

          —

          # 6. Пример: выполнить код после типового проведения

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

          Проверка:

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

          —

          # 7. Пример: добавить свои движения после типового проведения

          Предположим, типовой документ уже формирует движения, а вам нужно добавить движение в собственный регистр накопления.

          В расширении должен быть доступен нужный регистр и его движения документа.

          Пример:

          Но здесь есть важный момент: регистр должен быть связан с документом как с регистратором. Если документ не является регистратором этого регистра, запись через Движения.МойРегистр может быть невозможна.

          В таком случае необходимо отдельно настраивать состав регистров документа в расширении.

          —

          # 8. Важный порядок вызовов

          ## Вариант 1. Проверка до типового проведения

          Используйте, если нужно предотвратить проведение:

          Схема:

          —

          ## Вариант 2. Дополнительный код после типового проведения

          Используйте, если нужно дополнить результат:

          Схема:

          —

          ## Вариант 3. Код до и после типовой процедуры

          —

          # 9. Что будет, если не написать ПродолжитьВызов

          Например:

          Типовая процедура ОбработкаПроведения не будет вызвана.

          В результате:

          — типовые движения могут не сформироваться;
          — документ может не провести остатки;
          — не будут выполнены стандартные проверки;
          — могут нарушиться учетные механизмы конфигурации.

          Поэтому в большинстве случаев нужно обязательно писать:

          Исключение, когда вызов намеренно не выполняется:

          —

          # 10. Нельзя вызывать ПродолжитьВызов два раза

          Неправильно:

          Типовая процедура должна вызываться один раз.

          Правильно:

          —

          # 11. Параметры должны совпадать

          Типовая процедура обычно имеет сигнатуру:

          Значит, в расширении нужно написать:

          Если написать неправильные параметры:

          могут возникнуть ошибки при проверке или выполнении.

          Всегда сначала откройте типовой объект и посмотрите фактическую сигнатуру процедуры.

          В разных конфигурациях она может отличаться, например:

          или:

          В расширении нужно использовать те же параметры.

          —

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

          Если типовая процедура находится в объектном модуле документа, код расширения должен находиться в объектном модуле расширения документа.

          То есть правильно:

          Не нужно помещать этот код в модуль формы, если вы изменяете именно объектную процедуру ОбработкаПроведения.

          Модуль формы используется для событий формы:

          А ОбработкаПроведения относится к объекту документа и выполняется на сервере.

          —

          # 13. Пример с серверной процедурой

          В объектном модуле специальная директива обычно не требуется:

          Не нужно добавлять:

          Для проведения документа это будет неправильно, поскольку проведение выполняется на сервере в транзакции.

          —

          # 14. Полный практический пример

          Задача:

          1. Запретить проведение, если не заполнена организация.
          2. Запретить проведение при пустой табличной части.
          3. После типового проведения вывести сообщение.

          —

          # 15. Разница между &ИзменениеИКонтроль и &После

          Если нужно просто выполнить проверку до проведения и при необходимости установить отказ, удобнее использовать &Перед:

          Здесь не нужно вызывать:

          Платформа сама продолжит выполнение типового метода, если обработка не была прервана.

          &ИзменениеИКонтроль применяйте, когда нужно самостоятельно управлять порядком выполнения:

          Упрощенно:

          | Задача | Подход |
          |—|—|
          | Просто проверить данные перед проведением | &Перед |
          | Выполнить код после типового проведения | &После |
          | Полностью заменить типовое проведение | &Вместо |
          | Управлять типовым вызовом, выполнять код до и после | &ИзменениеИКонтроль |

          —

          # 16. Частые ошибки

          ## Ошибка 1. Аннотация указывает несуществующий метод

          Если в типовом объекте метод называется ОбработкаПроведения, будет ошибка.

          Нужно указывать точное имя:

          —

          ## Ошибка 2. Код находится в модуле формы

          Если типовой метод расположен в объектном модуле, расширять его нужно в объектном модуле.

          —

          ## Ошибка 3. Не вызван типовой метод

          Так типовое проведение не выполнится.

          —

          ## Ошибка 4. После Отказ = Истина продолжается проведение

          Неправильно:

          В некоторых сценариях платформа не продолжит проведение из-за Отказ, но безопаснее явно завершить процедуру:

          —

          ## Ошибка 5. Дополнительный код выполняется при отказе типовой процедуры

          Правильно:

          —

          ## Ошибка 6. В расширении используется другое имя реквизита

          Например, в документе реквизит называется Организация, а в коде написано:

          Имя должно совпадать с метаданными документа.

          —

          # 17. Минимальный рабочий шаблон

          Для большинства задач можно начинать с такого шаблона:

          Главное правило для этой аннотации:

          должно указывать имя типовой процедуры, а внутри расширенной процедуры нужно осознанно решить:

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

      Просмотр 1 ветки ответов
      • Для ответа в этой теме необходимо авторизоваться.
      База знаний 1С