Расширение колонки табличного поля списка документов

Типы · Document list table box column extension

Дополнительные свойства элемента управления КолонкаТабличногоПоля списка документов.

Полное описание, параметры и ограничения

Расширение колонки табличного поля списка документов (Document list table box column extension)

Расширение колонки табличного поля списка документов (Document list table box column extension)

Доступен, начиная с версии 8.0.

Свойства:
ОтображатьСтандартнуюКартинку (DisplayDefaultPicture)

Описание:

Дополнительные свойства элемента управления КолонкаТабличногоПоля списка документов.

Доступность:

Толстый клиент.

Использование в версии:

Доступен, начиная с версии 8.0.

Методическая информация

Практические примеры

Буфер счёта: contains-отбор, подвал и новая строка без записи

Один самостоятельный маршрут новой собственной File ИБ с полным источником и реальными ordinary формами; чужие ссылки и неизвестный исход останавливают опыт.

Где и как запускать

Полный модуль из подготовки; только Windows толстый обычный клиент собственной новой File CF. Сервер/управляемое приложение для этого интерфейса исключены.

Подготовка

  1. Не переносите этот урок в рабочую конфигурацию. В будущем вручную создайте совершенно новую пустую File ИБ на отдельном Windows учебном стенде: C:\1c-labs\OwnOrdinaryInvoiceVariants85_e9fd8c96-8a35-4d02-b071-5118726a18d7\IB. Если этот путь уже существует, ничего не очищайте и не продолжайте. Строка File="точный путь"; сверяется буквально. Здесь никакие каталоги, CF, записи или окна 1С не создавались; все программы только написаны и статически проверены.

  2. Конфигурация УчебныеВариантыСчета85: платформа 8.5.1.1343, РежимСовместимости НеИспользовать, ОсновнойРежимЗапуска ОбычноеПриложение. В Конфигураторе Сервис → Параметры → Общие → Редактирование конфигурации для режима запуска выберите «Управляемое приложение и обычное приложение». Это настройка редактора, а не свойство конфигурации SupportedRunModes. Урок запускают только в толстом обычном клиенте. Прикладная схема: один справочник, один ПВХ, один документ, одна обработка, три общих модуля, одна роль. Регистров, движений, заданий, разделителей, расширений и прочих прикладных объектов нет.

  3. Справочник Товары85: неиерархический, без владельцев/табличных частей/предопределённых элементов. Код Строка12, Наименование80, автонумерацияНет, контроль уникальностиДа. Реквизиты Маркер85 Строка36 и Цена85 Число10,2. ПланВидовХарактеристик Коэффициенты85: иерархия групп и элементовДа, без табличных частей/предопределённых элементов; Код Строка12, Наименование80, автонумерацияНет, уникальностьДа. Тип значений характеристики только Число10,2. Реквизиты Маркер85 Строка36 и Коэффициент85 Число10,2, использование обоих ДляГруппИЭлементов. Код читает фактический ТипЗначения группы, не угадывает его значение по умолчанию; строгий числовой тип требуется у элементов.

  4. Документ Счет85: Номер Строка12, автонумерацияНет, уникальностьДа, проведениеЗапретить, движенийНет; единственный реквизит Маркер85 Строка36. ТабличнаяЧасть Строки85: Код85 Строка8, Товар85 только СправочникСсылка.Товары85, Количество85 Число10,0, Цена85 и Сумма85 Число10,2. Начальные реквизиты не составные. Модули объектов и менеджеров пустые, кроме отдельно устанавливаемого запрета записи документа.

  5. ДО установки 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.

  6. Создайте единственный учебный пользователь Варианты85Ученик и единственную роль Варианты85 без RLS/привилегированности. Роль: чтение/просмотр/ввод по строке всех трёх объектов, добавление/изменение только своих каталогов и ПВХ, использование Пульт85, АктивныеПользователи для проверки подключения. Для собственного документа оставьте изменение/интерактивное редактирование, необходимое для буфера; это НЕ обещание readonly прав. Его запись запрещают оба полных BeforeWrite обработчика ниже. После ручного начального заполнения установите DOCUMENT_MODULE в Документы → Счет85 → Модуль объекта; native ПередЗаписью3 всегда ОтказTrue во всех контекстах и не вызывает клиентские общие модули. Закройте первоначальный клиент и Конфигуратор; в учебном опыте должно быть ровно одно своё подключение.

  7. ОбщиеМодули ВариантыИсточник85/ВариантыКоэффициент85/ВариантыСчет85: ГлобальныйНет, КлиентОбычноеПриложениеДа, КлиентУправляемоеПриложениеНет, СерверНет, ВнешнееСоединениеНет, ПривилегированныйНет, повторное использованиеНеИспользовать. Целиком вставьте соответственно SOURCE/SELECTOR/INVOICE. Все callbacks, вызывающие их, принадлежат ordinary формам с native доступностью толстого клиента; ширококонтекстный DocumentObject.BeforeWrite не вызывает ни один такой помощник. Авторизация записи копии — частная переменная именно своей обычной формы, не общий серверно-клиентский Перем.

  8. Справочники → Товары85 → Формы: конструктором создайте ОБЫЧНУЮ форму элемента Элемент85 и назначьте основной формой элемента. Основной реквизит Объект85 имеет только СправочникОбъект.Товары85, связывается с переданным native объектом. Добавьте реквизиты Подтверждение85 Булево и Статус85 Строка500; элементы флажок Подтверждение85 с начальными False, кнопка Сохранить85, поле Статус85 ТолькоПросмотрДа. Объектные поля показывайте только для просмотра, стандартные Записать/ОК не используйте. Целый CATALOG_FORM в модуль формы; ПриОткрытии→ПриОткрытии0, ПередЗаписью→ПередЗаписью1, Сохранить85.Нажатие→Сохранить85 с фактическим первым параметром Кнопка. Native extension возникает у этой формы объекта, не создаётся конструктором.

  9. ПланыВидовХарактеристик → Коэффициенты85 → Формы: аналогично создайте обычную основную форму элемента Элемент85 с основным Объект85 только ПланВидовХарактеристикОбъект.Коэффициенты85, теми же собственными Подтверждение85/Статус85/Сохранить85. Целый PVH_FORM, те же события0/1/1. Отдельно конструктором создайте обычную основную форму списка Список85: основной реквизит Список85 только ПланВидовХарактеристикСписок.Коэффициенты85; табличное поле Виды85, Данные=Список85, колонка Наименование с Данные=Наименование, ТолькоПросмотрДа. Никаких пользовательских модулей или записывающих обработчиков списка. Форма выбора для данного урока — этот реальный native список с РежимВыбораTrue, не новый неизвестный List объект.

  10. Документы → Счет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 на одноимённую процедуру. Стандартные команды записи не включайте; объектный запрет уже установлен.

  11. Обработки → Пульт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 события.

  12. Целый APPLICATION вставьте в Модуль обычного приложения. ПриНачалеРаботыСистемы0 только открывает собственный новый пульт после полной проверки сохранённого источника. До его установки проверьте все имена, точные типы и события в Конфигураторе. Для будущего опыта запустите единственный толстый обычный клиент. Никакие callbacks не вызывайте вручную и не оборачивайте готовые модули в дополнительную процедуру.

  13. Опыт записи копий — отдельное осознанное действие только в этой новой ИБ. Сначала КопияТовара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.

  14. Опыт выбора не записывает БД: нажимайте ВыбратьКоэффициент85 и в реальном списке выбирайте Обычный, Половина, Обычный. Native ChoiceProcessing2 получает actual источник и ref; программное назначение Value в нём не имитирует OnChange, расчёт вызывается как обычный бизнес-помощник. Прямой ручной ввод/быстрый выбор поля обрабатывается genuine OnChange. Отмена списка не продвигает этап и не запускает расчёт. Группа/копия/неправильный этап не принимаются. Числа1000/500/1000 получаются из всех3 actual строк и значения выбранного элемента, а не из подставленной таблицы результата.

  15. Опыт буфера: в поле СчетВыбор85 вручную найдите сохранённый INV85; откройте отдельный readonly список для стандартного значка и БуферСчета85 для actual DocumentObject.GetForm. Отбор85 ставит Contains(A85), поэтому видимы A85 И A850 на500, не только первая строка. ВсеСтроки85 даёт3/1000. Недоступность настройки Код85 ограничивает пользовательский редактор отбора, но программа изменяет действительный дочерний filter; readonly контейнеры не присваиваются. Числа статусной строки — независимый расчёт по буферу/actual фильтру, НЕ программное чтение native footer; его изображение сравните вручную.

  16. Для отдельного упражнения Разрешить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", , Новый УникальныйИдентификатор);
    Если Пульт = Неопределено Или ТипЗнч(Пульт) <> Тип("Форма") Или Пульт.Открыта() Тогда
        ВызватьИсключение "Не получена собственная новая обычная форма пульта";
    КонецЕсли;
    Пульт.Открыть();
КонецПроцедуры

Разбор по шагам

  1. Manual input INV85 получает собственный сохранённый ref; actual GetObject.GetForm сохраняет тот же документ в prepared основной форме.

  2. Настроить реальные list-column/icon и numeric TP-column/footer, прочитать политики обратно.

  3. Мутировать только actual child filter, не readonly контейнеры: Contains(A85) берёт A85+A850 на500.

  4. Отдельно вручную добавить BNEW только в собственный буфер, проверить1250 при DB1000 и удалить исключительно его четвёртую строку.

Как проверить результат

  1. Точная новая File ИБ, версия/NoUse/schema/user/одно подключение проверены до действий.

  2. Четыре полных неотфильтрованных источника сверены со всеми actual объектами и строками.

  3. Фабрики штатные, native callbacks не вызваны вручную, owner/pointer/поле связаны с подготовленными metadata.

  4. Исключение/False при записи копии оставляет sticky неизвестный исход; запись счёта запрещена во всех контекстах.

Ожидаемый результат

Полный счёт3/1000 → фильтр2/500 → все3/1000. BNEW: только буфер4/1250; после удаления буфер3/1000, сохранённый документ всегда3/1000.

На что обратить внимание

  1. Нет заявленной атомарности, rollback или защиты от конкурентного вмешательства по одному readback.

  2. АвтонумерацияВФорме — enum: НеИспользовать не обещает отключить нумерацию при самой записи.

  3. Параметры для групп у автогенерированных форм не кредитуются на этих именованных собственных формах.

  4. Readonly containers допускают native child mutation, но не присваивание контейнера.

  5. UI policy и независимый расчёт не равны runtime-проверке нарисованного footer/предупреждения. Native описание PVHObject.GetForm содержит ссылочный wording; здесь использована actual object factory и подготовленный основной реквизит.

Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.