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