Переход на платформу 1С:Предприятие с других языков программирования часто сопровождается трудностями в понимании того, как взаимодействуют данные (объект) и их визуальное представление (форма). Особенно много вопросов возникает при работе с внешними обработками, так как они имеют свою специфику жизненного цикла данных. Разберем подробно, как инициализировать значения, почему возникают ошибки на клиенте и как работают стандартные обработчики событий.
В управляемом приложении 1С реализовано жесткое разделение ответственности. Проанализируем, за что отвечают Объект и Элементы:
Объект.РКОВидОперации = ..., мы меняем именно данные.Элементы.frВидОперацииРКО = Значение — это вызовет ошибку).Рассмотрим ситуацию: нам нужно, чтобы при открытии формы поле уже было заполнено. Достаточно ли просто изменить Объект? Да, платформа 1С автоматически синхронизирует данные реквизита с элементом формы. Если элемент связан с путем к данным Объект.РКОВидОперации, то любое изменение в Объект мгновенно отразится на экране при передаче управления с сервера на клиент.
Для инициализации параметров внешней обработки лучше всего подходит серверный обработчик события формы ПриСозданииНаСервере. Выясним причину, почему это делать на клиенте (в ПриОткрытии) неудобно или невозможно.
На клиенте отсутствуют менеджеры объектов. Вы не можете просто написать Перечисления.ВидыОперацийРКО.ВозвратПокупателю, так как клиентское приложение "не знает" о структуре базы данных в таком виде. Посмотрим на правильный пример инициализации на сервере:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Прямое присвоение значения из перечисления
Объект.РКОВидОперации = Перечисления.ВидыОперацийРКО.ВозвратПокупателю;
// Если нужно сделать поле доступным только для чтения
Элементы.frВидОперацииРКО.ТолькоПросмотр = Истина;
КонецПроцедуры
Если же вам крайне необходимо установить значение именно на клиенте, придется использовать специальную функцию ПредопределенноеЗначение(), которая получает ссылку по строковому имени:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
// Использование строкового пути для получения ссылки на клиенте
Объект.РКОВидОперации = ПредопределенноеЗначение("Перечисление.ВидыОперацийРКО.ВозвратПокупателю");
КонецПроцедуры
Важно понимать критическое отличие внешней обработки от документа или справочника: внешняя обработка не сохраняется в базе данных автоматически. Проанализируем последствия этого факта:
ПриЧтенииНаСервере для внешних обработок никогда не срабатывает, так как системе нечего читать из таблиц БД.Чтобы сохранить настройки между сеансами, мы можем использовать механизм автоматического сохранения данных формы. В свойствах формы установите флаг Автоматическое сохранение данных в настройках и выберите нужные реквизиты в списке Сохраняемые данные.
У начинающих разработчиков часто возникает вопрос: "Как 1С объединяет мой код в ПриСозданииНаСервере с кодом платформы?". Рассмотрим ситуацию подробнее.
В 1С нет классического ООП-наследования для форм в том виде, к которому привыкли разработчики на Delphi или C#. Когда вы создаете процедуру-обработчик, вы не "дописываете" код к существующему методу родителя. Вы создаете реализацию события с нуля.
Параметр СтандартнаяОбработка, который часто встречается в процедурах, управляет не выполнением "родительского кода", а поведением ядра системы после завершения вашей процедуры. Например:
ПередЗаписью установка СтандартнаяОбработка = Ложь отменит саму запись в базу.ОбработкаРасшифровки установка в Ложь предотвратит открытие стандартного меню выбора действий.Для события ПриСозданииНаСервере этот параметр используется редко, так как основная логика здесь — это ваша инициализация данных. Никакого inherited или extended вызывать не нужно.
Если вы хотите, чтобы предустановленное значение (например, вид операции) нельзя было изменить вручную, используйте свойства элементов формы. Разберем разницу между двумя подходами:
Проанализируем пример комплексной настройки формы:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// 1. Устанавливаем данные
Объект.РКОВидОперации = Перечисления.ВидыОперацийРКО.ВозвратПокупателю;
// 2. Настраиваем визуальное отображение
ПолеФормы = Элементы.frВидОперацииРКО;
ПолеФормы.ТолькоПросмотр = Истина;
ПолеФормы.Заголовок = "Тип операции (установлено по умолчанию)";
// 3. Можно также программно скрыть ненужные элементы
Элементы.ГруппаСложныхНастроек.Видимость = Ложь;
КонецПроцедуры
Используя этот подход, мы гарантируем стабильное отображение данных и корректную работу логики обработки как на сервере, так и на клиенте.