Часто в процессе разработки на платформе 1С 8.2 (обычное приложение) возникает соблазн получить значение поля, которое видит пользователь, через конструкцию ЭлементыФормы.ИмяПоля.Значение. Однако важно помнить: форма — это лишь «лицо» программы, инструмент отображения данных. Сами же данные хранятся в базе данных в объектах или регистрах. Попытка обратиться к ЭлементыФормы чревата тем, что если форма не открыта или не инициализирована, вы получите ошибку или пустое значение.
Разберем, почему в некоторых случаях нужный вам реквизит отсутствует в самом объекте. В конфигурациях, подобных Бухгалтерии 1.6, многие данные являются периодическими. Это значит, что значение реквизита может меняться с течением времени. Чтобы хранить историю этих изменений, разработчики 1С используют РегистрыСведений, а не обычные поля справочника.
Если вам необходимо получить ответственное лицо для склада (например, при печати документа), правильным подходом будет прямое обращение к регистру сведений, который хранит эту информацию. Рассмотрим по шагам, как это реализовать с помощью метода СрезПоследних.
Для начала сформируем структуру отбора, чтобы получить данные именно по нужному нам складу, а затем обратимся к регистру:
Отбор = Новый Структура(\"СтруктурнаяЕдиница\");
Отбор.СтруктурнаяЕдиница = СсылкаНаОбъект.Склад;
// Получаем срез последних данных на текущий момент времени
СрезПоследних = РегистрыСведений.ОтветственныеЛица.СрезПоследних(ТекущаяДата, Отбор);
Если СрезПоследних.Количество() > 0 Тогда
МоёОтветственноеЛицо = СрезПоследних[0].ФизическоеЛицо;
Иначе
МоёОтветственноеЛицо = Неопределено;
КонецЕсли;
Этот способ является единственно верным, так как он гарантирует получение актуальной информации из базы данных независимо от того, какие формы открыты в данный момент в интерфейсе пользователя.
Иногда возникает ситуация, когда нужно получить значение из формы еще не записанного документа. В этом случае, если значение введено пользователем в элемент управления, вы можете обратиться к нему напрямую, но только если форма уже находится в контексте выполнения вашего кода (например, внутри модуля этой же формы).
Если вы находитесь вне контекста формы, то использовать ПолучитьФорму() — это крайняя мера. Если же вам нужно просто скопировать данные из одного реквизита в другой, делайте это на уровне самого объекта (документа), используя его реквизиты, а не элементы его интерфейса:
Порядок действий:
СсылкаНаОбъект.РегистрахСведений.Запрос или метод СрезПоследних для получения данных.ЭлементыФормы, так как это нарушает логику разделения данных и представления.Рассмотрим причину подробнее. В старых системах (как 1С 7.7) периодические реквизиты были свойством самого объекта. В платформе 1С 8 для обеспечения гибкости и масштабируемости их вынесли в отдельные таблицы — РегистрыСведений. Когда вы открываете форму элемента справочника «Склады», программный код в модуле этой формы при событии ПриОткрытии автоматически считывает данные из регистра и подставляет их в поле ввода. Поэтому на форме вы видите ФИО, а в структуре объекта этого поля просто не существует как прямого реквизита.
Помните: всегда ищите данные в источнике (регистре или объекте), а не в интерфейсе. Это сделает ваш код надежным, быстрым и легко сопровождаемым. При попытке доступа к элементам формы вы работаете с визуальным представлением, которое может быть не заполнено, что приведет к ошибкам в отчетах или печатных формах.
Таким образом, для решения задачи печати или получения данных: анализируйте структуру метаданных, находите соответствующий регистр сведений и используйте запрос для получения нужной записи на конкретную дату.