Как в 1С объединить строки в табличной части документа перед записью?

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

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

        Возможно, ты меня неправильно понял. Я имел в виду, что не должно быть дублей в самом документе «приходная накладная» при проведении. То есть, например, первая строка это карандаш 1шт за цену 100 рублей и сумма 100, вторая строка это карандаш 2шт за цену 100 рублей и сумма 200. Я нажимаю «провести» и две записи должны у меня превращаться в одну — карандаш 3шт цена 100 сумма 300

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

          Теперь понятно. Вам нужно не только сформировать одно движение в регистре, а изменить табличную часть самого документа перед записью и проведением:

          Было:

          | Номенклатура | Количество | Цена | Сумма |
          |—|—:|—:|—:|
          | Карандаш | 1 | 100 | 100 |
          | Карандаш | 2 | 100 | 200 |

          Должно стать:

          | Номенклатура | Количество | Цена | Сумма |
          |—|—:|—:|—:|
          | Карандаш | 3 | 100 | 300 |

          Для этого объединение нужно выполнять в обработчике ПередЗаписью модуля объекта документа, а не в ОбработкаПроведения.

          ## Код объединения строк

          Предположим:

          — документ называется ПриходнаяНакладная;
          — табличная часть называется Товары;
          — реквизиты строк: Номенклатура, Количество, Цена, Сумма.

          В модуле объекта документа:

          ## Как работает этот код

          Индексы перебираются с конца табличной части к началу:

          Это важно, потому что при удалении строки остальные индексы еще не просмотренных строк не нарушаются.

          Для каждой строки ищется такая же строка среди предыдущих:

          Если совпадение найдено:

          После этого дублирующая строка удаляется:

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

          ## Что будет при разных ценах

          Если в документе:

          | Номенклатура | Количество | Цена | Сумма |
          |—|—:|—:|—:|
          | Карандаш | 1 | 100 | 100 |
          | Карандаш | 2 | 120 | 240 |

          условие не сработает, потому что цены разные:

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

          Условие объединения в вашем случае:

          То есть:

          ## Важный момент для экзамена

          Если в табличной части есть только эти реквизиты:

          то приведенного условия достаточно.

          Но если есть дополнительные реквизиты, влияющие на смысл строки, их тоже нужно включить в условие. Например:

          Например, одинаковую номенклатуру с одинаковой ценой, но разными ставками НДС объединять нельзя:

          Если есть характеристика:

          Принцип такой: в условие включаются все реквизиты, которые должны быть одинаковыми у объединяемых строк.

          ## Почему лучше делать в ПередЗаписью, а не в ОбработкаПроведения

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

          В ПередЗаписью табличная часть изменяется до сохранения документа:

          Поэтому для вашей формулировки задачи правильное место реализации, это:

          ## Если объединять нужно при любой записи

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

          ## Еще один вариант для экзамена

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

          Для изменения самого документа используйте именно ПередЗаписью.

          В вашей конкретной задаче условие объединения должно быть:

          А действие:

          Для примера с карандашами результат будет:

          При этом для FIFO/LIFO партия по-прежнему будет ссылкой на всю приходную накладную.

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