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