Как передать параметры из формы списка в новый элемент справочника?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

В разработке на платформе 1С:Предприятие 8.3 часто возникает задача передачи специфического контекста из формы списка в форму нового объекта. Например, в форме списка может быть установлен сложный фильтр или выбран определенный режим работы, и мы хотим, чтобы новый элемент справочника автоматически «подхватил» эти настройки. Рассмотрим, как это реализовать в управляемых формах, используя различные механизмы платформы.

Метод 1. Использование обработчика ПередДобавлением у таблицы списка

Это самый распространенный способ «перехвата» стандартной кнопки Создать. Разберем ситуацию: у нас есть таблица на форме (динамический список), и нам нужно при нажатии на плюс или кнопку создания передать в новый элемент значение реквизита из текущей формы списка.

Проанализируем алгоритм действий. Нам необходимо отменить стандартное открытие формы, которое выполняет платформа, и вызвать его самостоятельно, передав структуру параметров. Рассмотрим пример кода для модуля формы списка:


&НаКлиенте
Процедура СписокПередДобавлением(Элемент, Отказ, Копирование, Родитель, Группа)
	
	// Если это копирование, возможно, логика будет другой
	Если Копирование Тогда
		Возврат;
	КонецЕсли;

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

Выясним, что происходит дальше. Когда мы передаем структуру в ключе ЗначенияЗаполнения, платформа автоматически инициирует механизм обработки заполнения в модуле объекта нового элемента.

Метод 2. Обработка переданных данных в модуле объекта

Чтобы переданные данные корректно записались в реквизиты нового объекта, нам нужно заглянуть в модуль объекта справочника. Рассмотрим процедуру ОбработкаЗаполнения. Именно сюда попадет наша структура из параметра ЗначенияЗаполнения.


Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
	
	Если ТипЗнч(ДанныеЗаполнения) = Тип("Структура") Тогда
		
		// Проверяем наличие наших ключей в структуре
		Если ДанныеЗаполнения.Свойство("Цех") Тогда
			ЭтотОбъект.Цех = ДанныеЗаполнения.Цех;
		КонецЕсли;
		
		Если ДанныеЗаполнения.Свойство("ВажноеПримечание") Тогда
			ЭтотОбъект.Комментарий = ДанныеЗаполнения.ВажноеПримечание;
		КонецЕсли;
		
	КонецЕсли;

КонецПроцедуры

Важный момент: если вы используете типовые конфигурации, помните, что установка СтандартнаяОбработка = Ложь предотвратит выполнение базовых алгоритмов заполнения 1С (например, заполнение по умолчанию из настроек пользователя). Используйте это с осторожностью.

Метод 3. Автозаполнение из настроек динамического списка

Существует более «ленивый» и изящный способ, который не требует написания кода в обработчике ПередДобавлением. Проанализируем возможности динамического списка. Если пользователь установил отбор в списке (например, по подразделению), мы можем заставить систему автоматически подставлять это подразделение в новый элемент.

Разберем по шагам, как это настроить:

  1. Откройте форму списка в конфигураторе.
  2. Выберите таблицу, отображающую динамический список.
  3. В свойствах таблицы найдите флаг Автозаполнение из настроек извлечения (или аналогичное свойство в настройках компоновки данных).
  4. Когда это свойство включено, платформа при создании нового элемента анализирует текущие настройки отбора КомпоновщикаНастроек и передает их в ДанныеЗаполнения.

Это решение идеально подходит для простых случаев, когда нужно передать только те значения, по которым в данный момент отфильтрован список.

Метод 4. Передача произвольных параметров формы

Иногда нам нужно передать не данные для реквизитов объекта, а служебную информацию для самой формы элемента (например, «скрыть кнопку Удалить, если элемент создается из этого списка»). В этом случае мы передаем параметры напрямую в структуру параметров открытия формы, минуя ЗначенияЗаполнения.

Посмотрим на пример в форме списка:


ПараметрыОткрытия = Новый Структура;
ПараметрыОткрытия.Вставить("РежимПросмотра", Истина);
ПараметрыОткрытия.Вставить("ИмяВызывающейФормы", ЭтаФорма.ИмяФормы);

ОткрытьФорму("Справочник.Контрагенты.ФормаОбъекта", ПараметрыОткрытия);

Теперь разберем, как поймать эти данные в форме нового элемента. Это делается в обработчике ПриСозданииНаСервере:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	// Параметры, переданные при открытии, доступны в коллекции "Параметры"
	Если Параметры.Свойство("РежимПросмотра") И Параметры.РежимПросмотра Тогда
		Элементы.ГруппаКоманднаяПанель.Видимость = Ложь;
	КонецЕсли;
	
КонецПроцедуры

Метод 5. Переопределение стандартной команды Создать

Если логика определения параметров очень сложная, иногда проще скрыть стандартную кнопку Создать и добавить свою собственную кнопку в командную панель. Это позволяет полностью контролировать процесс подготовки данных перед вызовом ОткрытьФорму.

Рассмотрим преимущества этого подхода:

Метод 6. Использование временного хранилища для больших объемов данных

В исключительных ситуациях, когда из формы списка нужно передать огромный массив данных или таблицу значений, передача через структуру параметров может быть неэффективной. В таком случае мы используем Временное хранилище.

Проанализируем схему работы:

  1. В форме списка помещаем данные в хранилище с помощью функции ПоместитьВоВременноеХранилище.
  2. Получаем уникальный Адрес (строку).
  3. Передаем этот Адрес как обычный параметр в форму нового элемента.
  4. В форме элемента в процедуре ПриСозданииНаСервере извлекаем данные по адресу через ПолучитьИзВременногоХранилища.

Это позволяет избежать «раздувания» параметров вызова и снижает нагрузку на сеть между клиентом и сервером.

Подводя итог, выбор метода зависит от вашей конкретной задачи. Для простого заполнения реквизитов лучше всего подходит ПередДобавлением с ключом ЗначенияЗаполнения. Для изменения интерфейса формы используйте произвольные ключи в структуре Параметры. Для автоматизации по фильтрам — штатные механизмы динамического списка.

← На главную