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