Почему при вводе на основании документа Корректировка долга добавленная строка не отображается на форме?

Программист 1С v8.3 (Обычные формы) 1С:Комплексная автоматизация Управленческий учет IT и автоматизация бизнеса
← На главную

Разберем распространенную ситуацию при разработке механизмов ввода на основании в конфигурациях на обычных формах (таких как «1С:Комплексная автоматизация 1.1» или «1С:Управление производственным предприятием 1.3»). При программном создании документа КорректировкаДолга на основании входящего платежа реквизиты шапки заполняются корректно, а новая строка в табличную часть СуммыДолга физически добавляется (при добавлении пользователем следующей вручную ей присваивается номер 2), однако визуально в табличном поле на форме она отсутствует.

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

Анализ механизма работы формы документа «Корректировка долга»

Часто возникает заблуждение, что на форме документа существует отдельная независимая табличная часть формы, куда данные не переносятся из объекта. На самом деле это не так. Все табличные поля на различных закладках формы документа («Уменьшение долга», «Увеличение долга» и других) привязаны к одной и той же табличной части объекта — СуммыДолга.

Разделение строк по разным закладкам в обычных формах реализовано с помощью встроенного механизма фильтрации табличного поля — свойства ОтборСтрок. Этот отбор настраивается по ключевому реквизиту ВидЗадолженности, принимающему значения перечисления ВидыЗадолженности (например, Дебиторская или Кредиторская).

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

Решение проблемы: правильное заполнение строки табличной части

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

Посмотрим на исходный код подписки на событие ОбработкаЗаполнения, где возникала ошибка:


Если ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.ПлатежноеПоручениеВходящее") Тогда 
    
    Источник.ВидОперации = Перечисления.ВидыОперацийКорректировкаДолга.гкм_ПоступлениеДенежныхСредствОтДольщиков_Вознаграждение;
    Источник.ДоговорКонтрагента = ДанныеЗаполнения.ДоговорКонтрагента;
    Источник.КонтрагентДебитор = ДанныеЗаполнения.Контрагент;
    Источник.Организация = ДанныеЗаполнения.Организация;
    Источник.Подразделение = ДанныеЗаполнения.Подразделение;
    Источник.Ответственный = ДанныеЗаполнения.Ответственный;

    ДобавитьСтроку = Источник.СуммыДолга.Добавить();
    ДобавитьСтроку.ДоговорКонтрагента = ДанныеЗаполнения.ДоговорКонтрагента;
    ДобавитьСтроку.СуммаРегл = ДанныеЗаполнения.СуммаДокумента;
    ДобавитьСтроку.Сделка = "";
    ДобавитьСтроку.КурсВзаиморасчетов = 1;
    ДобавитьСтроку.СуммаНУ = 0;
    
КонецЕсли;

Чтобы добавленная строка стала видимой на форме, дополним заполнение обязательным реквизитом ВидЗадолженности:


Если ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.ПлатежноеПоручениеВходящее") Тогда 
    
    Источник.ВидОперации = Перечисления.ВидыОперацийКорректировкаДолга.гкм_ПоступлениеДенежныхСредствОтДольщиков_Вознаграждение;
    Источник.ДоговорКонтрагента = ДанныеЗаполнения.ДоговорКонтрагента;
    Источник.КонтрагентДебитор = ДанныеЗаполнения.Контрагент;
    Источник.Организация = ДанныеЗаполнения.Организация;
    Источник.Подразделение = ДанныеЗаполнения.Подразделение;
    Источник.Ответственный = ДанныеЗаполнения.Ответственный;

    ДобавитьСтроку = Источник.СуммыДолга.Добавить();
    
    // Обязательно указываем вид задолженности для работы отбора строк на форме
    ДобавитьСтроку.ВидЗадолженности = Перечисления.ВидыЗадолженности.Дебиторская;
    
    ДобавитьСтроку.ДоговорКонтрагента = ДанныеЗаполнения.ДоговорКонтрагента;
    ДобавитьСтроку.Сумма = ДанныеЗаполнения.СуммаДокумента;
    ДобавитьСтроку.СуммаРегл = ДанныеЗаполнения.СуммаДокумента;
    ДобавитьСтроку.КурсВзаиморасчетов = 1;
    ДобавитьСтроку.КратностьВзаиморасчетов = 1;
    ДобавитьСтроку.СуммаНУ = 0;
    
КонецЕсли;

Важные архитектурные нюансы при заполнении

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

  1. Ограничения контекста обработчика заполнения: Событие ОбработкаЗаполнения выполняется в контексте объекта базы данных. В нем нет доступа к элементам интерфейса (ЭлементыФормы). Вся настройка видимости и корректности отображения строк обеспечивается исключительно заполнением реквизитов самого объекта и его табличных частей.
  2. Влияние реквизита ВидОперации: В типовых конфигурациях при открытии формы документа вызываются процедуры управления интерфейсом, которые настраивают доступность закладок, колонок и параметры фильтрации ОтборСтрок в соответствии со значением реквизита ВидОперации. Значение ВидЗадолженности в строке должно строго согласовываться с выбранной операцией.
  3. Заполнение реквизитов учета: Для успешного проведения документа и исключения ошибок при проверке заполнения рекомендуется также указывать счета учета расчетов (например, СчетУчетаРасчетов и СчетУчетаАвансов) и документ расчетов/сделку, если по договору ведется учет по документам расчетов с контрагентами.

Таким образом, явная инициализация реквизита ВидЗадолженности при добавлении строки в табличную часть СуммыДолга полностью решает проблему «исчезновения» строк на форме документа.

← На главную