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