Почему не работает метод Прочитать() у набора записей на управляемой форме 1С и как это исправить?

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

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

Проанализируем ситуацию: в управляемом интерфейсе данные формы хранятся в виде специализированных типов (например, ДанныеФормыСтруктураСКоллекцией или ДанныеФормыКоллекция). Платформа специально трансформирует прикладные объекты в легковесные структуры для оптимизации передачи между клиентом и сервером. У таких структур данных формы отсутствуют методы чтения и записи базы данных (Прочитать(), Записать()), поэтому прямое обращение к ним через ЭтаФорма.ИмяРеквизита.Прочитать() вызывает исключение.

Рассмотрим по шагам возможные варианты решения этой задачи в зависимости от сценария использования.

Вариант 1. Загрузка данных в существующий реквизит управляемой формы

Если набор записей выведен на форму и пользователю необходимо видеть или редактировать строки, нам потребуется преобразовать данные формы в полноценный прикладной объект на сервере, выполнить чтение и вернуть результат обратно в форму.

Разберем реализацию с помощью функций РеквизитФормыВЗначение() и ЗначениеВРеквизитФормы():


&НаСервере
Процедура ПрочитатьНаборНаСервере(ОперацияСсылка)
    // Преобразуем реквизит формы в реальный прикладной объект набора записей
    НаборОбъект = РеквизитФормыВЗначение("МСФОНаборЗаписей");
    
    // Устанавливаем отбор по регистратору
    НаборОбъект.Отбор.Регистратор.Установить(ОперацияСсылка);
    
    // Читаем проводки из базы данных
    НаборОбъект.Прочитать();
    
    // Помещаем прочитанный набор обратно в реквизит формы для отображения пользователю
    ЗначениеВРеквизитФормы(НаборОбъект, "МСФОНаборЗаписей");
КонецПроцедуры

Обратим внимание на метод Установить() у элемента отбора: вызов НаборОбъект.Отбор.Регистратор.Установить(ОперацияСсылка) заменяет одновременную установку свойств Значение, ВидСравнения и Использование, делая код чище и безопаснее.

Вариант 2. Программное чтение и обработка набора записей на сервере без привязки к форме

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

Посмотрим на пример кода:


&НаСервере
Процедура ОбработатьПроводкиНаСервере(ОперацияСсылка)
    // Создаем независимый набор записей регистра бухгалтерии
    Набор = РегистрыБухгалтерии.МСФО.СоздатьНаборЗаписей();
    Набор.Отбор.Регистратор.Установить(ОперацияСсылка);
    
    // Считываем записи
    Набор.Прочитать();
    
    // Обходим полученные строки регистра
    Для Каждого Проводка Из Набор Цикл
        // Выполняем требуемые действия с проводкой
    КонецЦикла;
    
    // При необходимости модификации и сохранения:
    // Набор.Записать();
КонецПроцедуры

Вариант 3. Отображение записей регистра через Динамический список

Если набор записей требуется на форме только для просмотра и анализа проводок (без прямого построчного интерактивного редактирования), оптимальным решением является использование реквизита с типом ДинамическийСписок.

Разберем порядок настройки и применения этого подхода:

  1. Добавляем на форму реквизит с типом ДинамическийСписок.
  2. Указываем в свойствах списка основную таблицу: РегистрБухгалтерии.МСФО.
  3. Перетаскиваем реквизит в элементы формы (создается таблица формы).
  4. Устанавливаем отбор по регистратору на сервере программно:

&НаСервере
Процедура УстановитьОтборСпискаНаСервере(ОперацияСсылка)
    // Очищаем или настраиваем элемент отбора динамического списка
    ЭлементОтбора = СписокМСФО.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Регистратор");
    ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
    ЭлементОтбора.ПравоеЗначение = ОперацияСсылка;
    ЭлементОтбора.Использование = Истина;
КонецПроцедуры

Преимущество динамического списка заключается в том, что он автоматически считывает порции данных из базы, поддерживает стандартные механизмы сортировки, группировки и поиска платформы 1С и снижает нагрузку на клиентское приложение.

← На главную