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