Как правильно обращаться к реквизитам и элементам формы в 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При переходе в среду 1С из других языков программирования, таких как C# или Python, разработчики часто сталкиваются с непониманием внутренней архитектуры форм. Основная сложность заключается в том, что в 1С интерфейсная часть (то, что видит пользователь) и программная часть (данные) четко разделены. Рассмотрим подробнее, как не запутаться в коллекциях и объектах, чтобы эффективно управлять данными на форме.

Разберем главное: Реквизиты против Элементов

Прежде чем писать код, проанализируем ситуацию: в 1С существует два принципиально разных способа взаимодействия с формой. Поймем разницу между ними:

  1. Реквизиты формы (Данные): Это «переменные», в которых хранятся значения. Если у вас есть поле ввода «Контрагент», то за ним стоит реквизит, содержащий ссылку на справочник. Чтобы получить значение, которое ввел пользователь, нужно обращаться напрямую к реквизиту.
  2. Элементы формы (Интерфейс): Это визуальные объекты — кнопки, поля, таблицы, группы. К ним мы обращаемся только тогда, когда хотим изменить внешний вид: скрыть поле, сделать его доступным только для чтения или изменить цвет шрифта.

Рассмотрим пример типичной ошибки новичка. Попытка получить значение через Элементы.ИмяПоля.ТекстРедактирования приведет к тому, что вы получите «сырой» текст, который пользователь еще не успел зафиксировать (не нажал Enter). Для расчетов всегда используйте реквизит.

Работа в управляемых формах (1С 8.3)

В современных конфигурациях на платформе 8.3 чаще всего используются управляемые формы. Здесь данные объекта (например, документа «Счет на оплату») обычно сгруппированы в основной реквизит Объект. Выясним, как к ним обращаться.

Обращение к данным (реквизитам):

Если нам нужно получить значение клиента из поля «Контрагент», чтобы создать на его основе счет, мы пишем:


// Получаем ссылку на контрагента из реквизита объекта
ВыбранныйКлиент = Объект.Контрагент;

// Если реквизит создан просто на форме (не принадлежит объекту)
ТекущаяДата = ДатаОтгрузки; 

Обращение к визуальным свойствам (элементам):

Если же наша задача — заблокировать поле «Контрагент» после выбора, чтобы пользователь не мог его изменить, мы используем коллекцию Элементы:


// Управляем видимостью и доступностью
Элементы.Контрагент.Доступность = Ложь;
Элементы.ГруппаТехническаяИнформации.Видимость = Истина;

Особенности обычных форм (1С 8.2)

Если вы работаете в старой конфигурации или используете «Толстый клиент», вы столкнетесь с обычными формами. Проанализируем ситуацию здесь: в обычных формах все элементы собраны в коллекцию ЭлементыФормы.

Пример обращения к значению и свойству в обычной форме:


// Получение значения напрямую из реквизита
НужныйСклад = Склад;

// Изменение свойства элемента через коллекцию ЭлементыФормы
ЭлементыФормы.Склад.ЦветФона = ЦветаСтиля.ЦветФонаФайла;

Как работать с табличными частями (Ассортимент товаров)

Одной из задач автора было сохранить все выбранные элементы из ассортимента. Разберем по шагам, как это сделать в управляемой форме. Табличная часть документа — это тоже реквизит (коллекция строк). Чтобы «прочитать» все товары и перенести их в счет, используем цикл.

Посмотрим на пример обхода таблицы товаров:


Для Каждого СтрокаТовара Из Объект.Товары Цикл
    // Обращаемся к данным каждой строки через точку
    ТекущаяНоменклатура = СтрокаТовара.Номенклатура;
    Количество = СтрокаТовара.Количество;
    
    // Здесь может быть логика создания нового документа
    Сообщить("Обрабатываем товар: " + ТекущаяНоменклатура);
КонецЦикла;

Важный нюанс: Контекст исполнения (Клиент и Сервер)

Программисты, привыкшие к C#, часто забывают про разделение на Клиент и Сервер. В управляемых формах это критично:

На клиенте (процедуры с директивой &НаКлиенте): Вам доступна коллекция Элементы. Вы можете менять цвет кнопок и открывать окна. Но вы не можете напрямую записывать данные в базу данных или делать сложные запросы.

На сервере (процедуры с директивой &НаСервере): Вы можете создавать документы, проводить их и делать запросы к базе. Однако здесь категорически недоступна коллекция Элементы. Сервер «не знает», какого цвета у пользователя кнопка, он работает только с данными (реквизитами).

Поэтому алгоритм создания счета должен выглядеть так:

  1. На клиенте пользователь нажимает кнопку.
  2. Программа собирает данные (если нужно) и вызывает серверную процедуру.
  3. На сервере происходит создание объекта Документы.СчетНаОплату.СоздатьДокумент(), его заполнение и запись.

Использование ТекстРедактирования — почему это плохо?

Вернемся к примеру из сообщения №13 в теме форума. Использование Элементы.Количество.ТекстРедактирования — это плохая практика. В 1С типизация данных строгая. Если поле предназначено для числа, реквизит Количество всегда будет числом. Свойство ТекстРедактирования возвращает строку. Если вы попытаетесь умножить строку на цену, вы получите ошибку или неверный результат. Всегда используйте значение реквизита.

Правильный подход к получению введенного числа:


// Правильно: работаем с числовым реквизитом
ИтоговаяСумма = Объект.Количество * Объект.Цена;

// Неправильно: работаем с визуальным текстом
// Сумма = Число(Элементы.Количество.ТекстРедактирования) * Цена; // Так делать не стоит

Заключение

Для успешного решения задачи по созданию счета на оплату, всегда разделяйте понятия «что я вижу» и «с чем я работаю». Используйте прямое обращение к реквизитам Объект.ИмяРеквизита для получения данных и коллекцию Элементы.ИмяЭлемента для управления интерфейсом. Такой подход сделает ваш код надежным, понятным и соответствующим стандартам разработки 1С.

← На главную