Дополнительные свойства элемента управления КолонкаТабличногоПоля списка документов.
Полное описание, параметры и ограничения
Расширение колонки табличного поля списка документов (Document list table box column extension)
Расширение колонки табличного поля списка документов (Document list table box column extension)
Доступен, начиная с версии 8.0.
Свойства:
ОтображатьСтандартнуюКартинку (DisplayDefaultPicture)
Описание:
Дополнительные свойства элемента управления КолонкаТабличногоПоля списка документов.
Доступность:
Толстый клиент.
Использование в версии:
Доступен, начиная с версии 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 и подготовленный основной реквизит.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.