В процессе разработки на платформе 1С:Предприятие 8.3 начинающие программисты часто сталкиваются с необходимостью автоматизировать рутинные действия. Одной из таких задач является автоматическое создание одного объекта на основании другого без прямого участия пользователя (без нажатия кнопки "Создать на основании"). Также часто возникают трудности при попытке получить данные из текущей строки таблицы на форме. В этой статье мы подробно разберем, как реализовать подобную логику и как избежать типичных ошибок при обращении к контексту формы.
Рассмотрим ситуацию, когда при записи элемента одного справочника нам необходимо создать элемент в другом справочнике и заполнить его данными. Проанализируем два основных способа реализации этой задачи, которые обсуждались в рамках учебного примера.
Способ 1: Прямое заполнение реквизитов
Этот метод заключается в ручном создании объекта и последовательном присвоении значений его реквизитам. Разберем пример кода, который можно разместить в обработчике события записи:
НовыйОбъект = Справочники.Справочник1.СоздатьЭлемент();
НовыйОбъект.Наименование = "Автоматически созданный элемент";
НовыйОбъект.Комментарий = "Создано из другой формы";
// Здесь можно заполнить другие реквизиты
НовыйОбъект.Записать();
Способ 2: Использование метода Заполнить()
Более профессиональным подходом считается использование механизма ОбработкаЗаполнения. Это позволяет инкапсулировать логику внутри самого создаваемого объекта. Выясним, как это работает: мы передаем в объект структуру данных, а объект сам решает, как их распределить.
ПараметрыЗаполнения = Новый Структура;
ПараметрыЗаполнения.Вставить("Наименование", "Тестовое имя");
ПараметрыЗаполнения.Вставить("Цена", 100);
НовыйОбъект = Справочники.Справочник1.СоздатьЭлемент();
НовыйОбъект.Заполнить(ПараметрыЗаполнения);
НовыйОбъект.Записать();
Выбор места для размещения кода крайне важен для стабильности программы. Проанализируем два варианта:
ЭтоНовый().Рассмотрим пример в модуле объекта:
Процедура ПередЗаписью(Отказ)
Если ЭтоНовый() Тогда
// Код создания связанного объекта
КонецЕсли;
КонецПроцедуры
Одной из самых частых ошибок при работе с управляемыми формами является неправильное обращение к строкам табличной части. Посмотрим на причину возникновения ошибки в коде Элементы.ТекущиеДанные.Подарок.
Проблема заключается в том, что ТекущиеДанные — это свойство не всей коллекции Элементы, а конкретного элемента формы, являющегося Таблицей. Выясним правильный алгоритм обращения:
Элементы.Товары), как оно задано в свойствах на форме.ТекущиеДанные.Правильный вариант кода будет выглядеть так:
ДанныеСтроки = Элементы.ИмяВашейТаблицы.ТекущиеДанные;
Важно: Всегда проверяйте результат на пустое значение, так как если в таблице не выбрана ни одна строка, программа выдаст ошибку:
ДанныеСтроки = Элементы.Товары.ТекущиеДанные;
Если ДанныеСтроки <> Неопределено Тогда
ВыбранныйПодарок = ДанныеСтроки.Подарок;
КонецЕсли;
В управляемом приложении (платформа 8.3) существует строгое разделение на клиентский и серверный контекст. Попытка получить данные справочника напрямую на клиенте приведет к ошибке. Рассмотрим, как правильно организовать "беготню" данных между клиентом и сервером на примере получения цены подарка при изменении строки.
Разберем по шагам реализацию в модуле формы:
ПриИзменении для элемента табличной части.&НаСервереБезКонтекста для ускорения работы, так как нам не нужно передавать всю форму на сервер.
&НаКлиенте
Процедура ТоварыПодарокПриИзменении(Элемент)
СтрокаТаблицы = Элементы.Товары.ТекущиеДанные;
Если СтрокаТаблицы <> Неопределено Тогда
// Вызываем сервер для получения цены
СтрокаТаблицы.Цена = ПолучитьЦенуПодаркаНаСервере(СтрокаТаблицы.Подарок);
КонецЕсли;
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьЦенуПодаркаНаСервере(СсылкаНаПодарок)
// Возвращаем цену прямо из реквизита справочника
Возврат СсылкаНаПодарок.ЦенаПокупки;
КонецФункции
Для успешного решения подобных задач крайне важно уметь пользоваться встроенной справкой. В 1С она называется Синтаксис-помощник (СП). Рассмотрим, как он может помочь:
Элементы и нажмите Ctrl + F1.Синтаксис-помощника позволяет быстро понять, что метод СоздатьЭлемент() недоступен на клиенте, и его нужно вызывать только в серверных процедурах.Проанализировав вышеописанные методы, мы видим, что разработка в 1С требует четкого понимания того, где исполняется код и к каким коллекциям данных идет обращение. Следуя этим правилам, вы сможете создавать надежные и автоматизированные решения даже в рамках учебных проектов.