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