Почему не сохраняются данные табличной части, добавленные через расширение в 1С?

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

Часто при разработке в 1С через расширения возникает ситуация, когда мы добавляем новые реквизиты в табличную часть документа, видим их на форме, успешно заполняем кодом, но при попытке получить эти данные с помощью запроса получаем пустые значения. Также данные не сохраняются в базе после записи документа. Давайте разберемся, почему так происходит и как правильно реализовать доработку.

Разбираемся в архитектуре 1С: реквизиты формы против реквизитов объекта

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

Для того чтобы данные сохранялись в базе и были доступны в запросах, необходимо:

  1. Открыть расширение в конфигураторе.
  2. Найти нужный документ в дереве метаданных.
  3. Добавить реквизиты непосредственно в табличную часть объекта (например, в Товары) через расширение.
  4. Только после этого выносить данные на форму.

Если вы добавили реквизит только в редакторе формы, он является «временным». Как только форма закрывается, данные пропадают, так как механизмы записи объекта 1С ничего не знают о добавленном вами поле.

Оптимизация кода: как правильно работать с данными на форме

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

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

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


&НаКлиенте
Процедура нео_ТоварыНоменклатураПриИзмененииПосле(Элемент)
    ОбновитьДанныеСтроки();
КонецПроцедуры

&НаКлиенте
Процедура ОбновитьДанныеСтроки()
    ТекущиеДанные = Элементы.Товары.ТекущиеДанные;
    
    // Получаем данные одним серверным вызовом (рекомендуется)
    ДанныеНоменклатуры = нео_ПолучитьДанныеДляЗаполнения(ТекущиеДанные.Номенклатура);
    
    Количество = ТекущиеДанные.КоличествоУпаковок;
    
    ТекущиеДанные.неоОбъем = ДанныеНоменклатуры.Объем * Количество;
    ТекущиеДанные.неоВес = ДанныеНоменклатуры.Вес * Количество;
КонецПроцедуры

Почему запросы возвращают пустоту?

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

Подводим итоги

Чтобы избежать описанных проблем, запомните золотое правило: данные, которые должны жить в базе, всегда должны быть в структуре метаданных. Реквизиты формы — это лишь «окно» для отображения. Если данные пропадают — проверяйте, добавили ли вы реквизит в ветку Документы -> ИмяДокумента -> Табличные части -> Товары вашего расширения.

Используйте серверные вызовы экономно, группируя запросы к данным, и всегда следите за тем, чтобы ТекущиеДанные табличной части были актуальны перед записью. Придерживаясь этих правил, вы обеспечите стабильную и быструю работу вашей доработки в расширении конфигурации 1С.

← На главную