Часто при разработке в 1С через расширения возникает ситуация, когда мы добавляем новые реквизиты в табличную часть документа, видим их на форме, успешно заполняем кодом, но при попытке получить эти данные с помощью запроса получаем пустые значения. Также данные не сохраняются в базе после записи документа. Давайте разберемся, почему так происходит и как правильно реализовать доработку.
Первая и самая главная причина такой проблемы заключается в непонимании разницы между реквизитом объекта и реквизитом формы. Когда вы добавляете поле в редакторе формы, оно существует исключительно в оперативной памяти клиентского сеанса. Оно не связано с таблицей базы данных, поэтому серверные процедуры и запросы «не знают» об этих данных.
Для того чтобы данные сохранялись в базе и были доступны в запросах, необходимо:
Товары) через расширение.Если вы добавили реквизит только в редакторе формы, он является «временным». Как только форма закрывается, данные пропадают, так как механизмы записи объекта 1С ничего не знают о добавленном вами поле.
В ходе обсуждения мы также выяснили, что даже при верном добавлении метаданных, важно правильно писать программный код. Часто программисты допускают избыточность, совершая слишком много вызовов сервера. Рассмотрим, как сделать процесс заполнения данных более эффективным.
Вместо постоянного обращения к элементам формы в цикле, лучше использовать структуру ТекущиеДанные. Также важно избегать множественных вызовов сервера, объединяя получение данных в одну функцию.
Рассмотрим пример правильного кода для заполнения данных в строке табличной части:
&НаКлиенте
Процедура нео_ТоварыНоменклатураПриИзмененииПосле(Элемент)
ОбновитьДанныеСтроки();
КонецПроцедуры
&НаКлиенте
Процедура ОбновитьДанныеСтроки()
ТекущиеДанные = Элементы.Товары.ТекущиеДанные;
// Получаем данные одним серверным вызовом (рекомендуется)
ДанныеНоменклатуры = нео_ПолучитьДанныеДляЗаполнения(ТекущиеДанные.Номенклатура);
Количество = ТекущиеДанные.КоличествоУпаковок;
ТекущиеДанные.неоОбъем = ДанныеНоменклатуры.Объем * Количество;
ТекущиеДанные.неоВес = ДанныеНоменклатуры.Вес * Количество;
КонецПроцедуры
Если вы выполнили добавление реквизита в метаданные, но запрос все равно возвращает пустоту, проанализируем следующие моменты:
Записать(). Если данные были заполнены на клиенте, но не переданы в объект, они не попадут в базу.Чтобы избежать описанных проблем, запомните золотое правило: данные, которые должны жить в базе, всегда должны быть в структуре метаданных. Реквизиты формы — это лишь «окно» для отображения. Если данные пропадают — проверяйте, добавили ли вы реквизит в ветку Документы -> ИмяДокумента -> Табличные части -> Товары вашего расширения.
Используйте серверные вызовы экономно, группируя запросы к данным, и всегда следите за тем, чтобы ТекущиеДанные табличной части были актуальны перед записью. Придерживаясь этих правил, вы обеспечите стабильную и быструю работу вашей доработки в расширении конфигурации 1С.