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