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