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