Получает форму документа, которая содержит данный объект встроенного языка.
Синтаксис
ПолучитьФорму(<Форма>, <Владелец>, <КлючУникальности>)Примеры платформы
ВыбДокумент.ПолучитьФорму().Открыть();Полное описание, параметры и ограничения
ДокументОбъект.<Имя документа>.ПолучитьФорму (DocumentObject.<Document name>.GetForm)
ДокументОбъект.<Имя документа> (DocumentObject.<Document name>)
ПолучитьФорму (GetForm)
Доступен, начиная с версии 8.0.
Синтаксис:
ПолучитьФорму(<Форма>, <Владелец>, <КлючУникальности>)
Параметры:
<Форма> (необязательный)
Тип: Строка, ОбъектМетаданных: Форма.
Имя формы, как оно задано в конфигураторе, или объект описания метаданного требуемой формы. Если параметр не указан, то используется основная форма, заданная в конфигураторе.
<Владелец> (необязательный)
Тип: Форма; Элемент управления.
Объект, который будет являться владельцем открываемой формы.
<КлючУникальности> (необязательный)
Тип: Произвольный.
В данном параметре может быть задан некоторый ключ, значение которого будет использоваться для поиска уже открытых форм.
При поиске учитываются значения свойств открытых форм соответствующим значениям параметров метода. Если найдена открытая форма (по совпадению всех параметров), то она будет возвращена вместо новой формы.
Если из некой формы (один и тот же владелец) требуется открывать новые экземпляры другой формы, то при каждом вызове метода значение данного параметра должно быть уникально (в рамках соответствующих значений свойств открытых форм).
Значение параметра присваивается свойству открываемой формы КлючУникальности.
Следует учитывать, что при получении формы из "объекта" система получает форму для конкретного экземпляра объекта с учетом совокупности переданных параметров, в то время как для "ссылки" всегда существует только один объект в базе данных и форма получается одна (для одинаковой совокупности параметров).
Возвращаемое значение:
Тип: Форма, Неопределено.
Неопределено - если в обработчике ПриСозданииНаСервере установлен признак отказа от создания формы.
Описание:
Получает форму документа, которая содержит данный объект встроенного языка.
Доступность:
Толстый клиент.
Примечание:
Перед выполнением метода производится анализ параметров вызова и, при необходимости, происходит переадресация вызова глобальному контексту.
Пример:
ВыбДокумент.ПолучитьФорму().Открыть();
Использование в версии:
Доступен, начиная с версии 8.0.
Методическая информация
Практические примеры
Буфер счёта: contains-отбор, подвал и новая строка без записи
Один самостоятельный маршрут новой собственной File ИБ с полным источником и реальными ordinary формами; чужие ссылки и неизвестный исход останавливают опыт.
Где и как запускать
Полный модуль из подготовки; только Windows толстый обычный клиент собственной новой File CF. Сервер/управляемое приложение для этого интерфейса исключены.
Подготовка
Не переносите этот урок в рабочую конфигурацию. В будущем вручную создайте совершенно новую пустую File ИБ на отдельном Windows учебном стенде: C:\1c-labs\OwnOrdinaryInvoiceVariants85_e9fd8c96-8a35-4d02-b071-5118726a18d7\IB. Если этот путь уже существует, ничего не очищайте и не продолжайте. Строка File="точный путь"; сверяется буквально. Здесь никакие каталоги, CF, записи или окна 1С не создавались; все программы только написаны и статически проверены.
Конфигурация УчебныеВариантыСчета85: платформа 8.5.1.1343, РежимСовместимости НеИспользовать, ОсновнойРежимЗапуска ОбычноеПриложение. В Конфигураторе Сервис → Параметры → Общие → Редактирование конфигурации для режима запуска выберите «Управляемое приложение и обычное приложение». Это настройка редактора, а не свойство конфигурации SupportedRunModes. Урок запускают только в толстом обычном клиенте. Прикладная схема: один справочник, один ПВХ, один документ, одна обработка, три общих модуля, одна роль. Регистров, движений, заданий, разделителей, расширений и прочих прикладных объектов нет.
Справочник Товары85: неиерархический, без владельцев/табличных частей/предопределённых элементов. Код Строка12, Наименование80, автонумерацияНет, контроль уникальностиДа. Реквизиты Маркер85 Строка36 и Цена85 Число10,2. ПланВидовХарактеристик Коэффициенты85: иерархия групп и элементовДа, без табличных частей/предопределённых элементов; Код Строка12, Наименование80, автонумерацияНет, уникальностьДа. Тип значений характеристики только Число10,2. Реквизиты Маркер85 Строка36 и Коэффициент85 Число10,2, использование обоих ДляГруппИЭлементов. Код читает фактический ТипЗначения группы, не угадывает его значение по умолчанию; строгий числовой тип требуется у элементов.
Документ Счет85: Номер Строка12, автонумерацияНет, уникальностьДа, проведениеЗапретить, движенийНет; единственный реквизит Маркер85 Строка36. ТабличнаяЧасть Строки85: Код85 Строка8, Товар85 только СправочникСсылка.Товары85, Количество85 Число10,0, Цена85 и Сумма85 Число10,2. Начальные реквизиты не составные. Модули объектов и менеджеров пустые, кроме отдельно устанавливаемого запрета записи документа.
ДО установки startup и запрета записи документа вручную запишите собственную fixture стандартными формами: товар P85/Товар/Цена85=250; группу ПВХ G85/Коэффициенты/Коэффициент85=0/РодительПустой; два элемента в этой actual группе N85/Обычный/1 и D85/Половина/0.5 с ТипЗначения Число10,2. У всех Маркер85=e9fd8c96-8a35-4d02-b071-5118726a18d7, ПометкаУдаленияFalse, ПредопределенныйFalse. Счёт INV85 от 10.10.2026 12:00:00 с этим же маркером, ПроведенFalse: строки A85/свой P85/1/250/250, A850/тот же P85/1/250/250, B85/тот же P85/2/250/500. Ссылки выбирают на реально сохранённые свои объекты, не конструируют из UUID. Копий пока нет. Общий счёт1000; весь каталог250; сумма коэффициентов1.5.
Создайте единственный учебный пользователь Варианты85Ученик и единственную роль Варианты85 без RLS/привилегированности. Роль: чтение/просмотр/ввод по строке всех трёх объектов, добавление/изменение только своих каталогов и ПВХ, использование Пульт85, АктивныеПользователи для проверки подключения. Для собственного документа оставьте изменение/интерактивное редактирование, необходимое для буфера; это НЕ обещание readonly прав. Его запись запрещают оба полных BeforeWrite обработчика ниже. После ручного начального заполнения установите DOCUMENT_MODULE в Документы → Счет85 → Модуль объекта; native ПередЗаписью3 всегда ОтказTrue во всех контекстах и не вызывает клиентские общие модули. Закройте первоначальный клиент и Конфигуратор; в учебном опыте должно быть ровно одно своё подключение.
ОбщиеМодули ВариантыИсточник85/ВариантыКоэффициент85/ВариантыСчет85: ГлобальныйНет, КлиентОбычноеПриложениеДа, КлиентУправляемоеПриложениеНет, СерверНет, ВнешнееСоединениеНет, ПривилегированныйНет, повторное использованиеНеИспользовать. Целиком вставьте соответственно SOURCE/SELECTOR/INVOICE. Все callbacks, вызывающие их, принадлежат ordinary формам с native доступностью толстого клиента; ширококонтекстный DocumentObject.BeforeWrite не вызывает ни один такой помощник. Авторизация записи копии — частная переменная именно своей обычной формы, не общий серверно-клиентский Перем.
Справочники → Товары85 → Формы: конструктором создайте ОБЫЧНУЮ форму элемента Элемент85 и назначьте основной формой элемента. Основной реквизит Объект85 имеет только СправочникОбъект.Товары85, связывается с переданным native объектом. Добавьте реквизиты Подтверждение85 Булево и Статус85 Строка500; элементы флажок Подтверждение85 с начальными False, кнопка Сохранить85, поле Статус85 ТолькоПросмотрДа. Объектные поля показывайте только для просмотра, стандартные Записать/ОК не используйте. Целый CATALOG_FORM в модуль формы; ПриОткрытии→ПриОткрытии0, ПередЗаписью→ПередЗаписью1, Сохранить85.Нажатие→Сохранить85 с фактическим первым параметром Кнопка. Native extension возникает у этой формы объекта, не создаётся конструктором.
ПланыВидовХарактеристик → Коэффициенты85 → Формы: аналогично создайте обычную основную форму элемента Элемент85 с основным Объект85 только ПланВидовХарактеристикОбъект.Коэффициенты85, теми же собственными Подтверждение85/Статус85/Сохранить85. Целый PVH_FORM, те же события0/1/1. Отдельно конструктором создайте обычную основную форму списка Список85: основной реквизит Список85 только ПланВидовХарактеристикСписок.Коэффициенты85; табличное поле Виды85, Данные=Список85, колонка Наименование с Данные=Наименование, ТолькоПросмотрДа. Никаких пользовательских модулей или записывающих обработчиков списка. Форма выбора для данного урока — этот реальный native список с РежимВыбораTrue, не новый неизвестный List объект.
Документы → Счет85 → Формы: создайте обычную основную форму списка Список85: основной Список85 только ДокументСписок.Счет85; табличное поле Счета85 с Данные=Список85, колонка Номер с Данные=Номер, ТолькоПросмотрДа. Создайте обычную основную форму документа Документ85: основной Объект85 только ДокументОбъект.Счет85; табличное поле Строки85, Данные=Объект85.Строки85, пять колонок с именами и Данные Код85/Товар85/Количество85/Цена85/Сумма85. Сумма85 действительно числовая; настройте видимый подвал табличного поля. Начально ТолькоПросмотрДа. Добавьте Статус85 Строка500 readonly и кнопки Отбор85, ВсеСтроки85, РазрешитьBNEW85, ПроверитьBNEW85, УбратьBNEW85. Целый INVOICE_FORM: ПриОткрытии0, native ПередЗаписью3, Нажатие каждой кнопки1 на одноимённую процедуру. Стандартные команды записи не включайте; объектный запрет уже установлен.
Обработки → Пульт85 → Формы: обычная основная форма Пульт85. Реквизиты МаркерПульта85 Строка36, ИсходныйТовар85 только СправочникСсылка.Товары85, Группа85/Обычный85/Половина85 только ПланВидовХарактеристикСсылка.Коэффициенты85, ИсходныйСчет85 только ДокументСсылка.Счет85; ТоварСохранен85/ВидСохранен85/НеизвестныйИсход85 Булево, ЭтапКоэффициента85 Число2,0, Коэффициент85 только PVH ref, СчетВыбор85 только Doc ref, Статус85 Строка500. Служебные реквизиты не редактируются пользователем. Поля ввода Коэффициент85/СчетВыбор85: точные одноимённые Данные; у документа ввод по строке Номер, у коэффициента выбор элемента. Кнопки КопияТовара85, КопияВида85, ВыбратьКоэффициент85, СписокСчетов85, БуферСчета85. Целый HUB; ПриОткрытии0, ОбработкаВыбора2, Коэффициент85.ПриИзменении→КоэффициентПриИзменении85 с фактическим первым Элемент, все кнопки Нажатие1 на одноимённые процедуры. Все child формы принадлежат actual пульту, не полю ввода; указатель сохраняется ДО Open и genuine native события.
Целый APPLICATION вставьте в Модуль обычного приложения. ПриНачалеРаботыСистемы0 только открывает собственный новый пульт после полной проверки сохранённого источника. До его установки проверьте все имена, точные типы и события в Конфигураторе. Для будущего опыта запустите единственный толстый обычный клиент. Никакие callbacks не вызывайте вручную и не оборачивайте готовые модули в дополнительную процедуру.
Опыт записи копий — отдельное осознанное действие только в этой новой ИБ. Сначала КопияТовара85: native Copy возвращает несохранённый объект; initializer выставляет собственный P-COPY85/Копия товара/250, copy ref=P85, basis ref=INV85, enum АвтонумерацияВФорме.НеИспользовать. Флажок остаётся False: кнопка ничего не записывает без явного согласия. После ручного согласия ожидаются ровно2 товара/500. Аналогично КопияВида85 создаёт D-COPY85/Копия половины/0.5 под той же actual группой: ровно4 строки ПВХ/коэффициенты2. Любой native False, исключение или неполный readback означает неизвестный исход и СТОП; не повторяйте, не снимайте флаг, не обещайте откат. Закрытие копии без согласия не является командой записи; запрет формы остаётся fail-closed.
Опыт выбора не записывает БД: нажимайте ВыбратьКоэффициент85 и в реальном списке выбирайте Обычный, Половина, Обычный. Native ChoiceProcessing2 получает actual источник и ref; программное назначение Value в нём не имитирует OnChange, расчёт вызывается как обычный бизнес-помощник. Прямой ручной ввод/быстрый выбор поля обрабатывается genuine OnChange. Отмена списка не продвигает этап и не запускает расчёт. Группа/копия/неправильный этап не принимаются. Числа1000/500/1000 получаются из всех3 actual строк и значения выбранного элемента, а не из подставленной таблицы результата.
Опыт буфера: в поле СчетВыбор85 вручную найдите сохранённый INV85; откройте отдельный readonly список для стандартного значка и БуферСчета85 для actual DocumentObject.GetForm. Отбор85 ставит Contains(A85), поэтому видимы A85 И A850 на500, не только первая строка. ВсеСтроки85 даёт3/1000. Недоступность настройки Код85 ограничивает пользовательский редактор отбора, но программа изменяет действительный дочерний filter; readonly контейнеры не присваиваются. Числа статусной строки — независимый расчёт по буферу/actual фильтру, НЕ программное чтение native footer; его изображение сравните вручную.
Для отдельного упражнения РазрешитьBNEW85 включает редактирование только известного собственного буфера с фильтром A85. Вручную завершите новую строку BNEW/actual P85/1/250/250. Политика СообщатьОНесоответствииОтбору относится к окончанию интерактивного ввода: не обещаем автоматическое предупреждение от программного Add, координаты пикселей или блокировку добавления. ПроверитьBNEW85 требует4 actual строки/1250, при повторном полном запросе БД по-прежнему3/1000. УбратьBNEW85 удаляет только проверенную четвёртую строку именно своей object табличной части в памяти, не запись БД. Не изменяйте другие строки; неизвестный буфер — остановка без попытки «починить всё».
#Если ТолстыйКлиентОбычноеПриложение Тогда
Функция ОткрытьСписокСчетов85(Пульт) Экспорт
ВариантыИсточник85.ПаспортПульта85(Пульт);
Поле = Пульт.ЭлементыФормы.СчетВыбор85;
Если Пульт.НеизвестныйИсход85 Или ТипЗнч(Поле) <> Тип("ПолеВвода") Или Поле.Данные <> "СчетВыбор85" Тогда
ВызватьИсключение "Нужен собственный ввод документа по номеру";
КонецЕсли;
Ключ = Новый УникальныйИдентификатор;
Форма = Документы.Счет85.ПолучитьФормуСписка("Список85", Пульт, Ключ);
Если Форма = Неопределено Или ТипЗнч(Форма) <> Тип("Форма") Или Форма.Открыта() Или Форма.ВладелецФормы <> Пульт Или Форма.КлючУникальности <> Ключ Тогда
ВызватьИсключение "Нужен новый собственный список документов";
КонецЕсли;
Таблица = Форма.ЭлементыФормы.Счета85;
Если ТипЗнч(Таблица) <> Тип("ТабличноеПоле") Или Таблица.Данные <> "Список85"
Или ТипЗнч(Таблица.Значение) <> Тип("ДокументСписок.Счет85") Или Таблица.Значение <> Форма.Список85 Тогда
ВызватьИсключение "Нужен actual compiled document list";
КонецЕсли;
Колонка = Таблица.Колонки.Найти("Номер");
Если Колонка = Неопределено Или Колонка.Данные <> "Номер" Тогда
ВызватьИсключение "Не подтверждена колонка номера списка документов";
КонецЕсли;
Колонка.ОтображатьСтандартнуюКартинку = Истина;
Если Не Колонка.ОтображатьСтандартнуюКартинку Тогда
ВызватьИсключение "Не прочитана обратно policy стандартного статуса документа";
КонецЕсли;
Форма.ТолькоПросмотр = Истина;
ВариантыИсточник85.ПаспортПульта85(Пульт);
Возврат Форма;
КонецФункции
Функция ОткрытьБуфер85(Пульт) Экспорт
Паспорт = ВариантыИсточник85.ПаспортПульта85(Пульт);
Если Пульт.НеизвестныйИсход85 Или Пульт.СчетВыбор85 <> Паспорт.Счет Тогда
ВызватьИсключение "Вручную введите INV85 и подтвердите настоящий найденный ref счёта";
КонецЕсли;
Объект = Пульт.СчетВыбор85.ПолучитьОбъект();
ВариантыИсточник85.ПроверитьБуфер85(Объект, Паспорт);
Ключ = Новый УникальныйИдентификатор;
Форма = Объект.ПолучитьФорму("Документ85", Пульт, Ключ);
Если Форма = Неопределено Или ТипЗнч(Форма) <> Тип("Форма") Или Форма.Открыта() Или Форма.ВладелецФормы <> Пульт Или Форма.КлючУникальности <> Ключ
Или Форма.Объект85 <> Объект Тогда
ВызватьИсключение "Object.GetForm должен содержать именно собственный прочитанный экземпляр";
КонецЕсли;
Таблица = Форма.ЭлементыФормы.Строки85;
Если ТипЗнч(Таблица) <> Тип("ТабличноеПоле") Или Таблица.Данные <> "Объект85.Строки85" Или Таблица.Значение <> Объект.Строки85 Тогда
ВызватьИсключение "Не подтверждена actual табличная часть, не ValueTable";
КонецЕсли;
Колонка = Таблица.Колонки.Найти("Сумма85");
Если Колонка = Неопределено Или Колонка.Данные <> "Сумма85" Тогда
ВызватьИсключение "Нужна колонка собственного числового поля Сумма85";
КонецЕсли;
Колонка.ОтображатьИтогиВПодвале = Истина;
Таблица.ПроверкаОтображенияНовойСтроки = ВариантПроверкиОтображенияНовойСтроки.СообщатьОНесоответствииОтбору;
Таблица.ТолькоПросмотр = Истина;
Настройка = Таблица.НастройкаОтбораСтрок.Найти("Код85");
Если Настройка = Неопределено Или Настройка.Имя <> "Код85" Тогда
ВызватьИсключение "Не найден actual дочерний элемент readonly настройки отбора";
КонецЕсли;
Настройка.Доступность = Ложь;
Если Настройка.Доступность Или Не Колонка.ОтображатьИтогиВПодвале
Или Таблица.ПроверкаОтображенияНовойСтроки <> ВариантПроверкиОтображенияНовойСтроки.СообщатьОНесоответствииОтбору Тогда
ВызватьИсключение "Requested child/editor/footer policies не подтвердились";
КонецЕсли;
Для Каждого Отбор Из Таблица.ОтборСтрок Цикл
Если Отбор.Использование Тогда
ВызватьИсключение "Не очищаем неожиданно включённый отбор";
КонецЕсли;
КонецЦикла;
Возврат Форма;
КонецФункции
Процедура ПоказатьОтбор85(Форма, Использовать) Экспорт
Пульт = Форма.ВладелецФормы;
Пульт.ПроверитьСчетФорму85(Форма);
Если Пульт.НеизвестныйИсход85 Или ТипЗнч(Использовать) <> Тип("Булево") Тогда
ВызватьИсключение "Неизвестный этап своего фильтра";
КонецЕсли;
Паспорт = ВариантыИсточник85.ПаспортПульта85(Пульт);
ВариантыИсточник85.ПроверитьБуфер85(Форма.Объект85, Паспорт);
Таблица = Форма.ЭлементыФормы.Строки85;
Отбор = Таблица.ОтборСтрок.Найти("Код85");
Если Отбор = Неопределено Тогда
ВызватьИсключение "Нет actual элемента отбора Код85";
КонецЕсли;
Отбор.Установить("A85", Использовать);
Если Отбор.Использование <> Использовать Или Отбор.Значение <> "A85" Тогда
ВызватьИсключение "Не прочитан actual child filter";
КонецЕсли;
Для Каждого Другой Из Таблица.ОтборСтрок Цикл
Если Другой <> Отбор И Другой.Использование Тогда
ВызватьИсключение "Включён чужой отбор";
КонецЕсли;
КонецЦикла;
Количество = 0; Сумма = 0;
Для Каждого Р Из Форма.Объект85.Строки85 Цикл
Если Не Отбор.Использование Или СтрНайти(Р.Код85, Отбор.Значение) > 0 Тогда
Количество = Количество + 1;
Сумма = Сумма + Р.Сумма85;
КонецЕсли;
КонецЦикла;
Если Количество <> ?(Использовать, 2, 3) Или Сумма <> ?(Использовать, 500, 1000) Тогда
ВызватьИсключение "Contains-отбор реального буфера не подтвердил 2/500 или 3/1000";
КонецЕсли;
Форма.Статус85 = "Независимый расчёт по actual фильтру и строкам: " + Формат(Сумма, "ЧГ=0;ЧДЦ=2") + ". Полный сохранённый счёт: 1000. Native footer проверяйте вручную, это не его программное чтение.";
После = ВариантыИсточник85.ПаспортПульта85(Пульт);
ВариантыИсточник85.СравнитьСсылки85(Паспорт, После);
КонецПроцедуры
#КонецЕслиПолная проверка своего источника и всех строк
ОбщиеМодули → ВариантыИсточник85 → Модуль, целиком
КлиентОбычноеПриложениеДа; ServerНет/ExternalНет
#Если ТолстыйКлиентОбычноеПриложение Тогда
Процедура ПроверитьПоле85(МД, Имя, ТипПоля, Длина = 0, ДробнаяЧасть = 2)
Поле = МД.Реквизиты.Найти(Имя);
Если Поле = Неопределено Или Поле.Тип.Типы().Количество() <> 1 Или Не Поле.Тип.СодержитТип(ТипПоля) Тогда
ВызватьИсключение "Не подтверждён собственный тип поля " + Имя;
КонецЕсли;
Если ТипПоля = Тип("Строка") И Поле.Тип.КвалификаторыСтроки.Длина <> Длина Тогда
ВызватьИсключение "Неверная длина собственной строки";
КонецЕсли;
Если ТипПоля = Тип("Число") И (Поле.Тип.КвалификаторыЧисла.Разрядность <> 10 Или Поле.Тип.КвалификаторыЧисла.РазрядностьДробнойЧасти <> ДробнаяЧасть) Тогда
ВызватьИсключение "Неверная точность собственной суммы/количества";
КонецЕсли;
КонецПроцедуры
Процедура ПроверитьСхему85(ВнутриЗаписи)
Если СтрокаСоединенияИнформационнойБазы() <> "File=""C:\1c-labs\OwnOrdinaryInvoiceVariants85_e9fd8c96-8a35-4d02-b071-5118726a18d7\IB"";" Или Метаданные.РежимСовместимости <> Метаданные.СвойстваОбъектов.РежимСовместимости.НеИспользовать Или Метаданные.ОсновнойРежимЗапуска <> РежимЗапускаКлиентскогоПриложения.ОбычноеПриложение Или ТипЗнч(ВнутриЗаписи) <> Тип("Булево") Или Не ВнутриЗаписи И ТранзакцияАктивна() Тогда
ВызватьИсключение "Только точная новая собственная File ИБ без совместимости/транзакции";
КонецЕсли;
Если Метаданные.Справочники.Количество() <> 1 Или Метаданные.ПланыВидовХарактеристик.Количество() <> 1 Или Метаданные.Документы.Количество() <> 1
Или Метаданные.Обработки.Количество() <> 1 Или Метаданные.ОбщиеМодули.Количество() <> 3 Или Метаданные.Роли.Количество() <> 1
Или Метаданные.ОбщиеРеквизиты.Количество() <> 0 Или Метаданные.ПараметрыСеанса.Количество() <> 0
Или Метаданные.РегистрыСведений.Количество() <> 0 Или Метаданные.РегистрыНакопления.Количество() <> 0
Или Метаданные.РегистрыБухгалтерии.Количество() <> 0 Или Метаданные.РегистрыРасчета.Количество() <> 0
Или Метаданные.ПланыОбмена.Количество() <> 0 Или Метаданные.ПланыСчетов.Количество() <> 0 Или Метаданные.ПланыВидовРасчета.Количество() <> 0
Или Метаданные.БизнесПроцессы.Количество() <> 0 Или Метаданные.Задачи.Количество() <> 0 Или Метаданные.Константы.Количество() <> 0
Или Метаданные.Перечисления.Количество() <> 0 Или Метаданные.КритерииОтбора.Количество() <> 0 Или Метаданные.Отчеты.Количество() <> 0
Или Метаданные.ПодпискиНаСобытия.Количество() <> 0 Или Метаданные.РегламентныеЗадания.Количество() <> 0
Или Метаданные.ХранилищаНастроек.Количество() <> 0 Или Метаданные.ВнешниеИсточникиДанных.Количество() <> 0 Тогда
ВызватьИсключение "Чужая прикладная схема запрещена";
КонецЕсли;
Если РасширенияКонфигурации.Получить(, ИсточникРасширенийКонфигурации.БазаДанных).Количество() <> 0
Или РасширенияКонфигурации.Получить(, ИсточникРасширенийКонфигурации.СеансАктивные).Количество() <> 0
Или РасширенияКонфигурации.Получить(, ИсточникРасширенийКонфигурации.СеансОтключенные).Количество() <> 0 Тогда
ВызватьИсключение "Расширения запрещены";
КонецЕсли;
Товар = Метаданные.Справочники.Найти("Товары85");
Виды = Метаданные.ПланыВидовХарактеристик.Найти("Коэффициенты85");
Счет = Метаданные.Документы.Найти("Счет85");
Если Товар = Неопределено Или Виды = Неопределено Или Счет = Неопределено Или Товар.Иерархический Или Не Виды.Иерархический
Или Товар.Владельцы.Количество() <> 0 Или Товар.ТабличныеЧасти.Количество() <> 0 Или Виды.ТабличныеЧасти.Количество() <> 0
Или Товар.Реквизиты.Количество() <> 2 Или Виды.Реквизиты.Количество() <> 2 Или Счет.Реквизиты.Количество() <> 1
Или Счет.ТабличныеЧасти.Количество() <> 1 Или Счет.Движения.Количество() <> 0 Тогда
ВызватьИсключение "Не подтверждена конечная собственная схема";
КонецЕсли;
ПроверитьПоле85(Товар, "Маркер85", Тип("Строка"), 36);
ПроверитьПоле85(Товар, "Цена85", Тип("Число"));
ПроверитьПоле85(Виды, "Маркер85", Тип("Строка"), 36);
ПроверитьПоле85(Виды, "Коэффициент85", Тип("Число"));
ПроверитьПоле85(Счет, "Маркер85", Тип("Строка"), 36);
Часть = Счет.ТабличныеЧасти.Найти("Строки85");
Если Часть = Неопределено Или Часть.Реквизиты.Количество() <> 5 Тогда
ВызватьИсключение "Нужна собственная табличная часть из пяти полей";
КонецЕсли;
ПроверитьПоле85(Часть, "Код85", Тип("Строка"), 8);
ПроверитьПоле85(Часть, "Товар85", Тип("СправочникСсылка.Товары85"));
ПроверитьПоле85(Часть, "Количество85", Тип("Число"), 0, 0);
ПроверитьПоле85(Часть, "Цена85", Тип("Число"));
ПроверитьПоле85(Часть, "Сумма85", Тип("Число"));
Пользователь = ПользователиИнформационнойБазы.ТекущийПользователь();
Если Пользователь = Неопределено Или Пользователь.Имя <> "Варианты85Ученик" Или Не РольДоступна("Варианты85") Тогда
ВызватьИсключение "Нужен только собственный учебный пользователь";
КонецЕсли;
Соединения = ПолучитьСоединенияИнформационнойБазы();
Если ТипЗнч(Соединения) <> Тип("Массив") Или Соединения.Количество() <> 1 Тогда
ВызватьИсключение "Оставьте только своё учебное подключение";
КонецЕсли;
Если Соединения[0].НомерСоединения <> НомерСоединенияИнформационнойБазы() Или Соединения[0].Пользователь.УникальныйИдентификатор <> Пользователь.УникальныйИдентификатор Тогда
ВызватьИсключение "Подключение не совпало с текущим своим пользователем";
КонецЕсли;
КонецПроцедуры
Функция Прочитать85(КопияТовара = Ложь, КопияВида = Ложь, ВнутриЗаписи = Ложь) Экспорт
ПроверитьСхему85(ВнутриЗаписи);
Если ТипЗнч(КопияТовара) <> Тип("Булево") Или ТипЗнч(КопияВида) <> Тип("Булево") Тогда
ВызватьИсключение "Неизвестный этап собственных копий";
КонецЕсли;
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Ссылка,Код,Наименование,ПометкаУдаления,Предопределенный,Маркер85,Цена85 ИЗ Справочник.Товары85";
Товары = Запрос.Выполнить().Выгрузить();
Если Товары.Количество() <> ?(КопияТовара, 2, 1) Или Товары.Колонки.Количество() <> 7 Или Товары.Итог("Цена85") <> ?(КопияТовара, 500, 250) Тогда
ВызватьИсключение "Не подтвердился полный каталог и независимый итог 250/500";
КонецЕсли;
Товар = Неопределено; Копия = Неопределено;
Для Каждого Р Из Товары Цикл
Если ТипЗнч(Р.Ссылка) <> Тип("СправочникСсылка.Товары85") Или Р.Ссылка.Пустая() Или Р.ПометкаУдаления Или Р.Предопределенный
Или Р.Маркер85 <> "e9fd8c96-8a35-4d02-b071-5118726a18d7" Или ТипЗнч(Р.Цена85) <> Тип("Число") Или Р.Цена85 <> 250 Тогда
ВызватьИсключение "Чужой товар";
КонецЕсли;
Если Р.Код = "P85" И Р.Наименование = "Товар" И Товар = Неопределено Тогда
Товар = Р.Ссылка;
ИначеЕсли КопияТовара И Р.Код = "P-COPY85" И Р.Наименование = "Копия товара" И Копия = Неопределено Тогда
Копия = Р.Ссылка;
Иначе
ВызватьИсключение "Лишний/повторный товар";
КонецЕсли;
Объект = Р.Ссылка.ПолучитьОбъект();
Если ТипЗнч(Объект) <> Тип("СправочникОбъект.Товары85") Или Объект.Метаданные() <> Метаданные.Справочники.Товары85
Или Объект.Ссылка <> Р.Ссылка Или Объект.Код <> Р.Код Или Объект.Наименование <> Р.Наименование
Или Объект.ПометкаУдаления <> Р.ПометкаУдаления Или Объект.Предопределенный <> Р.Предопределенный
Или Объект.Маркер85 <> Р.Маркер85 Или Объект.Цена85 <> Р.Цена85 Тогда
ВызватьИсключение "Все поля actual товара не совпали с полным запросом";
КонецЕсли;
КонецЦикла;
Если Товар = Неопределено Или КопияТовара И (Копия = Неопределено Или Копия = Товар) Тогда
ВызватьИсключение "Не подтверждены различные свои ссылки товара и копии";
КонецЕсли;
Запрос.Текст = "ВЫБРАТЬ Ссылка,Код,Наименование,ЭтоГруппа,Родитель,ПометкаУдаления,Предопределенный,Маркер85,Коэффициент85,ТипЗначения ИЗ ПланВидовХарактеристик.Коэффициенты85";
Виды = Запрос.Выполнить().Выгрузить();
Если Виды.Количество() <> ?(КопияВида, 4, 3) Или Виды.Колонки.Количество() <> 10 Или Виды.Итог("Коэффициент85") <> ?(КопияВида, 2, 1.5) Тогда
ВызватьИсключение "Не подтвердился полный план с единственной группой и итогом коэффициентов 1.5/2";
КонецЕсли;
Группа = Неопределено; Обычный = Неопределено; Половина = Неопределено; КопияПоловины = Неопределено;
Для Каждого Р Из Виды Цикл
Если ТипЗнч(Р.Ссылка) <> Тип("ПланВидовХарактеристикСсылка.Коэффициенты85") Или Р.Ссылка.Пустая() Или Р.ПометкаУдаления Или Р.Предопределенный
Или Р.Маркер85 <> "e9fd8c96-8a35-4d02-b071-5118726a18d7" Или ТипЗнч(Р.Коэффициент85) <> Тип("Число") Тогда
ВызватьИсключение "Чужой вид характеристики";
КонецЕсли;
Если Р.ЭтоГруппа И Р.Код = "G85" И Р.Наименование = "Коэффициенты" И Р.Коэффициент85 = 0 И Р.Родитель.Пустая() И Группа = Неопределено Тогда
Группа = Р.Ссылка;
ИначеЕсли Не Р.ЭтоГруппа И Р.Код = "N85" И Р.Наименование = "Обычный" И Р.Коэффициент85 = 1 И Обычный = Неопределено Тогда
Обычный = Р.Ссылка;
ИначеЕсли Не Р.ЭтоГруппа И Р.Код = "D85" И Р.Наименование = "Половина" И Р.Коэффициент85 = 0.5 И Половина = Неопределено Тогда
Половина = Р.Ссылка;
ИначеЕсли КопияВида И Не Р.ЭтоГруппа И Р.Код = "D-COPY85" И Р.Наименование = "Копия половины" И Р.Коэффициент85 = 0.5 И КопияПоловины = Неопределено Тогда
КопияПоловины = Р.Ссылка;
Иначе
ВызватьИсключение "Лишний/повторный вид или группа";
КонецЕсли;
Объект = Р.Ссылка.ПолучитьОбъект();
Если ТипЗнч(Объект) <> Тип("ПланВидовХарактеристикОбъект.Коэффициенты85") Или Объект.Метаданные() <> Метаданные.ПланыВидовХарактеристик.Коэффициенты85
Или Объект.Ссылка <> Р.Ссылка Или Объект.Код <> Р.Код Или Объект.Наименование <> Р.Наименование Или Объект.ЭтоГруппа <> Р.ЭтоГруппа
Или Объект.Родитель <> Р.Родитель Или Объект.ПометкаУдаления <> Р.ПометкаУдаления Или Объект.Предопределенный <> Р.Предопределенный
Или Объект.Маркер85 <> Р.Маркер85 Или Объект.Коэффициент85 <> Р.Коэффициент85 Или Объект.ТипЗначения <> Р.ТипЗначения Тогда
ВызватьИсключение "Все поля actual вида не совпали с полным запросом";
КонецЕсли;
Если Не Р.ЭтоГруппа И (ТипЗнч(Р.ТипЗначения) <> Тип("ОписаниеТипов") Или Р.ТипЗначения.Типы().Количество() <> 1
Или Не Р.ТипЗначения.СодержитТип(Тип("Число")) Или Р.ТипЗначения.КвалификаторыЧисла.Разрядность <> 10 Или Р.ТипЗначения.КвалификаторыЧисла.РазрядностьДробнойЧасти <> 2) Тогда
ВызватьИсключение "Элемент должен иметь действительный числовой тип характеристики 10,2";
КонецЕсли;
КонецЦикла;
Если Группа = Неопределено Или Обычный = Неопределено Или Половина = Неопределено Или Обычный = Половина
Или КопияВида И (КопияПоловины = Неопределено Или КопияПоловины = Половина) Тогда
ВызватьИсключение "Не подтверждены все различные свои ссылки плана";
КонецЕсли;
Для Каждого Р Из Виды Цикл
Если Не Р.ЭтоГруппа И Р.Родитель <> Группа Тогда
ВызватьИсключение "Элемент принадлежит чужой группе";
КонецЕсли;
КонецЦикла;
Запрос.Текст = "ВЫБРАТЬ Ссылка,Номер,Дата,ПометкаУдаления,Проведен,Маркер85 ИЗ Документ.Счет85";
Счета = Запрос.Выполнить().Выгрузить();
Если Счета.Количество() <> 1 Или Счета.Колонки.Количество() <> 6 Тогда
ВызватьИсключение "Нужен ровно один свой счёт";
КонецЕсли;
Р = Счета[0];
Если ТипЗнч(Р.Ссылка) <> Тип("ДокументСсылка.Счет85") Или Р.Ссылка.Пустая() Или Р.Номер <> "INV85" Или Р.Дата <> Дата(2026, 10, 10, 12, 0, 0)
Или Р.ПометкаУдаления Или Р.Проведен Или Р.Маркер85 <> "e9fd8c96-8a35-4d02-b071-5118726a18d7" Тогда
ВызватьИсключение "Чужой счёт";
КонецЕсли;
Счет = Р.Ссылка;
Объект = Счет.ПолучитьОбъект();
Если ТипЗнч(Объект) <> Тип("ДокументОбъект.Счет85") Или Объект.Метаданные() <> Метаданные.Документы.Счет85
Или Объект.Ссылка <> Р.Ссылка Или Объект.Номер <> Р.Номер Или Объект.Дата <> Р.Дата
Или Объект.ПометкаУдаления <> Р.ПометкаУдаления Или Объект.Проведен <> Р.Проведен Или Объект.Маркер85 <> Р.Маркер85 Тогда
ВызватьИсключение "Все поля actual счёта не совпали с полным запросом";
КонецЕсли;
Запрос.Текст = "ВЫБРАТЬ Ссылка,НомерСтроки,Код85,Товар85,Количество85,Цена85,Сумма85 ИЗ Документ.Счет85.Строки85";
Строки = Запрос.Выполнить().Выгрузить();
Если Строки.Количество() <> 3 Или Строки.Колонки.Количество() <> 7 Или Строки.Итог("Сумма85") <> 1000 Или Объект.Строки85.Количество() <> 3 Тогда
ВызватьИсключение "Полная сохранённая табличная часть должна содержать три строки на 1000";
КонецЕсли;
Номера = Новый Массив;
Для Каждого Р Из Строки Цикл
Если Р.Ссылка <> Счет Или ТипЗнч(Р.НомерСтроки) <> Тип("Число") Или Р.НомерСтроки < 1 Или Р.НомерСтроки > 3 Или Номера.Найти(Р.НомерСтроки) <> Неопределено
Или Р.Товар85 <> Товар Или Р.Цена85 <> 250 Или Р.Количество85 <> ?(Р.НомерСтроки = 3, 2, 1)
Или Р.Код85 <> ?(Р.НомерСтроки = 1, "A85", ?(Р.НомерСтроки = 2, "A850", "B85")) Или Р.Сумма85 <> Р.Количество85 * Р.Цена85 Тогда
ВызватьИсключение "Чужая/дублированная строка или неверная фактическая арифметика";
КонецЕсли;
СтрокаОбъекта = Объект.Строки85[Р.НомерСтроки - 1];
Если СтрокаОбъекта.НомерСтроки <> Р.НомерСтроки Или СтрокаОбъекта.Код85 <> Р.Код85 Или СтрокаОбъекта.Товар85 <> Р.Товар85
Или СтрокаОбъекта.Количество85 <> Р.Количество85 Или СтрокаОбъекта.Цена85 <> Р.Цена85 Или СтрокаОбъекта.Сумма85 <> Р.Сумма85 Тогда
ВызватьИсключение "Каждое поле actual строки объекта должно совпасть с полным запросом";
КонецЕсли;
Номера.Добавить(Р.НомерСтроки);
КонецЦикла;
Возврат Новый Структура("Товар,КопияТовара,Группа,Обычный,Половина,КопияВида,Счет,Строки", Товар, Копия, Группа, Обычный, Половина, КопияПоловины, Счет, Строки);
КонецФункции
Функция ПаспортПульта85(Пульт, ВнутриЗаписи = Ложь) Экспорт
Если ТипЗнч(Пульт) <> Тип("Форма") Или Пульт.МаркерПульта85 <> "e9fd8c96-8a35-4d02-b071-5118726a18d7"
Или ТипЗнч(Пульт.ТоварСохранен85) <> Тип("Булево") Или ТипЗнч(Пульт.ВидСохранен85) <> Тип("Булево") Или ТипЗнч(Пульт.НеизвестныйИсход85) <> Тип("Булево") Тогда
ВызватьИсключение "Нужен действительный подготовленный собственный пульт";
КонецЕсли;
Паспорт = Прочитать85(Пульт.ТоварСохранен85, Пульт.ВидСохранен85, ВнутриЗаписи);
Если Паспорт.Товар <> Пульт.ИсходныйТовар85 Или Паспорт.Обычный <> Пульт.Обычный85 Или Паспорт.Половина <> Пульт.Половина85
Или Паспорт.Группа <> Пульт.Группа85 Или Паспорт.Счет <> Пульт.ИсходныйСчет85 Тогда
ВызватьИсключение "Сменились actual первоначальные ссылки собственной fixture";
КонецЕсли;
Возврат Паспорт;
КонецФункции
Процедура СравнитьСсылки85(До, После) Экспорт
Для Каждого Имя Из СтрРазделить("Товар,Группа,Обычный,Половина,Счет", ",") Цикл
Если До[Имя] <> После[Имя] Тогда
ВызватьИсключение "Заменена первоначальная actual ссылка " + Имя;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Процедура ПроверитьБуфер85(Объект, Паспорт, НоваяСтрока = Ложь) Экспорт
Если ТипЗнч(Объект) <> Тип("ДокументОбъект.Счет85") Или Объект.Ссылка <> Паспорт.Счет Или Объект.Номер <> "INV85"
Или Объект.Дата <> Дата(2026, 10, 10, 12, 0, 0) Или Объект.ПометкаУдаления Или Объект.Проведен
Или Объект.Маркер85 <> "e9fd8c96-8a35-4d02-b071-5118726a18d7" Или ТипЗнч(НоваяСтрока) <> Тип("Булево")
Или Объект.Строки85.Количество() <> ?(НоваяСтрока, 4, 3) Тогда
ВызватьИсключение "Неизвестный буфер своего документа";
КонецЕсли;
Для Каждого Р Из Объект.Строки85 Цикл
Если Р.НомерСтроки <= 3 Тогда
Совпадения = Паспорт.Строки.НайтиСтроки(Новый Структура("НомерСтроки", Р.НомерСтроки));
Если Совпадения.Количество() <> 1 Или Р.Код85 <> Совпадения[0].Код85 Или Р.Товар85 <> Совпадения[0].Товар85
Или Р.Количество85 <> Совпадения[0].Количество85 Или Р.Цена85 <> Совпадения[0].Цена85 Или Р.Сумма85 <> Совпадения[0].Сумма85 Тогда
ВызватьИсключение "Изменена исходная строка собственного буфера";
КонецЕсли;
ИначеЕсли Не НоваяСтрока Или Р.НомерСтроки <> 4 Или Р.Код85 <> "BNEW" Или Р.Товар85 <> Паспорт.Товар Или Р.Количество85 <> 1 Или Р.Цена85 <> 250 Или Р.Сумма85 <> 250 Тогда
ВызватьИсключение "Допускается только явно подготовленная новая строка BNEW в памяти";
КонецЕсли;
КонецЦикла;
Если Объект.Строки85.Итог("Сумма85") <> ?(НоваяСтрока, 1250, 1000) Тогда
ВызватьИсключение "Не подтвердился независимый итог полного своего буфера";
КонецЕсли;
КонецПроцедуры
#КонецЕслиПолная форма собственной копии товара
Справочники → Товары85 → Формы → Элемент85 → Модуль
Толстый обычный клиент; native BeforeWrite1
Перем Инициализирован85, НеизвестныйИсходФормы85, РазрешенаЗапись85;
Процедура ПодготовитьКопию85() Экспорт
Если Инициализирован85 <> Неопределено Тогда
ВызватьИсключение "Повторная инициализация не снимает неизвестный исход";
КонецЕсли;
НеизвестныйИсходФормы85 = Истина;
РазрешенаЗапись85 = Ложь;
Пульт = ВладелецФормы;
Пульт.ПроверитьТоварФорму85(ЭтаФорма);
Если Пульт.НеизвестныйИсход85 Или Пульт.ТоварСохранен85 Тогда
ВызватьИсключение "Копия уже сохранена или предыдущий этап неизвестен";
КонецЕсли;
Паспорт = ВариантыИсточник85.ПаспортПульта85(Пульт);
Если ТипЗнч(Объект85) <> Тип("СправочникОбъект.Товары85") Или Не Объект85.ЭтоНовый() Или Объект85.Ссылка = Паспорт.Товар
Или Объект85.Маркер85 <> "e9fd8c96-8a35-4d02-b071-5118726a18d7" Или Объект85.Цена85 <> 250 Тогда
ВызватьИсключение "Нужна actual собственная unsaved native копия";
КонецЕсли;
Объект85.Код = "P-COPY85";
Объект85.Наименование = "Копия товара";
ЭтаФорма.ПараметрОбъектКопирования = Паспорт.Товар;
ЭтаФорма.ПараметрОснование = Паспорт.Счет;
ЭтаФорма.Автонумерация = АвтонумерацияВФорме.НеИспользовать;
Подтверждение85 = Ложь;
ПроверитьКопию85(Ложь);
Инициализирован85 = Истина;
НеизвестныйИсходФормы85 = Ложь;
КонецПроцедуры
Процедура ПроверитьКопию85(ВнутриЗаписи)
Пульт = ВладелецФормы;
Пульт.ПроверитьТоварФорму85(ЭтаФорма);
Паспорт = ВариантыИсточник85.ПаспортПульта85(Пульт, ВнутриЗаписи);
Если Пульт.ТоварСохранен85 Или ТипЗнч(Объект85) <> Тип("СправочникОбъект.Товары85") Или Не Объект85.ЭтоНовый()
Или Объект85.Код <> "P-COPY85" Или Объект85.Наименование <> "Копия товара" Или Объект85.Цена85 <> 250
Или Объект85.Маркер85 <> "e9fd8c96-8a35-4d02-b071-5118726a18d7" Или Объект85.ПометкаУдаления Или Объект85.Предопределенный
Или ЭтаФорма.ПараметрОбъектКопирования <> Паспорт.Товар Или ЭтаФорма.ПараметрОснование <> Паспорт.Счет
Или ЭтаФорма.Автонумерация <> АвтонумерацияВФорме.НеИспользовать Тогда
ВызватьИсключение "Не совпали actual объект, copy/basis параметры или enum policy";
КонецЕсли;
КонецПроцедуры
Процедура ПриОткрытии()
Если Инициализирован85 <> Истина Или НеизвестныйИсходФормы85 <> Ложь Тогда
ВызватьИсключение "Не выполнена единственная собственная подготовка";
КонецЕсли;
ПроверитьКопию85(Ложь);
КонецПроцедуры
Процедура Сохранить85(Кнопка)
Если Кнопка <> ЭлементыФормы.Сохранить85 Или Кнопка.Имя <> "Сохранить85" Или НеизвестныйИсходФормы85 <> Ложь Тогда
ВызватьИсключение "Только собственная кнопка и известный этап";
КонецЕсли;
Если ТипЗнч(Подтверждение85) <> Тип("Булево") Или Не Подтверждение85 Тогда
Возврат;
КонецЕсли;
Пульт = ВладелецФормы;
Если Пульт.НеизвестныйИсход85 Тогда
ВызватьИсключение "Пульт уже остановлен";
КонецЕсли;
ПроверитьКопию85(Ложь);
До = ВариантыИсточник85.ПаспортПульта85(Пульт);
НеизвестныйИсходФормы85 = Истина;
Пульт.НеизвестныйИсход85 = Истина;
РазрешенаЗапись85 = Истина;
Попытка
Если Не ЭтаФорма.ЗаписатьВФорме() Тогда
ВызватьИсключение "WriteInForm вернул Ложь; не повторять и не предполагать откат";
КонецЕсли;
РазрешенаЗапись85 = Ложь;
После = ВариантыИсточник85.Прочитать85(Истина, Пульт.ВидСохранен85);
ВариантыИсточник85.СравнитьСсылки85(До, После);
Если После.КопияТовара <> Объект85.Ссылка Или Объект85.ЭтоНовый() Тогда
ВызватьИсключение "Сохранённый ref не совпал с actual объектом формы";
КонецЕсли;
Пульт.ТоварСохранен85 = Истина;
ВариантыИсточник85.ПаспортПульта85(Пульт);
Подтверждение85 = Ложь;
НеизвестныйИсходФормы85 = Ложь;
Пульт.НеизвестныйИсход85 = Ложь;
ЭлементыФормы.Сохранить85.Доступность = Ложь;
Статус85 = "Сохранена ровно своя копия; полный источник и первоначальные ссылки подтверждены.";
Исключение
РазрешенаЗапись85 = Ложь;
НеизвестныйИсходФормы85 = Истина;
Пульт.НеизвестныйИсход85 = Истина;
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
Процедура ПередЗаписью(Отказ)
Отказ = Истина;
Если РазрешенаЗапись85 <> Истина Тогда
Возврат;
КонецЕсли;
РазрешенаЗапись85 = Ложь;
ПроверитьКопию85(Истина);
Отказ = Ложь;
КонецПроцедурыПолная форма собственной копии коэффициента
ПланыВидовХарактеристик → Коэффициенты85 → Формы → Элемент85 → Модуль
Толстый обычный клиент; native BeforeWrite1
Перем Инициализирован85, НеизвестныйИсходФормы85, РазрешенаЗапись85;
Процедура ПодготовитьКопию85() Экспорт
Если Инициализирован85 <> Неопределено Тогда
ВызватьИсключение "Повторная инициализация не снимает неизвестный исход";
КонецЕсли;
НеизвестныйИсходФормы85 = Истина;
РазрешенаЗапись85 = Ложь;
Пульт = ВладелецФормы;
Пульт.ПроверитьВидФорму85(ЭтаФорма);
Если Пульт.НеизвестныйИсход85 Или Пульт.ВидСохранен85 Тогда
ВызватьИсключение "Копия уже сохранена или предыдущий этап неизвестен";
КонецЕсли;
Паспорт = ВариантыИсточник85.ПаспортПульта85(Пульт);
Если ТипЗнч(Объект85) <> Тип("ПланВидовХарактеристикОбъект.Коэффициенты85") Или Не Объект85.ЭтоНовый() Или Объект85.Ссылка = Паспорт.Половина
Или Объект85.Маркер85 <> "e9fd8c96-8a35-4d02-b071-5118726a18d7" Или Объект85.Коэффициент85 <> 0.5 Или Объект85.ЭтоГруппа Или Объект85.Родитель <> Паспорт.Группа Или Не Объект85.ТипЗначения.СодержитТип(Тип("Число")) Тогда
ВызватьИсключение "Нужна actual собственная unsaved native копия";
КонецЕсли;
Объект85.Код = "D-COPY85";
Объект85.Наименование = "Копия половины";
ЭтаФорма.ПараметрОбъектКопирования = Паспорт.Половина;
ЭтаФорма.ПараметрОснование = Паспорт.Счет;
ЭтаФорма.Автонумерация = АвтонумерацияВФорме.НеИспользовать;
Подтверждение85 = Ложь;
ПроверитьКопию85(Ложь);
Инициализирован85 = Истина;
НеизвестныйИсходФормы85 = Ложь;
КонецПроцедуры
Процедура ПроверитьКопию85(ВнутриЗаписи)
Пульт = ВладелецФормы;
Пульт.ПроверитьВидФорму85(ЭтаФорма);
Паспорт = ВариантыИсточник85.ПаспортПульта85(Пульт, ВнутриЗаписи);
Если Пульт.ВидСохранен85 Или ТипЗнч(Объект85) <> Тип("ПланВидовХарактеристикОбъект.Коэффициенты85") Или Не Объект85.ЭтоНовый()
Или Объект85.Код <> "D-COPY85" Или Объект85.Наименование <> "Копия половины" Или Объект85.Коэффициент85 <> 0.5
Или Объект85.Маркер85 <> "e9fd8c96-8a35-4d02-b071-5118726a18d7" Или Объект85.ПометкаУдаления Или Объект85.Предопределенный Или Объект85.ЭтоГруппа Или Объект85.Родитель <> Паспорт.Группа Или Не Объект85.ТипЗначения.СодержитТип(Тип("Число"))
Или ЭтаФорма.ПараметрОбъектКопирования <> Паспорт.Половина Или ЭтаФорма.ПараметрОснование <> Паспорт.Счет
Или ЭтаФорма.Автонумерация <> АвтонумерацияВФорме.НеИспользовать Тогда
ВызватьИсключение "Не совпали actual объект, copy/basis параметры или enum policy";
КонецЕсли;
КонецПроцедуры
Процедура ПриОткрытии()
Если Инициализирован85 <> Истина Или НеизвестныйИсходФормы85 <> Ложь Тогда
ВызватьИсключение "Не выполнена единственная собственная подготовка";
КонецЕсли;
ПроверитьКопию85(Ложь);
КонецПроцедуры
Процедура Сохранить85(Кнопка)
Если Кнопка <> ЭлементыФормы.Сохранить85 Или Кнопка.Имя <> "Сохранить85" Или НеизвестныйИсходФормы85 <> Ложь Тогда
ВызватьИсключение "Только собственная кнопка и известный этап";
КонецЕсли;
Если ТипЗнч(Подтверждение85) <> Тип("Булево") Или Не Подтверждение85 Тогда
Возврат;
КонецЕсли;
Пульт = ВладелецФормы;
Если Пульт.НеизвестныйИсход85 Тогда
ВызватьИсключение "Пульт уже остановлен";
КонецЕсли;
ПроверитьКопию85(Ложь);
До = ВариантыИсточник85.ПаспортПульта85(Пульт);
НеизвестныйИсходФормы85 = Истина;
Пульт.НеизвестныйИсход85 = Истина;
РазрешенаЗапись85 = Истина;
Попытка
Если Не ЭтаФорма.ЗаписатьВФорме() Тогда
ВызватьИсключение "WriteInForm вернул Ложь; не повторять и не предполагать откат";
КонецЕсли;
РазрешенаЗапись85 = Ложь;
После = ВариантыИсточник85.Прочитать85(Пульт.ТоварСохранен85, Истина);
ВариантыИсточник85.СравнитьСсылки85(До, После);
Если После.КопияВида <> Объект85.Ссылка Или Объект85.ЭтоНовый() Тогда
ВызватьИсключение "Сохранённый ref не совпал с actual объектом формы";
КонецЕсли;
Пульт.ВидСохранен85 = Истина;
ВариантыИсточник85.ПаспортПульта85(Пульт);
Подтверждение85 = Ложь;
НеизвестныйИсходФормы85 = Ложь;
Пульт.НеизвестныйИсход85 = Ложь;
ЭлементыФормы.Сохранить85.Доступность = Ложь;
Статус85 = "Сохранена ровно своя копия; полный источник и первоначальные ссылки подтверждены.";
Исключение
РазрешенаЗапись85 = Ложь;
НеизвестныйИсходФормы85 = Истина;
Пульт.НеизвестныйИсход85 = Истина;
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
Процедура ПередЗаписью(Отказ)
Отказ = Истина;
Если РазрешенаЗапись85 <> Истина Тогда
Возврат;
КонецЕсли;
РазрешенаЗапись85 = Ложь;
ПроверитьКопию85(Истина);
Отказ = Ложь;
КонецПроцедурыПолный реальный выбор коэффициента и расчёт
ОбщиеМодули → ВариантыКоэффициент85 → Модуль, целиком
ClientOrdinaryДа, ServerНет
#Если ТолстыйКлиентОбычноеПриложение Тогда
Функция ОткрытьКоэффициенты85(Пульт) Экспорт
Паспорт = ВариантыИсточник85.ПаспортПульта85(Пульт);
Если Пульт.НеизвестныйИсход85 Тогда
ВызватьИсключение "После неизвестного исхода не открываем новый интерфейс";
КонецЕсли;
Поле = Пульт.ЭлементыФормы.Коэффициент85;
Если ТипЗнч(Поле) <> Тип("ПолеВвода") Или Поле.Имя <> "Коэффициент85" Или Поле.Данные <> "Коэффициент85" Тогда
ВызватьИсключение "Нужно собственное поле ввода конкретного PVH ref";
КонецЕсли;
Поле.БыстрыйВыбор = Истина;
Поле.ВыборГруппИЭлементов = ИспользованиеГруппИЭлементов.Элементы;
Ключ = Новый УникальныйИдентификатор;
Форма = ПланыВидовХарактеристик.Коэффициенты85.ПолучитьФормуСписка("Список85", Пульт, Ключ);
Если Форма = Неопределено Или ТипЗнч(Форма) <> Тип("Форма") Или Форма.Открыта() Или Форма.ВладелецФормы <> Пульт Или Форма.КлючУникальности <> Ключ Тогда
ВызватьИсключение "Нужна новая собственная native форма списка";
КонецЕсли;
Таблица = Форма.ЭлементыФормы.Виды85;
Если ТипЗнч(Таблица) <> Тип("ТабличноеПоле") Или Таблица.Данные <> "Список85"
Или ТипЗнч(Таблица.Значение) <> Тип("ПланВидовХарактеристикСписок.Коэффициенты85") Или Таблица.Значение <> Форма.Список85 Тогда
ВызватьИсключение "Не подтверждён actual compiled PVH list";
КонецЕсли;
Колонка = Таблица.Колонки.Найти("Наименование");
Если Колонка = Неопределено Или ТипЗнч(Колонка) <> Тип("КолонкаТабличногоПоля") Или Колонка.Данные <> "Наименование" Тогда
ВызватьИсключение "Не найдена собственная list-column";
КонецЕсли;
Колонка.ОтображатьСтандартнуюКартинку = Истина;
Форма.РежимВыбора = Истина;
Форма.ПараметрВыборГруппИЭлементов = ИспользованиеГруппИЭлементов.Элементы;
Форма.ПараметрТекущаяСтрока = ?(Пульт.ЭтапКоэффициента85 = 2, Паспорт.Половина, Паспорт.Обычный);
Если Не Поле.БыстрыйВыбор Или Поле.ВыборГруппИЭлементов <> ИспользованиеГруппИЭлементов.Элементы
Или Не Колонка.ОтображатьСтандартнуюКартинку Или Не Форма.РежимВыбора
Или Форма.ПараметрВыборГруппИЭлементов <> ИспользованиеГруппИЭлементов.Элементы
Или Форма.ПараметрТекущаяСтрока <> ?(Пульт.ЭтапКоэффициента85 = 2, Паспорт.Половина, Паспорт.Обычный) Тогда
ВызватьИсключение "Native выбор/позиционирование/icon policy не прочитаны обратно";
КонецЕсли;
Возврат Форма;
КонецФункции
Процедура Рассчитать85(Пульт) Экспорт
Если Пульт.НеизвестныйИсход85 Или Пульт.ЭтапКоэффициента85 < 1 Или Пульт.ЭтапКоэффициента85 > 3 Тогда
ВызватьИсключение "Недопустимый этап выбора";
КонецЕсли;
Паспорт = ВариантыИсточник85.ПаспортПульта85(Пульт);
Поле = Пульт.ЭлементыФормы.Коэффициент85;
Ссылка = Поле.Значение;
Если ТипЗнч(Ссылка) <> Тип("ПланВидовХарактеристикСсылка.Коэффициенты85") Или Ссылка.Пустая()
Или Ссылка <> ?(Пульт.ЭтапКоэффициента85 = 2, Паспорт.Половина, Паспорт.Обычный) Тогда
Пульт.Статус85 = "На этом этапе вручную выберите " + ?(Пульт.ЭтапКоэффициента85 = 2, "Половина", "Обычный") + ". Группа/копия/чужой ref не вычисляются.";
Возврат;
КонецЕсли;
Вид = Ссылка.ПолучитьОбъект();
Если ТипЗнч(Вид) <> Тип("ПланВидовХарактеристикОбъект.Коэффициенты85") Или Вид.Ссылка <> Ссылка Или Вид.ЭтоГруппа
Или Вид.Родитель <> Паспорт.Группа Или Вид.Маркер85 <> "e9fd8c96-8a35-4d02-b071-5118726a18d7"
Или Вид.Коэффициент85 <> ?(Пульт.ЭтапКоэффициента85 = 2, 0.5, 1) Тогда
ВызватьИсключение "Native выбранный вид не подтвердился";
КонецЕсли;
Сумма = 0;
Для Каждого Р Из Паспорт.Строки Цикл
Сумма = Сумма + Р.Количество85 * Р.Цена85 * Вид.Коэффициент85;
КонецЦикла;
Если Сумма <> ?(Пульт.ЭтапКоэффициента85 = 2, 500, 1000) Тогда
ВызватьИсключение "Actual три строки и actual коэффициент не дали 1000/500/1000";
КонецЕсли;
После = ВариантыИсточник85.ПаспортПульта85(Пульт);
ВариантыИсточник85.СравнитьСсылки85(Паспорт, После);
Пульт.Статус85 = "Итог по действительным строкам × выбранный коэффициент: " + Формат(Сумма, "ЧГ=0;ЧДЦ=2");
Пульт.ЭтапКоэффициента85 = Пульт.ЭтапКоэффициента85 + 1;
КонецПроцедуры
#КонецЕслиПолное упражнение буфера и запрет записи формы
Документы → Счет85 → Формы → Документ85 → Модуль
Толстый обычный клиент; native BeforeWrite3
Перем ЭтапБуфера85;
Процедура ПриОткрытии()
ВладелецФормы.ПроверитьСчетФорму85(ЭтаФорма);
Паспорт = ВариантыИсточник85.ПаспортПульта85(ВладелецФормы);
ВариантыИсточник85.ПроверитьБуфер85(Объект85, Паспорт);
ЭтапБуфера85 = "Исходный";
Статус85 = "Сохранённый счёт на 1000. Его запись запрещена во всех контекстах.";
КонецПроцедуры
Процедура Отбор85(Кнопка)
Если Кнопка <> ЭлементыФормы.Отбор85 Или ЭтапБуфера85 <> "Исходный" Тогда
ВызватьИсключение "Только свой фильтр исходного буфера";
КонецЕсли;
ВариантыСчет85.ПоказатьОтбор85(ЭтаФорма, Истина);
КонецПроцедуры
Процедура ВсеСтроки85(Кнопка)
Если Кнопка <> ЭлементыФормы.ВсеСтроки85 Или ЭтапБуфера85 <> "Исходный" Тогда
ВызватьИсключение "Только свой исходный буфер";
КонецЕсли;
ВариантыСчет85.ПоказатьОтбор85(ЭтаФорма, Ложь);
КонецПроцедуры
Процедура РазрешитьBNEW85(Кнопка)
Если Кнопка <> ЭлементыФормы.РазрешитьBNEW85 Или ЭтапБуфера85 <> "Исходный" Или ВладелецФормы.НеизвестныйИсход85 Тогда
ВызватьИсключение "Нельзя открывать второй/неизвестный этап буфера";
КонецЕсли;
Паспорт = ВариантыИсточник85.ПаспортПульта85(ВладелецФормы);
ВариантыИсточник85.ПроверитьБуфер85(Объект85, Паспорт);
ВариантыСчет85.ПоказатьОтбор85(ЭтаФорма, Истина);
ЭтапБуфера85 = "Ввод";
ЭлементыФормы.Строки85.ТолькоПросмотр = Ложь;
Статус85 = "Вручную добавьте одну BNEW/свой товар/1/250/250. После окончания ввода native policy может сообщить о несовпадении. Запись запрещена.";
КонецПроцедуры
Процедура ПроверитьBNEW85(Кнопка)
Если Кнопка <> ЭлементыФормы.ПроверитьBNEW85 Или ЭтапБуфера85 <> "Ввод" Тогда
ВызватьИсключение "Нужен единственный собственный этап BNEW";
КонецЕсли;
ВладелецФормы.ПроверитьСчетФорму85(ЭтаФорма);
Если ВладелецФормы.НеизвестныйИсход85 Тогда
ВызватьИсключение "Не проверяем неизвестный буфер";
КонецЕсли;
Паспорт = ВариантыИсточник85.ПаспортПульта85(ВладелецФормы);
ВариантыИсточник85.ПроверитьБуфер85(Объект85, Паспорт, Истина);
ЭлементыФормы.Строки85.ТолькоПросмотр = Истина;
ЭтапБуфера85 = "Проверен";
Статус85 = "В памяти 4 строки на 1250, в сохранённой ИБ по-прежнему 3 строки на 1000. BNEW не соответствует Contains(A85).";
КонецПроцедуры
Процедура УбратьBNEW85(Кнопка)
Если Кнопка <> ЭлементыФормы.УбратьBNEW85 Или ЭтапБуфера85 <> "Проверен" Тогда
ВызватьИсключение "Удаляется только одна подтверждённая строка своего буфера";
КонецЕсли;
Пульт = ВладелецФормы;
Пульт.ПроверитьСчетФорму85(ЭтаФорма);
Если Пульт.НеизвестныйИсход85 Тогда
ВызватьИсключение "Не изменяем неизвестный буфер";
КонецЕсли;
Паспорт = ВариантыИсточник85.ПаспортПульта85(Пульт);
ВариантыИсточник85.ПроверитьБуфер85(Объект85, Паспорт, Истина);
Пульт.НеизвестныйИсход85 = Истина;
Попытка
Объект85.Строки85.Удалить(Объект85.Строки85[3]);
ВариантыИсточник85.ПроверитьБуфер85(Объект85, Паспорт);
ВариантыИсточник85.ПаспортПульта85(Пульт);
ЭтапБуфера85 = "Исходный";
Пульт.НеизвестныйИсход85 = Ложь;
ВариантыСчет85.ПоказатьОтбор85(ЭтаФорма, Ложь);
Исключение
Пульт.НеизвестныйИсход85 = Истина;
ЭтапБуфера85 = "СТОП";
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
Отказ = Истина;
КонецПроцедурыПолный unconditional запрет записи документа
Документы → Счет85 → Модуль объекта, целиком после manual fixture
Все native контексты BeforeWrite3; клиентских помощников нет
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
Отказ = Истина;
КонецПроцедурыПолный пульт и настоящие события выбора
Обработки → Пульт85 → Формы → Пульт85 → Модуль
Толстый обычный клиент; ChoiceProcessing2/OnChange1/Click1
Перем Инициализирован85, ФормаТовара85, ФормаВида85, ФормаКоэффициентов85, ФормаСчета85, ФормаСпискаСчетов85;
Процедура ПриОткрытии()
Если Инициализирован85 <> Неопределено Тогда
ВызватьИсключение "Этот пульт не переинициализируется после ошибки";
КонецЕсли;
НеизвестныйИсход85 = Истина;
Паспорт = ВариантыИсточник85.Прочитать85();
МаркерПульта85 = "e9fd8c96-8a35-4d02-b071-5118726a18d7";
ИсходныйТовар85 = Паспорт.Товар;
Группа85 = Паспорт.Группа;
Обычный85 = Паспорт.Обычный;
Половина85 = Паспорт.Половина;
ИсходныйСчет85 = Паспорт.Счет;
ТоварСохранен85 = Ложь;
ВидСохранен85 = Ложь;
ЭтапКоэффициента85 = 1;
Инициализирован85 = Истина;
ВариантыИсточник85.ПаспортПульта85(ЭтаФорма);
НеизвестныйИсход85 = Ложь;
Статус85 = "Готова своя fixture. Выберите Обычный, затем Половина, затем Обычный. Счёт введите отдельно по номеру INV85.";
КонецПроцедуры
Процедура ПроверитьТоварФорму85(Форма) Экспорт
Если Инициализирован85 <> Истина Или Форма = Неопределено Или Форма <> ФормаТовара85 Или Форма.ВладелецФормы <> ЭтаФорма Тогда
ВызватьИсключение "Чужая форма копии товара";
КонецЕсли;
КонецПроцедуры
Процедура ПроверитьВидФорму85(Форма) Экспорт
Если Инициализирован85 <> Истина Или Форма = Неопределено Или Форма <> ФормаВида85 Или Форма.ВладелецФормы <> ЭтаФорма Тогда
ВызватьИсключение "Чужая форма копии вида характеристики";
КонецЕсли;
КонецПроцедуры
Процедура ПроверитьСчетФорму85(Форма) Экспорт
Если Инициализирован85 <> Истина Или Форма = Неопределено Или Форма <> ФормаСчета85 Или Форма.ВладелецФормы <> ЭтаФорма Тогда
ВызватьИсключение "Чужая форма буфера счёта";
КонецЕсли;
КонецПроцедуры
Процедура КопияТовара85(Кнопка)
Если Кнопка <> ЭлементыФормы.КопияТовара85 Или НеизвестныйИсход85 Или ТоварСохранен85 Или ФормаТовара85 <> Неопределено Тогда
ВызватьИсключение "Копию товара создают ровно один раз в своём пульте";
КонецЕсли;
Паспорт = ВариантыИсточник85.ПаспортПульта85(ЭтаФорма);
Исходный = Паспорт.Товар.ПолучитьОбъект();
Копия = Исходный.Скопировать();
Если ТипЗнч(Копия) <> Тип("СправочникОбъект.Товары85") Или Не Копия.ЭтоНовый() Тогда
ВызватьИсключение "Native Copy не вернул свой новый объект";
КонецЕсли;
Ключ = Новый УникальныйИдентификатор;
ФормаТовара85 = Копия.ПолучитьФорму("Элемент85", ЭтаФорма, Ключ);
Если ФормаТовара85 = Неопределено Или ТипЗнч(ФормаТовара85) <> Тип("Форма") Или ФормаТовара85.Открыта()
Или ФормаТовара85.ВладелецФормы <> ЭтаФорма Или ФормаТовара85.КлючУникальности <> Ключ Или ФормаТовара85.Объект85 <> Копия Тогда
ВызватьИсключение "Фабрика не вернула подготовленную форму именно своей копии";
КонецЕсли;
ФормаТовара85.ПодготовитьКопию85();
ФормаТовара85.Открыть();
КонецПроцедуры
Процедура КопияВида85(Кнопка)
Если Кнопка <> ЭлементыФормы.КопияВида85 Или НеизвестныйИсход85 Или ВидСохранен85 Или ФормаВида85 <> Неопределено Тогда
ВызватьИсключение "Копию коэффициента создают ровно один раз";
КонецЕсли;
Паспорт = ВариантыИсточник85.ПаспортПульта85(ЭтаФорма);
Исходный = Паспорт.Половина.ПолучитьОбъект();
Копия = Исходный.Скопировать();
Если ТипЗнч(Копия) <> Тип("ПланВидовХарактеристикОбъект.Коэффициенты85") Или Не Копия.ЭтоНовый() Тогда
ВызватьИсключение "Native Copy не вернул свой новый вид";
КонецЕсли;
Ключ = Новый УникальныйИдентификатор;
ФормаВида85 = Копия.ПолучитьФорму("Элемент85", ЭтаФорма, Ключ);
Если ФормаВида85 = Неопределено Или ТипЗнч(ФормаВида85) <> Тип("Форма") Или ФормаВида85.Открыта()
Или ФормаВида85.ВладелецФормы <> ЭтаФорма Или ФормаВида85.КлючУникальности <> Ключ Или ФормаВида85.Объект85 <> Копия Тогда
ВызватьИсключение "Фабрика не вернула подготовленную форму именно своей копии вида";
КонецЕсли;
ФормаВида85.ПодготовитьКопию85();
ФормаВида85.Открыть();
КонецПроцедуры
Процедура ВыбратьКоэффициент85(Кнопка)
Если Кнопка <> ЭлементыФормы.ВыбратьКоэффициент85 Или НеизвестныйИсход85 Тогда
ВызватьИсключение "Нужна своя кнопка известного этапа";
КонецЕсли;
Если ФормаКоэффициентов85 <> Неопределено И ФормаКоэффициентов85.Открыта() Тогда
ВызватьИсключение "Сначала вручную завершите либо отмените текущий выбор";
КонецЕсли;
ФормаКоэффициентов85 = ВариантыКоэффициент85.ОткрытьКоэффициенты85(ЭтаФорма);
ФормаКоэффициентов85.Открыть();
КонецПроцедуры
Процедура ОбработкаВыбора(ЗначениеВыбора, Источник)
Если Источник = Неопределено Или Источник <> ФормаКоэффициентов85 Или Источник.ВладелецФормы <> ЭтаФорма Или НеизвестныйИсход85 Тогда
ВызватьИсключение "Native Choice должен поступить только от своего подготовленного списка";
КонецЕсли;
Если ТипЗнч(ЗначениеВыбора) <> Тип("ПланВидовХарактеристикСсылка.Коэффициенты85") Тогда
ВызватьИсключение "Массив/группа другого типа/чужое значение не принимаются";
КонецЕсли;
ЭлементыФормы.Коэффициент85.Значение = ЗначениеВыбора;
ВариантыКоэффициент85.Рассчитать85(ЭтаФорма);
КонецПроцедуры
Процедура КоэффициентПриИзменении85(Элемент)
Если Элемент <> ЭлементыФормы.Коэффициент85 Или Элемент.Имя <> "Коэффициент85" Тогда
ВызватьИсключение "Native OnChange должен поступить от собственного поля";
КонецЕсли;
ВариантыКоэффициент85.Рассчитать85(ЭтаФорма);
КонецПроцедуры
Процедура СписокСчетов85(Кнопка)
Если Кнопка <> ЭлементыФормы.СписокСчетов85 Или НеизвестныйИсход85 Или ФормаСпискаСчетов85 <> Неопределено Тогда
ВызватьИсключение "Открывается только один свой список документов";
КонецЕсли;
ФормаСпискаСчетов85 = ВариантыСчет85.ОткрытьСписокСчетов85(ЭтаФорма);
ФормаСпискаСчетов85.Открыть();
КонецПроцедуры
Процедура БуферСчета85(Кнопка)
Если Кнопка <> ЭлементыФормы.БуферСчета85 Или НеизвестныйИсход85 Или ФормаСчета85 <> Неопределено Тогда
ВызватьИсключение "Открывается только один буфер собственного счёта";
КонецЕсли;
ФормаСчета85 = ВариантыСчет85.ОткрытьБуфер85(ЭтаФорма);
ФормаСчета85.Открыть();
КонецПроцедурыПолный startup собственного пульта
Конфигурация → Модуль обычного приложения, целиком
Native OnStart0; обычное приложение
Процедура ПриНачалеРаботыСистемы()
ВариантыИсточник85.Прочитать85();
Пульт = Обработки.Пульт85.ПолучитьФорму("Пульт85", , Новый УникальныйИдентификатор);
Если Пульт = Неопределено Или ТипЗнч(Пульт) <> Тип("Форма") Или Пульт.Открыта() Тогда
ВызватьИсключение "Не получена собственная новая обычная форма пульта";
КонецЕсли;
Пульт.Открыть();
КонецПроцедурыРазбор по шагам
Manual input INV85 получает собственный сохранённый ref; actual GetObject.GetForm сохраняет тот же документ в prepared основной форме.
Настроить реальные list-column/icon и numeric TP-column/footer, прочитать политики обратно.
Мутировать только actual child filter, не readonly контейнеры: Contains(A85) берёт A85+A850 на500.
Отдельно вручную добавить BNEW только в собственный буфер, проверить1250 при DB1000 и удалить исключительно его четвёртую строку.
Как проверить результат
Точная новая File ИБ, версия/NoUse/schema/user/одно подключение проверены до действий.
Четыре полных неотфильтрованных источника сверены со всеми actual объектами и строками.
Фабрики штатные, native callbacks не вызваны вручную, owner/pointer/поле связаны с подготовленными metadata.
Исключение/False при записи копии оставляет sticky неизвестный исход; запись счёта запрещена во всех контекстах.
Ожидаемый результат
Полный счёт3/1000 → фильтр2/500 → все3/1000. BNEW: только буфер4/1250; после удаления буфер3/1000, сохранённый документ всегда3/1000.
На что обратить внимание
Нет заявленной атомарности, rollback или защиты от конкурентного вмешательства по одному readback.
АвтонумерацияВФорме — enum: НеИспользовать не обещает отключить нумерацию при самой записи.
Параметры для групп у автогенерированных форм не кредитуются на этих именованных собственных формах.
Readonly containers допускают native child mutation, но не присваивание контейнера.
UI policy и независимый расчёт не равны runtime-проверке нарисованного footer/предупреждения. Native описание PVHObject.GetForm содержит ссылочный wording; здесь использована actual object factory и подготовленный основной реквизит.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.