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