Для Открытия формы создаваемого (нового) документа в 1С 8.3 программно используются различные подходы в зависимости от того, где выполняется код (на клиенте или на сервере) и нужно ли предварительно заполнить документ.
Общие шаги и подходы
Существуют два основных сценария:
Открыть пустую форму нового документа: Просто открывается форма, и пользователь вручную заполняет все данные. Создать и заполнить документ программно, затем открыть его форму: Документ сначала создается в памяти, заполняется нужными данными, и только потом открывается его форма для просмотра или дальнейшего редактирования пользователем.
1. Открытие пустой формы нового документа
Этот способ самый простой и используется, когда вы хотите, чтобы пользователь сам заполнил все данные.
Фрагмент кода
// Пример на клиенте (в модуле управляемой формы или обычной формы)
&НаКлиенте
Процедура ОткрытьНовыйДокументПродажи(Команда)
ОткрытьФорму("Документ. РеализацияТоваровУслуг. ФормаОбъекта");
КонецПроцедуры
- ОткрытьФорму(): Это глобальная функция, которая открывает форму объекта. "Документ. РеализацияТоваровУслуг. ФормаОбъекта": Это полное имя формы. Оно состоит из:
- Документ: Указывает на метаданные типа "Документ". РеализацияТоваровУслуг: Имя конкретного вида документа. ФормаОбъекта: Стандартное имя основной формы документа. Если у документа есть другие формы (например, ФормаДокумента, ФормаСписка, или произвольная форма, созданная вами), вы указываете их имя.
2. Создание и заполнение документа программно, затем открытие его формы
Этот способ более гибкий и используется, когда нужно предварительно заполнить новый документ данными (например, на основании другого документа, или из внешнего источника). Этот процесс часто включает взаимодействие клиента и сервера.
Пример сценария: Пользователь нажимает кнопку на форме, в результате чего создается новый документ "Реализация товаров и услуг" с заполненным контрагентом, и открывается его форма.
Фрагмент кода
// Модуль управляемой формы (клиентский код)
&НаКлиенте
Процедура СоздатьИОткрытьЗаполненныйДокумент(Команда)
// Вызов серверной функции для создания и предварительного заполнения документа
АдресХранилища = СоздатьИЗаполнитьДокументНаСервере();
Если Не ЗначениеЗаполнено(АдресХранилища) Тогда
Сообщить("Не удалось создать документ!");
Возврат;
КонецЕсли;
// Параметры для открытия формы.
// Если документ не записан, его объект передается через параметр "Объект",
// а сам объект (ДанныеФормы) загружается из временного хранилища.
// Если документ записан, передается его ссылка через параметр "Ключ".
ПараметрыОткрытия = Новый Структура("Объект", АдресХранилища);
// Открываем форму нового документа
ОткрытьФорму("Документ. РеализацияТоваровУслуг. ФормаОбъекта", ПараметрыОткрытия);
КонецПроцедуры
// Модуль управляемой формы (серверный код)
&НаСервере
Функция СоздатьИЗаполнитьДокументНаСервере()
// 1. Создаем новый объект документа
НовыйДокументОбъект = Документы. РеализацияТоваровУслуг. СоздатьДокумент();
// 2. Заполняем реквизиты (пример)
НовыйДокументОбъект. Дата = ТекущаяДата();
НовыйДокументОбъект. Организация = ПолучитьОрганизациюПоУмолчанию(); // Ваша функция или выбор
НовыйДокументОбъект. Контрагент = Справочники. Контрагенты. НайтиПоНаименованию("ООО ""Покупатель"""); // Пример поиска контрагента
// Можно заполнить табличные части, например:
// НоваяСтрокаТЧ = НовыйДокументОбъект. Товары. Добавить();
// НоваяСтрокаТЧ. Номенклатура = Справочники. Номенклатура. НайтиПоНаименованию("Монитор");
// НоваяСтрокаТЧ. Количество = 1;
// НоваяСтрокаТЧ. Цена = 10000;
// НоваяСтрокаТЧ. Сумма = НоваяСтрокаТЧ. Количество * НоваяСтрокаТЧ. Цена;
// Важно: если мы не хотим записывать документ сразу в базу,
// а хотим, чтобы пользователь сначала проверил данные на форме,
// то документ НЕ ЗАПИСЫВАЕТСЯ!
// 3. Возвращаем объект документа через временное хранилище
Возврат ПоместитьВоВременноеХранилище(НовыйДокументОбъект, УникальныйИдентификатор);
КонецФункции
// Пример вспомогательной функции для получения организации
&НаСервере
Функция ПолучитьОрганизациюПоУмолчанию()
// Здесь может быть ваша логика получения основной организации
Возврат Справочники. Организации. НайтиПоКоду("00001"); // Пример
КонецФункции
Объяснение кода:
- Документы. РеализацияТоваровУслуг. СоздатьДокумент(): Создает в памяти новый объект типа "Документ. РеализацияТоваровУслуг". НовыйДокументОбъект. Дата = ТекущаяДата();: Пример заполнения реквизитов. Вы можете заполнять любые реквизиты, включая табличные части. ПоместитьВоВременноеХранилище(НовыйДокументОбъект, УникальныйИдентификатор): Это очень важный шаг. Поскольку объект документа (НовыйДокументОбъект) был создан на сервере, а форму мы открываем на клиенте, его нужно передать между контекстами. Временное хранилище — это безопасный способ передачи данных между клиентом и сервером. УникальныйИдентификатор здесь используется для связывания. Новый Структура("Объект", АдресХранилища): Когда вы открываете форму Нового, еще не записанного объекта, вы передаете адрес этого объекта во временном хранилище через параметр формы с именем Объект. 1С сама подхватит этот параметр и инициализирует форму переданными данными. ОткрытьФорму("Документ. РеализацияТоваровУслуг. ФормаОбъекта", ПараметрыОткрытия): Открывает форму, передавая ей заполненный объект для отображения.
Если документ уже существует (открыть существующий документ)
Если вы хотите открыть форму уже существующего (записанного) документа, то вместо самого объекта передается его Ссылка через параметр формы с именем Ключ.
Фрагмент кода
// Пример на клиенте
&НаКлиенте
Процедура ОткрытьСуществующийДокумент(Команда)
// Допустим, у нас есть ссылка на документ
СсылкаНаДокумент = Документы. РеализацияТоваровУслуг. НайтиПоНомер("00000001", ТекущаяДата()); // Пример поиска
Если Не ЗначениеЗаполнено(СсылкаНаДокумент) Тогда
Сообщить("Документ не найден!");
Возврат;
КонецЕсли;
ПараметрыОткрытия = Новый Структура("Ключ", СсылкаНаДокумент);
ОткрытьФорму("Документ. РеализацияТоваровУслуг. ФормаОбъекта", ПараметрыОткрытия);
КонецПроцедуры
Ключевые моменты:
- Контекст выполнения: Код для открытия формы (ОткрытьФорму) всегда должен выполняться на Клиенте. Создание и первичное заполнение объекта документа (СоздатьДокумент(), Записать()) может происходить на Сервере. Параметры формы: Для передачи данных в открываемую форму используются Параметры формы, которые передаются в виде структуры. Наиболее важные для открытия:
- Ключ: Используется для открытия Существующего объекта (передается ссылка). Объект: Используется для открытия формы Нового, незаписанного объекта (передается адрес объекта во временном хранилище). Другие параметры могут использоваться для передачи пользовательских данных в форму.
ФормаОбъекта: Это типовое имя основной формы документа. В некоторых конфигурациях для документов может использоваться ФормаДокумента. Если вы создавали свои формы для документа, используйте их имена.
Выберите подход, который лучше всего соответствует вашей задаче!