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