Заполняет элемент данными из какого-либо другого объекта. При этом в модуле плана видов характеристик вызывается процедура ОбработкаЗаполнения. В ней может размещаться алгоритм, заполняющий данные элемента из переданного в параметре значения. Для заполнения может использоваться значение любого типа. Разумеется, для этого типа в процедуре ОбработкаЗаполнения должен быть описан алгоритм заполнения.
Синтаксис
Заполнить(<ДанныеЗаполнения>)Полное описание, параметры и ограничения
ПланВидовХарактеристикОбъект.<Имя плана видов характеристик>.Заполнить (ChartOfCharacteristicTypesObject.<Chart of characteristic types name>.Fill)
ПланВидовХарактеристикОбъект.<Имя плана видов характеристик> (ChartOfCharacteristicTypesObject.<Chart of characteristic types name>)
Заполнить (Fill)
Доступен, начиная с версии 8.0.
Синтаксис:
Заполнить(<ДанныеЗаполнения>)
Параметры:
<ДанныеЗаполнения> (необязательный)
Тип: Произвольный.
Значение, на основании которого выполняется заполнение.
Описание:
Заполняет элемент данными из какого-либо другого объекта. При этом в модуле плана видов характеристик вызывается процедура ОбработкаЗаполнения. В ней может размещаться алгоритм, заполняющий данные элемента из переданного в параметре значения.
Для заполнения может использоваться значение любого типа. Разумеется, для этого типа в процедуре ОбработкаЗаполнения должен быть описан алгоритм заполнения.
Доступность:
Сервер, толстый клиент, внешнее соединение.
Использование в версии:
Доступен, начиная с версии 8.0.
Методическая информация
Практические примеры
Новая характеристика D: свой алгоритм заполнения и отказ при пустом ключе
Создаём новый объект своего плана, передаём известную структуру в Заполнить и показываем фактический алгоритм модуля объекта; запись базы не выполняется.
Где и как запускать
Полный обычный клиентский общий модуль УчебныеМенеджерыПланов85 → Общие модули → УчебныеМенеджеры85. Пульт отдельным модулем ниже; не выполнялся.
Подготовка
Используйте НОВУЮ собственную файловую базу 8.5.1.1343 с именем конфигурации УчебныеМенеджерыПланов85, совместимость НеИспользовать, обычное приложение и толстый клиент. Нет расширений, разделителей, общих реквизитов, обработчиков, фоновых прикладных заданий и других сеансов, меняющих записи. Рабочие БП/КА2/УТ запрещены. Стенд и код здесь не запускались: runtimeVerifiedScenarios=0.
Планы счетов → УчебныеСчета85: многоуровневый план, код Строка(10), маска пустая, наименование 100, уникальность кода включена, без предопределённых счетов, видов субконто и признаков учёта. Собственный реквизит УчебныйКлюч85: Строка(10), переменная длина, Индексировать. Модули пустые.
Планы видов характеристик → УчебныеСвойства85: иерархия групп и элементов, код Строка(10), наименование 100, тип характеристик только Строка(30), без предопределённых элементов. Реквизит УчебныйКлюч85: Строка(10), Индексировать, применяется к группам и элементам. Модули пустые.
В обоих планах вручную подготовьте ровно четыре записи: G — код 01, наименование Учебный родитель, ключ G, пустой родитель; A — код 10, наименование Учебный верхний A, ключ A, пустой родитель; B — код 30, наименование Учебный дочерний B, ключ B, родитель G; C — код 20, наименование Учебный верхний C, ключ C, пустой родитель. Все записи обычные, не предопределённые, без пометки удаления. У характеристик G — группа, остальные элементы. У счетов G — родительский счёт, а не группа.
В собственных счетах заранее вручную задайте Вид: G и A — Активный, B — Пассивный, C — АктивноПассивный. Забалансовый=Ложь, строк видов субконто нет. Сначала сохраните эту собственную подготовку. Код урока счёт не записывает и не проводит бухгалтерских операций.
Общий модуль УчебныеМенеджеры85: неглобальный, Клиент (обычное приложение)=Да, Сервер=Нет, Привилегированный=Нет, остальные клиентские флаги=Нет. Вставьте полный основной модуль одного выбранного урока. Обработка УчебныеМенеджеры85 → обычная форма Пульт → кнопка Выполнить → действие ВыполнитьНажатие. Полный модуль этой формы приведён отдельно.
Этот вариант выполняйте отдельно от read/lock-примера. Сначала вручную сохраните собственные четыре G/A/B/C, затем в модуль объекта выбранного плана УчебныеСвойства85/УчебныеСчета85 вставьте полный дополнительный модуль ниже. Остальные обработчики, подписки и расширения отсутствуют. УчебныйКлюч85: Проверка заполнения=НеПроверять, чтобы отказ пустого ключа демонстрировал именно собственный обработчик, а не неявную настройку.
Основной блок — полный обычный клиентский общий модуль УчебныеМенеджеры85; Пульт отдельно. Для характеристики проверка работает через ОбработкаПроверкиЗаполнения. Модули разных вариантов одновременно не вставлять; основная форма нового объекта не открывается.
F7 и обновление только новой собственной базы. Код создаёт только несохранённый D с кодом 40 и заданным именем; перед/после проверяет реальные четыре G/A/B/C. Никакие заполнение или проверки 1С здесь не выполнялись.
Процедура ВыполнитьПример() Экспорт
ПроверитьСвойКонтекст();
ПроверитьСвоюПодготовку();
Менеджер = ПланыВидовХарактеристик.УчебныеСвойства85;
Если Не Менеджер.НайтиПоРеквизиту("УчебныйКлюч85", "D").Пустая() Тогда
ВызватьИсключение "Свой D ещё не должен быть записан";
КонецЕсли;
Черновик = Менеджер.СоздатьЭлемент();
Если ТипЗнч(Черновик) <> Тип("ПланВидовХарактеристикОбъект.УчебныеСвойства85") Или Не Черновик.ЭтоНовый() Тогда
ВызватьИсключение "Нужен новый конкретный объект своего плана";
КонецЕсли;
Черновик.ТипЗначения = Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(30));
Данные = Новый Структура("Код,Наименование,УчебныйКлюч85", "40", "Учебный черновик D", "D");
Черновик.Заполнить(Данные);
Если Черновик.Код <> "40" Или Черновик.Наименование <> "Учебный черновик D"
Или Черновик.УчебныйКлюч85 <> "D" Или Не Черновик.ЭтоНовый() Тогда
ВызватьИсключение "Собственный обработчик должен заполнить три поля без записи";
КонецЕсли;
Если Не Черновик.ПроверитьЗаполнение() Тогда
ВызватьИсключение "Заполненный собственный D должен пройти проверку";
КонецЕсли;
Черновик.УчебныйКлюч85 = "";
Если Черновик.ПроверитьЗаполнение() Тогда
ВызватьИсключение "Свой обработчик проверки должен отклонить пустой ключ";
КонецЕсли;
Черновик.УчебныйКлюч85 = "D";
Если Не Черновик.ПроверитьЗаполнение() Тогда
ВызватьИсключение "После возврата собственного D проверка должна пройти";
КонецЕсли;
Если Не Менеджер.НайтиПоРеквизиту("УчебныйКлюч85", "D").Пустая() Тогда
ВызватьИсключение "Заполнить не должен записывать свой черновик";
КонецЕсли;
ПроверитьСвоюПодготовку();
Сообщить("Свой D заполнен только в памяти. В базе по-прежнему четыре G/A/B/C, Записать не вызывался.");
КонецПроцедуры
Процедура ПроверитьСвойКонтекст()
Если Метаданные.РежимСовместимости <> Метаданные.СвойстваОбъектов.РежимСовместимости.НеИспользовать Тогда
ВызватьИсключение "Нужен собственный стенд УчебныеМенеджерыПланов85 платформы 8.5.1.1343";
КонецЕсли;
Если ТранзакцияАктивна() Тогда
ВызватьИсключение "Учебный вывод не должен выполняться внутри чужой транзакции";
КонецЕсли;
КонецПроцедуры
Процедура ПроверитьСвоюПодготовку()
ПроверитьСвойКонтекст();
Менеджер = ПланыВидовХарактеристик.УчебныеСвойства85;
Родитель = Менеджер.НайтиПоРеквизиту("УчебныйКлюч85", "G");
Если Родитель.Пустая() Тогда
ВызватьИсключение "Не подготовлен собственный родитель G";
КонецЕсли;
Коды = Новый Структура("G,A,B,C", "01", "10", "30", "20");
Имена = Новый Структура("G,A,B,C", "Учебный родитель", "Учебный верхний A", "Учебный дочерний B", "Учебный верхний C");
Ключи = Новый Массив;
НачальныйУровень = Неопределено;
Выборка = Менеджер.ВыбратьИерархически(,,"Код Возр");
Пока Выборка.Следующий() Цикл
Ключ = Выборка.УчебныйКлюч85;
ОжидаемыйКод = Неопределено;
ОжидаемоеИмя = Неопределено;
Если Не Коды.Свойство(Ключ, ОжидаемыйКод) Или Не Имена.Свойство(Ключ, ОжидаемоеИмя)
Или Ключи.Найти(Ключ) <> Неопределено Тогда
ВызватьИсключение "Лишняя запись или повтор своего учебного ключа";
КонецЕсли;
Ключи.Добавить(Ключ);
Если Выборка.Код <> ОжидаемыйКод Или Выборка.Наименование <> ОжидаемоеИмя Тогда
ВызватьИсключение "Не совпали код или имя собственной подготовки";
КонецЕсли;
Если Выборка.Ссылка.Пустая() Или Выборка.Ссылка <> Менеджер.НайтиПоРеквизиту("УчебныйКлюч85", Ключ) Тогда
ВызватьИсключение "Выборка должна указывать на ту же собственную записанную ссылку";
КонецЕсли;
ОжидаемыйРодитель = Менеджер.ПустаяСсылка();
Если Ключ = "B" Тогда
ОжидаемыйРодитель = Родитель;
КонецЕсли;
Если Выборка.Родитель <> ОжидаемыйРодитель Или Выборка.ПометкаУдаления
Или Выборка.Предопределенный Или Выборка.ИмяПредопределенныхДанных <> "" Тогда
ВызватьИсключение "Нужны собственные обычные записи с подготовленной иерархией";
КонецЕсли;
ВерсияДо = Выборка.ВерсияДанных;
Если ТипЗнч(ВерсияДо) <> Тип("Строка") Тогда
ВызватьИсключение "ВерсияДанных выборки должна быть строкой, а не датой или бинарными данными";
КонецЕсли;
Уровень = Выборка.УровеньВВыборке();
Если НачальныйУровень = Неопределено Тогда
НачальныйУровень = Уровень;
КонецЕсли;
ОжидаемаяРазница = 0;
Если Ключ = "B" Тогда
ОжидаемаяРазница = 1;
КонецЕсли;
Если Уровень - НачальныйУровень <> ОжидаемаяРазница Тогда
ВызватьИсключение "B должен быть на один уровень глубже корневых G/A/C";
КонецЕсли;
Если Выборка.ЭтоГруппа <> (Ключ = "G") Тогда
ВызватьИсключение "G должен быть группой, A/B/C — элементами";
КонецЕсли;
Если Выборка.ЭтоГруппа Тогда
Сообщить("Группа G: ТипЗначения не используется как тип значения характеристики");
Иначе
ТипХарактеристики = Выборка.ТипЗначения;
Если ТипЗнч(ТипХарактеристики) <> Тип("ОписаниеТипов")
Или Не ТипХарактеристики.СодержитТип(Тип("Строка"))
Или ТипХарактеристики.СодержитТип(Тип("Число")) Тогда
ВызватьИсключение "Для собственного элемента нужен подготовленный строковый тип характеристики";
КонецЕсли;
Сообщить("Элемент " + Ключ + ": тип значения допускает строку, не число");
КонецЕсли;
Объект = Выборка.ПолучитьОбъект();
Если Объект = Неопределено Тогда
ВызватьИсключение "ПолучитьОбъект может вернуть Неопределено для исчезнувшей записи";
КонецЕсли;
Если Объект.Наименование <> ОжидаемоеИмя Тогда
ВызватьИсключение "Имя прочитанного объекта не совпало с подготовкой";
КонецЕсли;
Объект.Наименование = "Локальный черновик " + Ключ;
Если Объект.Наименование = Выборка.Наименование Тогда
ВызватьИсключение "Локальное изменение объекта не должно менять поле читаемой выборки";
КонецЕсли;
Повторная = Менеджер.Выбрать(,Новый Структура("УчебныйКлюч85", Ключ));
Если Не Повторная.Следующий() Тогда
ВызватьИсключение "Собственная запись исчезла при повторном чтении";
КонецЕсли;
Если Повторная.Наименование <> ОжидаемоеИмя Или Повторная.ВерсияДанных <> ВерсияДо Тогда
ВызватьИсключение "Новое чтение не подтвердило отсутствие изменения собственной записи";
КонецЕсли;
Объект.Наименование = ОжидаемоеИмя;
Сообщить(Ключ + ": " + Выборка.Код + " — " + Выборка.Наименование
+ "; уровень " + Строка(Уровень) + "; версия " + ВерсияДо + "; локальная правка не записана");
КонецЦикла;
Если СтрСоединить(Ключи, ",") <> "G,B,A,C" Тогда
ВызватьИсключение "Нужен полный иерархический обход G,B,A,C";
КонецЕсли;
Сообщить("Все четыре паспорта проверены. Записать не вызывался; изменение объекта осталось в памяти.");
КонецПроцедурыУчебныеМенеджеры85.Пульт
УчебныеМенеджерыПланов85 → Обработки → УчебныеМенеджеры85 → Пульт → Модуль
Полный модуль собственной обычной формы; не выполнялся.
Процедура ВыполнитьНажатие(Кнопка)
УчебныеМенеджеры85.ВыполнитьПример();
КонецПроцедурыУчебныеСвойства85.МодульОбъекта
УчебныеМенеджерыПланов85 → Планы видов характеристик → УчебныеСвойства85 → Модуль объекта
Полный модуль собственного объекта для явного заполнения нового черновика; не выполнялся.
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, ТекстЗаполнения, СтандартнаяОбработка)
ПроверитьСвойНовыйОбъект();
СтандартнаяОбработка = Ложь;
Если ТипЗнч(ДанныеЗаполнения) <> Тип("Структура") Тогда
ВызватьИсключение "Передайте собственную структуру из трёх строковых полей";
КонецЕсли;
Если ДанныеЗаполнения.Количество() <> 3 Или Не ДанныеЗаполнения.Свойство("Код", НовыйКод)
Или Не ДанныеЗаполнения.Свойство("Наименование", НовоеИмя)
Или Не ДанныеЗаполнения.Свойство("УчебныйКлюч85", НовыйКлюч) Тогда
ВызватьИсключение "Нужны только Код, Наименование, УчебныйКлюч85";
КонецЕсли;
Если ТипЗнч(НовыйКод) <> Тип("Строка") Или ТипЗнч(НовоеИмя) <> Тип("Строка")
Или ТипЗнч(НовыйКлюч) <> Тип("Строка") Тогда
ВызватьИсключение "Все три значения должны быть строками";
КонецЕсли;
Если НовыйКод <> "40" Или НовоеИмя <> "Учебный черновик D" Или НовыйКлюч <> "D" Тогда
ВызватьИсключение "В этом учебном опыте разрешены только собственные данные D";
КонецЕсли;
ЭтотОбъект.Код = НовыйКод;
ЭтотОбъект.Наименование = НовоеИмя;
ЭтотОбъект.УчебныйКлюч85 = НовыйКлюч;
КонецПроцедуры
Процедура ПроверитьСвойНовыйОбъект()
ПроверитьСвойКонтекст();
Если Не ЭтотОбъект.ЭтоНовый() Тогда
ВызватьИсключение "Этот учебный обработчик предназначен только для нового черновика";
КонецЕсли;
Если ЭтотОбъект.ЭтоГруппа Тогда
ВызватьИсключение "Заполняем только новый элемент, не группу";
КонецЕсли;
КонецПроцедуры
Процедура ПроверитьСвойКонтекст()
Если Метаданные.РежимСовместимости <> Метаданные.СвойстваОбъектов.РежимСовместимости.НеИспользовать Тогда
ВызватьИсключение "Нужен собственный стенд УчебныеМенеджерыПланов85 платформы 8.5.1.1343";
КонецЕсли;
Если ТранзакцияАктивна() Тогда
ВызватьИсключение "Учебный вывод не должен выполняться внутри чужой транзакции";
КонецЕсли;
КонецПроцедуры
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
ПроверитьСвойНовыйОбъект();
Если ТипЗнч(ПроверяемыеРеквизиты) <> Тип("Массив") Тогда
ВызватьИсключение "Платформа должна передать массив проверяемых реквизитов";
КонецЕсли;
Если ПустаяСтрока(ЭтотОбъект.УчебныйКлюч85) Тогда
Отказ = Истина;
Сообщить("УчебныйКлюч85 пуст: собственный черновик отклонён, записи нет.");
КонецЕсли;
КонецПроцедурыРазбор по шагам
СоздатьЭлемент/СоздатьСчет возвращает конкретный новый прикладной объект, не записывая его. Новый не создаётся выдуманным конструктором; проверяются точный тип и ЭтоНовый.
Заполнить получает собственную Структура(Код,Наименование,УчебныйКлюч85). Сам алгоритм находится в полном модуле объекта: проверяет структуру, три типа и точные учебные значения, затем присваивает три своих поля.
ОбработкаЗаполнения имеет ТРИ параметра: ДанныеЗаполнения, ТекстЗаполнения, СтандартнаяОбработка. СтандартнаяОбработка=False отключает автоматическое заполнение, не отменяя наш алгоритм. Здесь ТекстЗаполнения не используется; произвольный текст ввода не является основанием урока.
У характеристики ТипЗначения назначается только новому элементу и ограничен Строка(30), как в собственной подготовке. Группа этим обработчиком не заполняется. У счёта свойств ЭтоГруппа и ТипЗначения из характеристики нет.
В базе ключ D отсутствует до и после; четыре паспорта сохраняют исходные имена/версии/родителей. Заполнить не означает Записать, ввод на основании и копирование — другие способы вызова/другие события.
ПроверитьЗаполнение вызывает полный собственный ОбработкаПроверкиЗаполнения. С D результат True, с пустой строкой собственного ключа False, после возврата D True. Отказ выставляется в обработчике; массив системных проверяемых полей не очищается и остальные проверки не обходятся.
Как проверить результат
Будущий ручной тест: F7, Пульт, одна сессия собственной базы. В новом D проверить Код=40, Наименование=Учебный черновик D, УчебныйКлюч85=D, ЭтоНовый=True.
В модуле объекта проверить именно трёхпараметровый обработчик заполнения. Если его нет/не назначен, сравнения трёх полей должны выявить отличие; не выдавать общий вызов Заполнить за готовый неизвестный алгоритм.
Для характеристики проверить True/False/True при D/пусто/D и учебное сообщение отказа. Для счёта этот урок не заявляет вызов ПроверитьЗаполнение.
В стандартном списке своего плана по-прежнему ровно G/A/B/C, D нет. Черновик остаётся в памяти общего модуля; форму записи не открывать, Записать не добавлять.
Ожидаемый результат
Будущий опыт показывает явный обработчик заполнения собственного нового D; у характеристики также собственную проверку пустого ключа. Объект не записывается, запуск в 1С не выполнялся.
На что обратить внимание
ОбработкаЗаполнения по установленной статье имеет три параметра, не два. При копировании этот обработчик не вызывается.
Безопасный режим во время обычного обработчика заполнения/проверки отключается по native-замечанию. Это не песочница: применять только в собственном новом стенде; сюда не добавлять сеть или запись.
Предназначено только для нового несохранённого D. Для уже сохранённых G/A/B/C обработчик отказывается работать; подготовить их нужно до установки модуля данного варианта.
Отказ проверки не является удалением объекта или откатом записи: Записать вообще не вызывается. ПроверяемыеРеквизиты — системный массив, здесь его не очищаем.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.