При переходе в среду 1С из других языков программирования, таких как C# или Python, разработчики часто сталкиваются с непониманием внутренней архитектуры форм. Основная сложность заключается в том, что в 1С интерфейсная часть (то, что видит пользователь) и программная часть (данные) четко разделены. Рассмотрим подробнее, как не запутаться в коллекциях и объектах, чтобы эффективно управлять данными на форме.
Прежде чем писать код, проанализируем ситуацию: в 1С существует два принципиально разных способа взаимодействия с формой. Поймем разницу между ними:
Рассмотрим пример типичной ошибки новичка. Попытка получить значение через Элементы.ИмяПоля.ТекстРедактирования приведет к тому, что вы получите «сырой» текст, который пользователь еще не успел зафиксировать (не нажал Enter). Для расчетов всегда используйте реквизит.
В современных конфигурациях на платформе 8.3 чаще всего используются управляемые формы. Здесь данные объекта (например, документа «Счет на оплату») обычно сгруппированы в основной реквизит Объект. Выясним, как к ним обращаться.
Обращение к данным (реквизитам):
Если нам нужно получить значение клиента из поля «Контрагент», чтобы создать на его основе счет, мы пишем:
// Получаем ссылку на контрагента из реквизита объекта
ВыбранныйКлиент = Объект.Контрагент;
// Если реквизит создан просто на форме (не принадлежит объекту)
ТекущаяДата = ДатаОтгрузки;
Обращение к визуальным свойствам (элементам):
Если же наша задача — заблокировать поле «Контрагент» после выбора, чтобы пользователь не мог его изменить, мы используем коллекцию Элементы:
// Управляем видимостью и доступностью
Элементы.Контрагент.Доступность = Ложь;
Элементы.ГруппаТехническаяИнформации.Видимость = Истина;
Если вы работаете в старой конфигурации или используете «Толстый клиент», вы столкнетесь с обычными формами. Проанализируем ситуацию здесь: в обычных формах все элементы собраны в коллекцию ЭлементыФормы.
Пример обращения к значению и свойству в обычной форме:
// Получение значения напрямую из реквизита
НужныйСклад = Склад;
// Изменение свойства элемента через коллекцию ЭлементыФормы
ЭлементыФормы.Склад.ЦветФона = ЦветаСтиля.ЦветФонаФайла;
Одной из задач автора было сохранить все выбранные элементы из ассортимента. Разберем по шагам, как это сделать в управляемой форме. Табличная часть документа — это тоже реквизит (коллекция строк). Чтобы «прочитать» все товары и перенести их в счет, используем цикл.
Посмотрим на пример обхода таблицы товаров:
Для Каждого СтрокаТовара Из Объект.Товары Цикл
// Обращаемся к данным каждой строки через точку
ТекущаяНоменклатура = СтрокаТовара.Номенклатура;
Количество = СтрокаТовара.Количество;
// Здесь может быть логика создания нового документа
Сообщить("Обрабатываем товар: " + ТекущаяНоменклатура);
КонецЦикла;
Программисты, привыкшие к C#, часто забывают про разделение на Клиент и Сервер. В управляемых формах это критично:
На клиенте (процедуры с директивой &НаКлиенте): Вам доступна коллекция Элементы. Вы можете менять цвет кнопок и открывать окна. Но вы не можете напрямую записывать данные в базу данных или делать сложные запросы.
На сервере (процедуры с директивой &НаСервере): Вы можете создавать документы, проводить их и делать запросы к базе. Однако здесь категорически недоступна коллекция Элементы. Сервер «не знает», какого цвета у пользователя кнопка, он работает только с данными (реквизитами).
Поэтому алгоритм создания счета должен выглядеть так:
Документы.СчетНаОплату.СоздатьДокумент(), его заполнение и запись.Вернемся к примеру из сообщения №13 в теме форума. Использование Элементы.Количество.ТекстРедактирования — это плохая практика. В 1С типизация данных строгая. Если поле предназначено для числа, реквизит Количество всегда будет числом. Свойство ТекстРедактирования возвращает строку. Если вы попытаетесь умножить строку на цену, вы получите ошибку или неверный результат. Всегда используйте значение реквизита.
Правильный подход к получению введенного числа:
// Правильно: работаем с числовым реквизитом
ИтоговаяСумма = Объект.Количество * Объект.Цена;
// Неправильно: работаем с визуальным текстом
// Сумма = Число(Элементы.Количество.ТекстРедактирования) * Цена; // Так делать не стоит
Для успешного решения задачи по созданию счета на оплату, всегда разделяйте понятия «что я вижу» и «с чем я работаю». Используйте прямое обращение к реквизитам Объект.ИмяРеквизита для получения данных и коллекцию Элементы.ИмяЭлемента для управления интерфейсом. Такой подход сделает ваш код надежным, понятным и соответствующим стандартам разработки 1С.