Метод автоматически устанавливает соответствие между реквизитами формы клиентского приложения и объектами вида СообщениеПользователю для последующей установки правильного соответствия сообщений и элементов управления формы. Для того, чтобы сообщение использовало данные соответствия объекта и имени реквизита, у него необходимо заполнить поле Данные. Соответствие может быть получено методом ПолучитьСоответствиеОбъектаИРеквизитаФормы. Получить соответствие можно до тех пор, пока существует объект, для которого оно зарегистрировано.
Синтаксис
УстановитьСоответствиеОбъектаИРеквизитаФормы(<Объект>, <ИмяРеквизита>)Примеры платформы
Документ = ДанныеФормыВЗначение(Объект,
Тип("ДокументОбъект.ПоступлениеТМЦ"));
УстановитьСоответствиеОбъектаИРеквизитаФормы(Документ, "Объект");
....
Документ.Записать();
Процедура ОбработкаПроведения()
...
Сообщение = Новый СообщениеПользователю();
Сообщение.Текст = "В строке 11 табличной части " +
"""Номенклатура"" не хватает " +
НедостающееКоличество + " " +
ЕдиницаИзмеренияНоменклатуры;
Сообщение.Поле = "Номенклатура[10].Количество";
Сообщение.УстановитьДанные(ЭтотОбъект);
Сообщение.Сообщить();
...
КонецПроцедуры;Полное описание, параметры и ограничения
Глобальный контекст.УстановитьСоответствиеОбъектаИРеквизитаФормы (Global context.SetObjectAndFormAttributeConformity)
Глобальный контекст (Global context)
УстановитьСоответствиеОбъектаИРеквизитаФормы (SetObjectAndFormAttributeConformity)
Не рекомендуется использовать, начиная с версии 8.2.
Рекомендуется использовать:
УстановитьСоответствиеОбъектаИФормы
Доступен, начиная с версии 8.2.
Синтаксис:
УстановитьСоответствиеОбъектаИРеквизитаФормы(<Объект>, <ИмяРеквизита>)
Параметры:
<Объект> (обязательный)
Тип: СправочникОбъект.<Имя справочника>, ДокументОбъект.<Имя документа>, ПоследовательностьНаборЗаписей.<Имя последовательности>, ОтчетОбъект.<Имя отчета>, ОбработкаОбъект.<Имя обработки>, ВнешняяОбработка, ВнешнийОтчет, ПланВидовХарактеристикОбъект.<Имя плана видов характеристик>, ПланСчетовОбъект.<Имя плана счетов>, БизнесПроцессОбъект.<Имя бизнес-процесса>, ЗадачаОбъект.<Имя задачи>, РегистрСведенийНаборЗаписей.<Имя регистра сведений>, РегистрНакопленияНаборЗаписей.<Имя регистра накопления>, РегистрБухгалтерииНаборЗаписей.<Имя регистра бухгалтерии>, РегистрРасчетаНаборЗаписей.<Имя регистра расчета>, ПланОбменаОбъект.<Имя плана обмена>.
Прикладной объект, преобразованный из данных формы в значение, для которого необходимо установить соответствие с именем реквизита формы.
<ИмяРеквизита> (обязательный)
Тип: Строка.
Имя существующего реквизита формы.
Описание:
Метод автоматически устанавливает соответствие между реквизитами формы клиентского приложения и объектами вида СообщениеПользователю для последующей установки правильного соответствия сообщений и элементов управления формы. Для того, чтобы сообщение использовало данные соответствия объекта и имени реквизита, у него необходимо заполнить поле Данные. Соответствие может быть получено методом ПолучитьСоответствиеОбъектаИРеквизитаФормы. Получить соответствие можно до тех пор, пока существует объект, для которого оно зарегистрировано.
Доступность:
Сервер, толстый клиент, внешнее соединение.
Примечание:
Во внешнем соединении метод игнорируется.
Пример:
// Код в модуле формы клиентского приложения
Документ = ДанныеФормыВЗначение(Объект,
Тип("ДокументОбъект.ПоступлениеТМЦ"));
УстановитьСоответствиеОбъектаИРеквизитаФормы(Документ, "Объект");
....
Документ.Записать();
// Код в модуле документа
Процедура ОбработкаПроведения()
...
Сообщение = Новый СообщениеПользователю();
Сообщение.Текст = "В строке 11 табличной части " +
"""Номенклатура"" не хватает " +
НедостающееКоличество + " " +
ЕдиницаИзмеренияНоменклатуры;
Сообщение.Поле = "Номенклатура[10].Количество";
// Привязка объекта к реквизиту формы произойдет за счет
// установленного выше по стеку соответствия методом
// УстановитьСоответствиеОбъектаИРеквизитаФормы
Сообщение.УстановитьДанные(ЭтотОбъект);
Сообщение.Сообщить();
// Сообщение будет показано в форме и привязано к
// элементу управления связанного с полем
// Количество в 11-й строке табличной части
// Номенклатура.
...
КонецПроцедуры;
См. также:
СообщениеПользователю, свойство ПутьКДанным
Глобальный контекст, метод ПолучитьСоответствиеОбъектаИРеквизитаФормы
Использование в версии:
Доступен, начиная с версии 8.2.
Не рекомендуется использовать, начиная с версии 8.2.
Описание изменено в версии 8.3.17.
Методическая информация
Практические примеры
Прочитать старую привязку объекта к реквизиту и понять замену
На том же своём черновике разберём старые setter/getter: второй аргумент и результат — строка, не структура. Для новых решений используйте соседний современный урок.
Где и как запускать
Полный модуль управляемой формы УчебныеДанныеФорм85 → Обработки → УчебныеДанные85 → Формы → Пульт. Сервер с контекстом; в 1С не выполнялся.
Подготовка
Создайте НОВУЮ отдельную файловую базу платформы 8.5.1.1343 с конфигурацией УчебныеДанныеФорм85, совместимость НеИспользовать, управляемое приложение. Не используйте УТ, КА, УНФ, БП или рабочую базу. Здесь 1С не запускалась: runtimeVerifiedScenarios=0.
В своей конфигурации создайте обработку УчебныеДанные85. Реквизит Примечание — Строка (80); табличная часть Строки: Код — Строка (8), Товар — Строка (64), Количество — Число (10,0). Обработчики модуля объекта оставьте пустыми. Эти данные существуют в экземпляре обработки в памяти, не в справочнике или документе.
Создайте у обработки пустую управляемую основную форму Пульт. Для первых четырёх уроков удалите автоматически предложенный реквизит Объект и его элементы, если мастер их создал: у формы не должно быть основного реквизита. Не добавляйте учебные реквизиты и таблицы вручную — модуль создаёт их пакетно при создании формы.
В форме создайте команду Выполнить, действие Выполнить; перетащите команду на форму кнопкой. Событию ПриСозданииНаСервере назначьте одноимённую процедуру. Вставляйте ПОЛНЫЙ модуль выбранного урока целиком вместо предыдущего, не пять модулей одновременно и не внутрь обработчика.
Сделайте F7 и обновление только своей учебной базы; откройте Пульт из списка собственных обработок в тонком либо управляемом толстом клиенте. Не выбирайте команды сохранения обработки, печати или записи объектов. Кнопка вызывает сервер с контекстом формы, обычные ТаблицаЗначений и объект обработки на тонкий клиент не передаются.
Каждое нажатие первых четырёх уроков заново готовит собственные известные данные. Закройте и откройте Пульт после замены модуля. Подготовка регистра требуется только уроку исходного ключа; сохранение настроек допускается только в последнем уроке и только в новом стенде.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ПроверитьСвойКонтекст();
Реквизиты = Новый Массив;
Реквизиты.Добавить(Новый РеквизитФормы("Уч85Черновик", Новый ОписаниеТипов("ОбработкаОбъект.УчебныеДанные85")));
ЭтотОбъект.ИзменитьРеквизиты(Реквизиты);
Поле = ЭтотОбъект.Элементы.Добавить("Уч85Примечание", Тип("ПолеФормы"));
Поле.Вид = ВидПоляФормы.ПолеВвода;
Поле.ПутьКДанным = "Уч85Черновик.Примечание";
Поле.Заголовок = "Примечание собственного черновика";
Поле.ТолькоПросмотр = Истина;
Таблица = ЭтотОбъект.Элементы.Добавить("Уч85Строки", Тип("ТаблицаФормы"));
Таблица.ПутьКДанным = "Уч85Черновик.Строки";
Таблица.ТолькоПросмотр = Истина;
Для Каждого ИмяКолонки Из СтрРазделить("Код,Товар,Количество", ",") Цикл
Поле = ЭтотОбъект.Элементы.Добавить("Уч85" + ИмяКолонки, Тип("ПолеФормы"), Таблица);
Поле.Вид = ВидПоляФормы.ПолеВвода;
Поле.ПутьКДанным = "Уч85Черновик.Строки." + ИмяКолонки;
Поле.Заголовок = ИмяКолонки;
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура Выполнить(Команда)
Сообщить(ВыполнитьНаСервере());
КонецПроцедуры
&НаСервере
Функция ВыполнитьНаСервере()
ПроверитьСвойКонтекст();
Черновик = СоздатьСвойЧерновик();
ЭтотОбъект.ЗначениеВРеквизитФормы(Черновик, "Уч85Черновик");
Преобразованный = ДанныеФормыВЗначение(ЭтотОбъект.Уч85Черновик, Тип("ОбработкаОбъект.УчебныеДанные85"));
УстановитьСоответствиеОбъектаИРеквизитаФормы(Преобразованный, "Уч85Черновик");
ИмяРеквизита = ПолучитьСоответствиеОбъектаИРеквизитаФормы(Преобразованный);
Если ТипЗнч(ИмяРеквизита) <> Тип("Строка") Или ИмяРеквизита <> "Уч85Черновик" Тогда
ВызватьИсключение "Старый getter возвращает строку, не структуру с идентификатором формы";
КонецЕсли;
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Учебное чтение старого кода: в первой строке Книга, количество 3. Для нового кода используйте соответствие объекта и формы.";
Сообщение.Поле = "Строки[0].Количество";
Сообщение.УстановитьДанные(Преобразованный);
Сообщение.ИдентификаторНазначения = ЭтотОбъект.УникальныйИдентификатор;
Сообщение.Сообщить();
Возврат "Старое соответствие вернуло строку Уч85Черновик. Оба старых метода не рекомендованы с 8.2; объект не записывался.";
КонецФункции
&НаСервереБезКонтекста
Функция СоздатьСвойЧерновик()
Черновик = Обработки.УчебныеДанные85.Создать();
Черновик.Примечание = "Только учебный черновик";
Для Каждого СтрокаДанных Из СтрРазделить("A|Книга|3;B|Ручка|1;C|Коробка|2", ";") Цикл
Части = СтрРазделить(СтрокаДанных, "|");
Строка = Черновик.Строки.Добавить();
Строка.Код = Части[0];
Строка.Товар = Части[1];
Строка.Количество = Число(Части[2]);
КонецЦикла;
Возврат Черновик;
КонецФункции
&НаСервереБезКонтекста
Процедура ПроверитьСвойКонтекст()
Если Метаданные.РежимСовместимости <> Метаданные.СвойстваОбъектов.РежимСовместимости.НеИспользовать Тогда
ВызватьИсключение "Нужен собственный стенд УчебныеДанныеФорм85 платформы 8.5.1.1343";
КонецЕсли;
Если ТранзакцияАктивна() Тогда
ВызватьИсключение "Учебный вывод не должен выполняться внутри чужой транзакции";
КонецЕсли;
КонецПроцедурыРазбор по шагам
Урок нужен для чтения старых конфигураций, а не как рекомендованный способ нового кода. Оба метода помечены Не рекомендуется использовать, начиная с версии 8.2.
Создаём свою обработку в памяти и переносим её в реальный Уч85Черновик. Преобразованный аргумент — объект допустимого прикладного типа, не ТаблицаЗначений и не неизвестный внешний объект.
Старый УстановитьСоответствиеОбъектаИРеквизитаФормы получает существующее имя Уч85Черновик строкой. Структуру современной функции сюда подставлять нельзя.
Старый ПолучитьСоответствиеОбъектаИРеквизитаФормы возвращает Строка. Проверяем тип и точное имя; обращения к .ИдентификаторФормы у такого результата были бы ошибкой.
Сообщение получает данные преобразованного объекта через УстановитьДанные и внутренний путь Строки[0].Количество. В этом уроке первой остаётся Книга, перестановки нет.
Адресат сообщения явно задаётся UUID собственной текущей формы. Старое строковое соответствие само не содержит этот UUID; не объявляем его современным соответствием.
Для миграции переходите к соседнему уроку: setter принимает структуру с UUID/именем, getter возвращает её. Здесь сохранён работающий по контракту старый вызов, не выдуман новый синтаксис старой функции.
Как проверить результат
Будущий тест: F7, Пульт, Выполнить. Getter возвращает строку Уч85Черновик; три строки A,B,C остаются в исходном порядке.
В контрольном сообщении первая строка — Книга, количество 3. Это не результат записи/проведения и не настоящая бизнес-ошибка.
Проверьте сообщение в своей форме и поле Количество первой строки; подсветка и клиентский переход здесь не испытаны.
При переносе к современному API замените оба вызова и проверку результата вместе: строка и структура не взаимозаменяемы.
Два метода во внешнем соединении игнорируются. Пример не запускать как внешнюю обработку COM-соединения без настоящего контекста формы.
Ожидаемый результат
Будущий результат: старая строковая привязка разобрана на реальном своём объекте с явной рекомендацией замены.
На что обратить внимание
Deprecated не означает удалён из платформы, но применять его в новом коде не рекомендуется. Урок явно учебный для сопровождения старого кода.
Старый getter не гарантирует идентификацию экземпляра формы. UUID сообщения здесь берётся отдельно у реальной формы, не из строки соответствия.
Имя реквизита существует на своей форме. Произвольная строка из пользовательского ввода и чужой объект здесь не используются.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.