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