Разработка и Конфигурация · 11 мин
Как обратиться к реквизиту обработки в 1С
Как обратиться к реквизиту обработки в 1С: через ЭтотОбъект, форму, макет и ссылку на объект. Примеры кода, типичные ошибки и ответы на вопросы.
Обращение к реквизиту обработки — одна из базовых операций при разработке внешних и встроенных обработок в 1С. От того, в каком контексте выполняется код (модуль объекта, модуль формы, клиент или сервер), зависит правильный способ доступа. Ошибка в выборе контекста приводит к сообщению «Поле объекта не обнаружено» или к обращению не к тем данным.
Реквизиты обработки описываются в конфигураторе на закладке «Данные» и хранятся в объекте ОбработкаОбъект. Форма обработки, в свою очередь, имеет собственные реквизиты формы, которые не совпадают с реквизитами объекта. Путаница между этими двумя наборами данных — главный источник проблем у начинающих разработчиков.
Ниже разобраны все основные сценарии: доступ из модуля объекта, из управляемой и обычной формы, обращение к реквизиту по строковому имени, работа с табличными частями обработки и типичные ошибки с способами их диагностики.
Что такое реквизит обработки и где он хранится
Реквизит обработки — это именованное поле данных, объявленное в конфигураторе в структуре обработки (панель «Данные» → «Реквизиты»). Каждый реквизит имеет имя, тип и, при необходимости, синоним. Для внешней обработки реквизиты задаются так же, как и для обработки внутри конфигурации.
Физически значения реквизитов живут в экземпляре объекта типа ОбработкаОбъект.<ИмяОбработки>. Они не сохраняются в базе данных между сеансами — обработка, в отличие от справочника или документа, не является объектом хранения. Значения существуют, пока существует объект: пока открыта форма или пока переменная держит ссылку на объект.
Если данные нужно сохранять между запусками, реквизиты обработки для этого не подходят — используют регистры сведений, константы, хранилище общих настроек или сохранение в файл. Это важное ограничение, о котором часто забывают при проектировании.
Обращение к реквизиту из модуля объекта
Самый простой сценарий — код в модуле объекта обработки. Здесь реквизиты доступны напрямую по имени, без каких-либо префиксов:
Процедура ЗаполнитьДанные() Экспорт
// Прямое обращение по имени реквизита
Организация = Справочники.Организации.НайтиПоКоду("000000001");
ПериодОтчета = ТекущаяДатаСеанса();
КонецПроцедуры
Для явности можно использовать свойство ЭтотОбъект — это полезно, когда имя реквизита совпадает с именем локальной переменной или параметра процедуры:
Процедура УстановитьОрганизацию(Организация) Экспорт
ЭтотОбъект.Организация = Организация; // реквизит объекта, а не параметр
КонецПроцедуры
Если имя реквизита известно только в момент выполнения (например, приходит строкой из настроек), используйте обращение через квадратные скобки:
ИмяРеквизита = "Комментарий";
ЭтотОбъект[ИмяРеквизита] = "Заполнено программно";
ТекущееЗначение = ЭтотОбъект[ИмяРеквизита];
Такой приём удобен при универсальном обходе реквизитов, но лишает вас контроля типов на этапе написания кода. Перед присваиванием проверяйте, что реквизит с таким именем действительно существует, иначе получите ошибку выполнения.
Обращение из управляемой формы
В управляемой форме прямого доступа к реквизитам объекта нет — форма работает со своими данными. Основной реквизит формы обычно называется Объект и имеет тип ДанныеФормыСтруктура на основе обработки. Обратиться к его полю можно так:
&НаКлиенте
Процедура ПоказатьОрганизацию(Команда)
Сообщить(Объект.Организация);
КонецПроцедуры
Это работает, потому что реквизит формы «Объект» повторяет структуру реквизитов обработки. Изменение Объект.Организация на форме меняет данные формы, а не объект обработки на сервере напрямую — синхронизация происходит внутри платформы.
Получение объекта обработки на сервере
Когда нужно вызвать метод модуля объекта или получить полноценный ОбработкаОбъект, используйте преобразование:
&НаСервере
Процедура ВыполнитьНаСервере()
ОбъектОбработки = РеквизитФормыВЗначение("Объект");
ОбъектОбработки.Комментарий = "Записано с сервера";
ОбъектОбработки.ЗаполнитьДанные();
ЗначениеВРеквизитФормы(ОбъектОбработки, "Объект");
КонецПроцедуры
Обратное преобразование ЗначениеВРеквизитФормы обязательно, если изменения должны отобразиться на форме. Без него вы измените объект в памяти сервера, но пользователь на форме ничего не увидит.
Для внешней обработки
Если обработка внешняя, РеквизитФормыВЗначение("Объект") тоже работает, но тип объекта будет ВнешняяОбработкаОбъект. Программно создать экземпляр внешней обработки вне формы можно так:
Обработка = ВнешниеОбработки.Создать("C:\Обработки\МояОбработка.epf", Ложь);
Обработка.Организация = МояОрганизация;
Обработка.ЗаполнитьДанные();
Обращение из обычной формы
В обычных формах (режим обычного приложения) реквизиты обработки доступны напрямую из модуля формы, поскольку форма жёстко связана с объектом:
Процедура КнопкаВыполнитьНажатие(Кнопка)
Организация = Справочники.Организации.ПустаяСсылка();
ЭтотОбъект.Комментарий = "Очищено";
Сообщить("Организация: " + Организация);
КонецПроцедуры
Разделения на клиентский и серверный контекст здесь нет — весь код выполняется на клиенте (толстом), поэтому обращение к реквизитам не требует преобразований. Однако обычные формы не работают в тонком и веб-клиенте, что ограничивает применение этого подхода в современных конфигурациях.
Работа с табличными частями обработки
Табличная часть обработки — это тоже реквизит, только табличного типа. Обращение из модуля объекта выполняется по имени табличной части:
// Добавление строки
НоваяСтрока = Товары.Добавить();
НоваяСтрока.Номенклатура = НайденныйТовар;
НоваяСтрока.Количество = 1;
// Обход строк
Для Каждого Строка Из Товары Цикл
Сообщить(Строка.Номенклатура);
КонецЦикла;
// Очистка
Товары.Очистить();
Из управляемой формы та же табличная часть доступна через Объект.Товары, и её можно напрямую связывать с таблицей формы. После серверного вызова с РеквизитФормыВЗначение изменения в табличной части объекта применяются к форме через ЗначениеВРеквизитФормы — таблица обновится целиком.
- 1Откройте модуль формы и определите, где выполняется код: клиент или сервер
- 2На клиенте обращайтесь к реквизиту через Объект.ИмяРеквизита
- 3Если нужен объект обработки, создайте серверную процедуру и вызовите РеквизитФормыВЗначение("Объект")
- 4Измените реквизиты полученного объекта или вызовите его методы
- 5Верните данные в форму через ЗначениеВРеквизитФормы и проверьте отображение на форме
Проверка результата и типичные ошибки
После обращения к реквизиту убедитесь, что читается и пишется именно то значение. Быстрый способ — вывести значение через Сообщить() или остановиться в отладчике и посмотреть значение в табло. Для формы проверяйте, что после серверного вызова данные на экране обновились.
Как проверить результат
Поле содержит ожидаемое значение нужного типа
Значение Неопределено или пустая ссылка — обращение идёт не к тому объекту
Поля формы обновились
Форма показывает старые данные — пропущен ЗначениеВРеквизитФормы
Код выполняется без исключений
«Поле объекта не обнаружено» — проверьте имя реквизита и тип объекта
Выбор способа в зависимости от контекста
Как выбрать способ обращения
Если обработка используется как программный инструмент без интерфейса (например, вызывается из другого кода), предпочтителен вариант с созданием объекта и прямым обращением к реквизитам — он быстрее и проще в отладке. Форма с преобразованиями нужна только там, где есть интерактивная работа пользователя.
Что важно запомнить
Реквизиты обработки живут в объекте ОбработкаОбъект и не сохраняются между сеансами. Из модуля объекта к ним обращаются напрямую, из управляемой формы — через Объект.Имя или через РеквизитФормыВЗначение с обязательным обратным преобразованием. Имя реквизита строкой позволяет обращаться динамически, но требует проверок.
Частые вопросы
Как обратиться к реквизиту обработки, если его имя хранится в переменной?
Используйте обращение через квадратные скобки: ЭтотОбъект[ИмяПеременной] в модуле объекта или Объект[ИмяПеременной] в форме. Перед записью убедитесь, что реквизит существует, — например, проверкой через метаданные объекта.
Почему возникает ошибка «Поле объекта не обнаружено»?
Чаще всего причины три: опечатка в имени реквизита, обращение к реквизиту объекта из формы без префикса Объект., либо обращение к реквизиту формы через объект обработки. Проверьте, в каком контексте выполняется код и к какому набору данных вы обращаетесь.
Можно ли обратиться к реквизиту обработки из другой обработки или отчёта?
Да, если у вас есть ссылка на экземпляр объекта. Создайте объект через Обработки.ИмяОбработки.Создать() или ВнешниеОбработки.Создать(Путь) и обращайтесь к реквизитам напрямую: ОбъектОбработки.ИмяРеквизита.
Сохраняются ли значения реквизитов обработки после закрытия?
Нет. Обработка не хранит данные в базе. Для сохранения настроек используйте хранилище общих настроек (ХранилищеОбщихНастроек.Сохранить), регистры сведений или сохранение значений в файл через ЗначениеВФайл.
Чем реквизит формы отличается от реквизита обработки?
Реквизит обработки объявлен в структуре объекта и доступен в модуле объекта. Реквизит формы существует только внутри формы и пропадает при её закрытии. Основной реквизит формы «Объект» отражает структуру обработки, но это данные формы, а не сам объект.
Как обратиться к реквизиту табличной части конкретной строки?
Через индекс или переменную строки: Товары[0].Количество для первой строки, либо в цикле Для Каждого Строка Из Товары Цикл ... Строка.Цена ... КонецЦикла. Из формы — аналогично через Объект.Товары.