Как разместить весь код проведения документа в процедуре «обработка проведения»?

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

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

        А весь этот код мне можно написаться прямо в процедуре «обработка проведения»?

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

          Да. Вся логика проведения документа может находиться в процедуре объекта документа:

          Для экзамена это нормальный вариант. Главное, чтобы код находился в модуле объекта документа, а не в модуле формы.

          ## Минимальный каркас процедуры

          Например, документ называется РасходнаяНакладная, а регистр накопления называется ТоварыНаСкладах.

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

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

          Если в регистре есть отдельный реквизит ДатаПартии, лучше сортировать по нему:

          ## Как правильно реализовать замену направления

          Я бы не заменял в запросе все вхождения "УБЫВ". Лучше использовать отдельный маркер:

          Сам запрос:

          После этого:

          ## Но одного запроса недостаточно

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

          Упрощенный пример:

          Обычно этот код помещают внутрь цикла по табличной части документа:

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

          ## Вариант структуры процедуры для экзамена

          Практически процедура может выглядеть так:

          Этот код показывает идею, но точный вариант зависит от структуры вашего регистра и документа.

          ## Что обязательно помнить на экзамене

          ### 1. Процедура должна быть в модуле объекта

          Правильно:

          Неправильно размещать эту логику в:

          — модуле формы;
          — обработчике команды формы;
          — процедуре ПриЗаписи формы;
          — клиентском коде.

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

          ### 2. Не нужно вручную запускать транзакцию

          В ОбработкаПроведения обычно не пишут:

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

          движения документа записаны не будут.

          ### 3. Движения регистра должны быть включены

          Перед добавлением движений:

          Если этого не сделать, движения могут не записаться.

          ### 4. Проверяйте остаток после цикла

          Недостаточно просто списать доступные остатки. Обязательно нужно проверить:

          Иначе документ может провести частичное списание.

          ### 5. FIFO и LIFO меняют только порядок партий

          Вот эта часть действительно может отличаться буквально на одну переменную:

          Но весь остальной алгоритм должен быть общим:

          На экзамене это как раз хороший подход: не делать две копии алгоритма, а менять только направление сортировки.

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