Как автоматически заполнять значения ресурсов и реквизитов при вводе новой строки в регистр сведений?

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

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

Способ 1. Заполнение значения по умолчанию в событии ПриНачалеРедактирования

Наиболее простое и элегантное решение для формы списка или табличного поля — использование события элемента управления ПриНачалеРедактирования. Это событие возникает в тот момент, когда строка активизируется для редактирования или создается заново (по нажатию клавиши Ins или кнопки «Добавить»).

Разберем по шагам логику обработки события:

  1. Определяем, что редактируемая строка действительно является вновь созданной, а не открытой для изменения существующей записью.
  2. Проверяем, не происходит ли копирование уже существующей строки (чтобы не затереть скопированные данные).
  3. Получаем доступ к текущим редактируемым данным строки таблицы через свойство ТекущиеДанные.
  4. Присваиваем ресурсу или реквизиту требуемое значение из реквизита шапки или переменной по умолчанию.

Посмотрим на пример обработчика для обычной формы:


Процедура ТабличноеПолеРегистрПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование)
    
    // Проверяем, что строка новая и это не копирование
    Если НоваяСтрока И Не Копирование Тогда
        СтрокаТЧ = Элемент.ТекущиеДанные;
        Если СтрокаТЧ <> Неопределено Тогда
            СтрокаТЧ.Площадь = ПлощадьПоУмолчанию;
        КонецЕсли;
    КонецЕсли;

КонецПроцедуры

Важный момент: если пользователь решит отменить ввод строки (например, нажав клавишу Esc), запись в базе данных создана не будет, а временные данные просто удалятся из интерфейса без лишних транзакций и проверок.

Способ 2. Заполнение значений при открытии формы записи на управляемых формах

В интерфейсе управляемых форм ввод данных в независимый регистр сведений чаще всего выполняется не непосредственно в строке динамического списка, а в отдельной форме записи. Для передачи значений по умолчанию в таком случае разберем следующий подход:

  1. Формируем структуру параметров с именем ЗначенияЗаполнения, в которую помещаем значения для требуемых полей.
  2. Передаем параметры в метод ОткрытьФорму().
  3. В модуле менеджера записи регистра используем предопределенную процедуру ОбработкаЗаполнения.

Посмотрим на пример вызова формы из клиентского кода:


ПараметрыФормы = Новый Структура;
ПараметрыЗаполнения = Новый Структура;
ПараметрыЗаполнения.Вставить("Склад", ВыбранныйСклад);
ПараметрыЗаполнения.Вставить("Площадь", ЗначениеПлощади);

ПараметрыФормы.Вставить("ЗначенияЗаполнения", ПараметрыЗаполнения);
ОткрытьФорму("РегистрСведений.ЗанимаемаяПлощадь.ФормаЗаписи", ПараметрыФормы, ЭтотОбъект);

В модуле менеджера регистра сведений обрабатываем переданные параметры:


Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
    
    Если ТипЗнч(ДанныеЗаполнения) = Тип("Структура") Тогда
        ЗаполнитьЗначенияСвойств(ЭтотОбъект, ДанныеЗаполнения);
    КонецЕсли;

КонецПроцедуры

Особенности программного автозаполнения измерений и ошибка «Значение поля не соответствует установленному отбору»

Проанализируем распространенную ошибку, возникающую при попытке программно инициализировать поля регистра при записи. Если поле добавлено как измерение, оно входит в ключ уникальности регистра сведений. При работе через МенеджерЗаписи отбор по всем измерениям накладывается платформой автоматически.

Если в коде значение измерения не было заполнено до записи, в отбор попадает пустое значение. Попытка изменить значение измерения внутри событий ПередЗаписью или ПриЗаписи модуля набора записей приводит к исключению:

Ошибка при вызове метода контекста (Записать): Запись не верна! Значение поля не соответствует установленному отбору

Разберем правильные пути решения этой проблемы:

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

Процедура ПередЗаписью(Отказ, Замещение)
    
    Для Каждого Запись Из ЭтотОбъект Цикл
        Если Не ЗначениеЗаполнено(Запись.ДатаЗаписиВРегистр) Тогда
            Запись.ДатаЗаписиВРегистр = ТекущаяДата();
        КонецЕсли;
    КонецЦикла;

КонецПроцедуры
  1. Корректная работа с отбором набора записей: если поле обязательно должно оставаться измерением, при программной записи через объект РегистрСведенийНаборЗаписей необходимо явно отключать отбор по данному измерению перед вызовом метода Записать():

Набор = РегистрыСведений.ОтправленныеСообщения.СоздатьНаборЗаписей();
// Отключаем использование отбора по новому измерению
Набор.Отбор.ДатаЗаписиВРегистр.Использование = Ложь;

НоваяЗапись = Набор.Добавить();
// Заполняем остальные измерения
НоваяЗапись.ДатаЗаписиВРегистр = ТекущаяДата();
Набор.Записать();

Как избавиться от окна выбора типа при работе со связью по типу (План видов характеристик)

Выясним причину ситуации, когда в таблице задана «Связь по типу» с реквизитом типа ПланВидовХарактеристикСсылка, однако при нажатии кнопки выбора платформа все равно заставляет пользователя выбирать тип данных из списка с одним-единственным пунктом.

Такое поведение платформы обусловлено тем, что значение в ячейке изначально имеет тип Неопределено или тип характеристики допускает составной тип данных. Чтобы выбор значения справочника открывался мгновенно в один клик, применим следующие приемы:

  1. Отключение свойства выбора типа: в свойствах элемента формы (поля ввода) устанавливаем флаг ВыбиратьТип = Ложь. Это принудительно запрещает открытие диалога выбора типа.
  2. Инициализация пустой ссылкой: при выборе или смене вида субконто программно приводим значение зависимого реквизита к базовому пустому значению выбранного типа:

Процедура ВидСубконтоПриИзменении(Элемент)
    
    СтрокаТЧ = ЭлементыФормы.ТабличнаяЧасть.ТекущиеДанные;
    Если СтрокаТЧ <> Неопределено И ЗначениеЗаполнено(СтрокаТЧ.ВидСубконто) Тогда
        // Приводим значение к пустому значению выбранного типа
        СтрокаТЧ.ЗначениеСубконто = СтрокаТЧ.ВидСубконто.ТипЗначения.ПривестиЗначение(СтрокаТЧ.ЗначениеСубконто);
    КонецЕсли;

КонецПроцедуры

Применение события ПриНачалеРедактирования для заполнения значений по умолчанию в сочетании с правильной настройкой типов характеристик делает работу пользователя с регистрами сведений удобной, быстрой и защищенной от ошибок валидации платформы.

← На главную