Ошибочное поведение обработок заполнения табличной части

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

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

В типовых конфигурациях это реквизит «КлючСвязи», который должен совпадать у связанных строк основной табличной части «Товары» и вспомогательных («СерийныеНомера»,»НомераГТД»).

Что же вызывает ошибочное поведение?

  • заполнение таблиц без заполнения или ошибочным указанием ключей
  • при копировании строки (F9) не генерируется новый ключ, а остается от строки источника (в основной таблице оказывается совпадающие значения ключей)
  • при создании документа на основании другого при очистке основной части не очищается вспомогательные таблицы (например, реализация проверяет наличие заказанных товаров на складе, остаток заказа)

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

Тем не менее, даже в типовых недоработанных конфигурациях это встречается до сих пор (при добавлении нового функционала, последний случай в Бухгалтерии предприятия 3.0 для Казахстана, при заполнении источников товаров)

Вариант исправления

Ниже приведен фрагмент кода обработки заполнения табличной части, который перенумеровывает ключ связи в таблице «Товары», затем очищает вспомогательную таблицу «НомераГТД» (учебный пример)

       ключСвязи = 0;
       Для каждого строка из ДокументОбъект.Товары Цикл
              Строка.КлючСвязи = ключСвязи;
              ключСвязи = ключСвязи+1;
       КонецЦикла;
       ВсегоСтрок = ДокументОбъект.НомераГТД.Количество();
       Если ВсегоСтрок>0 Тогда
                ДокументОбъект.НомераГТД.Очистить();
                ПоказатьОповещениеПользователя("Удалено "+ВсегоСтрок+" в таблице ГТД");
       Иначе
               ПоказатьОповещениеПользователя("Таблицы гтд - была пустая!");
       КонецЕсли;

 

Делать деньги без рекламы может только монетный двор.

— Томас Маколей