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