В процессе разработки в среде 1С:Предприятие 8.3 программисты часто сталкиваются с ситуацией, когда данные, успешно полученные запросом или извлеченные из временного хранилища, «таинственным образом» исчезают при попытке программно заполнить ими табличную часть документа. Рассмотрим классический сценарий: вы расширяете типовой механизм (например, заполнение раздела 7 декларации по НДС), добавляете свои типы документов в запрос, видите их в отладке, но после выполнения метода Загрузить() колонки со ссылками на ваши документы оказываются пустыми, в то время как числовые показатели (суммы) остаются на месте. Разберем подробно, почему это происходит и как правильно настроить расширение, чтобы избежать потери данных.
Для начала проанализируем поведение платформы. Когда мы используем метод Объект.ИмяТабличнойЧасти.Загрузить(ТаблицаИсточник), система выполняет жесткую проверку типов. В языке 1С объекты метаданных имеют строгую типизацию. Если колонка в вашей ТаблицаИсточник содержит ссылку на документ типа ДокументСсылка.МойНовыйДокумент, а в метаданных табличной части для этого реквизита разрешены только типы, определенные в основной конфигурации, платформа не сможет «засунуть» ваш документ в эту ячейку.
Важный нюанс: платформа не выдает ошибку исключения. Она просто приводит значение к «пустой ссылке» того типа, который ожидается в данной колонке. При этом примитивные типы, такие как Число или Строка, обычно загружаются без проблем, что и создает иллюзию «частичного» исчезновения данных: суммы есть, а документов нет.
В современных типовых конфигурациях (ERP, КА, БП 3.0) типы реквизитов табличных частей часто задаются не списком документов, а через Определяемые типы. Например, для учета НДС часто используется ОпределяемыйТип.ДокументРеализации или аналогичные. Рассмотрим, как правильно добавить свой документ в такой тип через расширение.
ОпределяемыйТип в дереве объектов основной конфигурации.Изменять.Если все сделано верно, платформа расширит состав допустимых типов для всех реквизитов, которые используют этот ОпределяемыйТип.
Выясним причину, по которой изменения в расширении могут не вступать в силу. Одной из самых частых проблем является установленный режим совместимости конфигурации. Возможность расширять состав Определяемых типов появилась не сразу.
Если режим совместимости вашей основной конфигурации ниже, чем 8.3.14, то стандартный механизм расширения типов может не работать или работать некорректно. В таких случаях программисты часто видят, что галочка «Составной тип данных» неактивна или список типов недоступен для редактирования. В этой ситуации решением будет либо обновление версии платформы и режима совместимости (что не всегда возможно), либо использование альтернативного способа через изменение конкретного реквизита табличной части.
Если работа с Определяемым типом по каким-то причинам не подходит, мы можем изменить тип самого реквизита в расширенной табличной части. Выполним следующие действия:
ДокументОснование).Важное предостережение: Будьте осторожны при редактировании состава типов в расширении. Если вы случайно сбросите флаг «Составной тип» или удалите существующие типы, оставив только свой, это приведет к тому, что стандартные документы перестанут отображаться в этой колонке в пользовательском режиме. Платформа будет видеть только ваш тип.
Проанализируем ситуацию, когда метаданные настроены верно, но данные все равно не загружаются. Рассмотрим типичный код подготовки данных:
// Пример формирования таблицы для загрузки
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| РеализацияТоваровУслуг.Ссылка КАК ДокументРеализации,
| РеализацияТоваровУслуг.СуммаДокумента КАК Сумма
|ИЗ
| Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
|ОБЪЕДИНИТЬ ВСЕ
|ВЫБРАТЬ
| МойНовыйДокумент.Ссылка,
| МойНовыйДокумент.Сумма
|ИЗ
| Документ.МойНовыйДокумент КАК МойНовыйДокумент";
РезультатЗапроса = Запрос.Выполнить();
ТаблицаДляЗагрузки = РезультатЗапроса.Выгрузить();
// В этот момент в ТаблицаДляЗагрузки.Колонки["ДокументРеализации"].ТипЗначения
// может не содержать вашего типа, если запрос не был типизирован явно.
// Однако метод Загрузить() ориентируется на метаданные Объекта-приемника.
Объект.НеоблагаемыеНДСОперации.Загрузить(ТаблицаДляЗагрузки);
Если после выполнения Объект.НеоблагаемыеНДСОперации.Загрузить() вы видите пустые ссылки, это 100% признак того, что тип Документ.МойНовыйДокумент не разрешен для реквизита ДокументРеализации в метаданных табличной части с учетом расширения.
Это происходит потому, что ТаблицаЗначений (результат выгрузки запроса) является универсальной коллекцией. В ее колонках могут храниться значения любых типов, даже если они не предусмотрены метаданными конфигурации. Проверка и «обрезка» типов происходит только в момент передачи данных в объект метаданных (Табличную часть документа), так как она обязана строго соответствовать структуре базы данных.
Изменять, а не Замещать (если ваша цель — добавить тип, а не заменить весь список).ОБЪЕДИНИТЬ в запросах старайтесь явно указывать тип через функцию ВЫРАЗИТЬ(Поле КАК Тип), чтобы ТаблицаЗначений сразу имела правильную типизацию колонок.ЛюбаяСсылка в расширениях для реквизитов, которые в основной конфигурации имеют ограниченный набор типов. Это может привести к конфликтам при обновлении основной конфигурации.Подводя итог, можно сказать, что решение проблемы всегда кроется в синхронизации допустимых типов реквизита в метаданных и типов данных, которые вы пытаетесь туда записать. Если вы добавили новый документ в систему через расширение, вы обязаны «зарегистрировать» его во всех цепочках типов (Определяемых типах и составных типах реквизитов), где он должен участвовать.