Почему при загрузке данных в табличную часть через расширение пропадают ссылки на документы?

Программист 1С v8.3 (Управляемые формы) 1С:ERP Управление предприятием Налоговый учет
← На главную

В процессе разработки в среде 1С:Предприятие 8.3 программисты часто сталкиваются с ситуацией, когда данные, успешно полученные запросом или извлеченные из временного хранилища, «таинственным образом» исчезают при попытке программно заполнить ими табличную часть документа. Рассмотрим классический сценарий: вы расширяете типовой механизм (например, заполнение раздела 7 декларации по НДС), добавляете свои типы документов в запрос, видите их в отладке, но после выполнения метода Загрузить() колонки со ссылками на ваши документы оказываются пустыми, в то время как числовые показатели (суммы) остаются на месте. Разберем подробно, почему это происходит и как правильно настроить расширение, чтобы избежать потери данных.

Анализируем причину исчезновения данных

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

Важный нюанс: платформа не выдает ошибку исключения. Она просто приводит значение к «пустой ссылке» того типа, который ожидается в данной колонке. При этом примитивные типы, такие как Число или Строка, обычно загружаются без проблем, что и создает иллюзию «частичного» исчезновения данных: суммы есть, а документов нет.

Шаг 1. Проверка типизации через Определяемые типы

В современных типовых конфигурациях (ERP, КА, БП 3.0) типы реквизитов табличных частей часто задаются не списком документов, а через Определяемые типы. Например, для учета НДС часто используется ОпределяемыйТип.ДокументРеализации или аналогичные. Рассмотрим, как правильно добавить свой документ в такой тип через расширение.

  1. Найдем нужный ОпределяемыйТип в дереве объектов основной конфигурации.
  2. Нажмем на него правой кнопкой мыши и выберем «Добавить в расширение».
  3. В расширении откроем свойства этого типа. Обратим внимание на свойство «Способ объединения» — оно должно быть установлено в значение Изменять.
  4. В окне редактирования типа (где выбираются объекты) найдем свой новый документ и отметим его галочкой.

Если все сделано верно, платформа расширит состав допустимых типов для всех реквизитов, которые используют этот ОпределяемыйТип.

Шаг 2. Влияние режима совместимости

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

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

Шаг 3. Изменение типа реквизита табличной части напрямую

Если работа с Определяемым типом по каким-то причинам не подходит, мы можем изменить тип самого реквизита в расширенной табличной части. Выполним следующие действия:

  1. Добавим в расширение саму Табличную часть нужного документа.
  2. Добавим в расширение конкретный Реквизит этой табличной части (например, ДокументОснование).
  3. В свойствах реквизита в расширении найдем поле «Тип».
  4. Нажмем на кнопку выбора типа. В открывшемся окне убедимся, что установлена галочка «Составной тип данных».
  5. Добавим к существующему набору типов свой новый тип документа.

Важное предостережение: Будьте осторожны при редактировании состава типов в расширении. Если вы случайно сбросите флаг «Составной тип» или удалите существующие типы, оставив только свой, это приведет к тому, что стандартные документы перестанут отображаться в этой колонке в пользовательском режиме. Платформа будет видеть только ваш тип.

Шаг 4. Анализ программного кода загрузки

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


// Пример формирования таблицы для загрузки
Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |   РеализацияТоваровУслуг.Ссылка КАК ДокументРеализации,
    |   РеализацияТоваровУслуг.СуммаДокумента КАК Сумма
    |ИЗ
    |   Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
    |ОБЪЕДИНИТЬ ВСЕ
    |ВЫБРАТЬ
    |   МойНовыйДокумент.Ссылка,
    |   МойНовыйДокумент.Сумма
    |ИЗ
    |   Документ.МойНовыйДокумент КАК МойНовыйДокумент";

РезультатЗапроса = Запрос.Выполнить();
ТаблицаДляЗагрузки = РезультатЗапроса.Выгрузить();

// В этот момент в ТаблицаДляЗагрузки.Колонки["ДокументРеализации"].ТипЗначения 
// может не содержать вашего типа, если запрос не был типизирован явно.
// Однако метод Загрузить() ориентируется на метаданные Объекта-приемника.

Объект.НеоблагаемыеНДСОперации.Загрузить(ТаблицаДляЗагрузки);

Если после выполнения Объект.НеоблагаемыеНДСОперации.Загрузить() вы видите пустые ссылки, это 100% признак того, что тип Документ.МойНовыйДокумент не разрешен для реквизита ДокументРеализации в метаданных табличной части с учетом расширения.

Почему данные видны в отладчике до загрузки?

Это происходит потому, что ТаблицаЗначений (результат выгрузки запроса) является универсальной коллекцией. В ее колонках могут храниться значения любых типов, даже если они не предусмотрены метаданными конфигурации. Проверка и «обрезка» типов происходит только в момент передачи данных в объект метаданных (Табличную часть документа), так как она обязана строго соответствовать структуре базы данных.

Рекомендации по работе с расширениями

Подводя итог, можно сказать, что решение проблемы всегда кроется в синхронизации допустимых типов реквизита в метаданных и типов данных, которые вы пытаетесь туда записать. Если вы добавили новый документ в систему через расширение, вы обязаны «зарегистрировать» его во всех цепочках типов (Определяемых типах и составных типах реквизитов), где он должен участвовать.

← На главную