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