Часть единого собственного учебного стенда: полностью подготовленные обычные формы, настоящие native источники и проверяемые числовые результаты.
Где и как запускать
Платформа8.5.1.1343; толстый обычный клиент собственной новой File CF; основной модуль своей обычной формы. Реальная1С/CF/ИБ/UI здесь не запускались.
Подготовка
Задача уроков — разобраться в различии между сохранёнными бухгалтерскими строками, редактируемым набором и журналом просмотра. Приход1000, расходы250 и100 дают сумму всех строк1350 и знаковую сумму650. Исправление последнего расхода100→200 уменьшит знаковую сумму до550. Возврат200→100 снова даст650. Это сумма собственных проводок, а не утверждение о полном бухгалтерском балансе предприятия.
Вручную создайте НОВУЮ пустую файловую базу C:\1c-labs\OwnAccountingInvoiceForms85_a4e6fa9e-85cd-4daf-a4c0-e89b9fe48373\IB. Если такой каталог уже существует, не очищайте и не переиспользуйте его. Имя конфигурации УчебныеФормыБухНакладной85, платформа Windows8.5.1.1343, РежимСовместимостиНеИспользовать. В Конфигураторе выберите Сервис → Параметры → Общие → Редактирование конфигурации для режима запуска = «Управляемое приложение и обычное приложение». Это настройка редактора, не свойство метаданных. Отдельно установите ОсновнойРежимЗапускаОбычноеПриложение. UUID в пути — маркер лаборатории, не UUID базы.
Создайте свою роль БухФормы85Администратор со всеми правами только этой учебной CF, включая администрирование для ПолучитьПользователей и право АктивныеПользователи для ПолучитьСоединенияИнформационнойБазы. Единственный пользователь БухФормы85Ученик с этой ролью. Перед учебным запуском закройте Конфигуратор и остальные соединения: код требует ровно одно соединение, сверяет его реальный номер с НомерСоединенияИнформационнойБазы и UUID пользователя соединения с UUID текущего единственного пользователя. Это проверка состояния в момент чтения, не блокировка новых подключений и не гарантия изоляции. Правка placeholders не требуется. Не используйте рабочие УТ/КА/УНФ/БП и не устанавливайте расширения.
Создайте объекты и пять ОБЫЧНЫХ форм по видимому JSON-блоку «Подготовка метаданных». У плана счетов нет субконто; регистр не поддерживает корреспонденцию. У строк Код85 и Маркер85 — строки переменной длины с пределами3 и36, без заполнения пробелами. Все измерения и ресурс балансовые. Документ не проводится, но включён в регистраторы регистра. У форм регистра основными реквизитами должны быть настоящий набор/список; у форм плана — настоящий список/объект. Это условие появления соответствующих native расширений, а не создание нового Extension.
Сначала подготовьте исходные данные, пока модули урока и его запреты записи ещё НЕ установлены. В своей учебной ИБ стандартными командами вручную сохраните один документ: номерINV85, дата10.10.2026 12:00:00, Маркер85=a4e6fa9e-85cd-4daf-a4c0-e89b9fe48373, ПроведенFalse, ПометкаУдаленияFalse. Один счёт: код85, наименование «Учебная накладная», ВидАктивный, ЗабалансовыйFalse, ПредопределенныйFalse, ПометкаУдаленияFalse, Маркер85=a4e6fa9e-85cd-4daf-a4c0-e89b9fe48373. Не задавайте вымышленные ссылки: при заполнении движений выбирайте эти настоящие сохранённые объекты.
В стандартной форме набора регистра вручную сохраните ровно три строки из JSON. В каждой период10.10.2026 12:00:00, тот же реальный регистраторINV85 и счёт85, АктивностьTrue, Маркер85=a4e6fa9e-85cd-4daf-a4c0-e89b9fe48373. КодA/Дебет1000, A10/Кредит250, B/Кредит100. В языке используются именно ВидДвиженияБухгалтерии.Дебет/Кредит, не Приход/Расход регистра накопления. Система присваивает сохранённым строкам номера1/2/3; readonly НомерСтроки программно не задаётся. Других документов, счетов или строк быть не должно. Если реальная подготовка не совпала, остановитесь, не подделывайте результат.
После подготовки установите общий модуль БухНакладнаяФормы85: ГлобальныйНет, КлиентОбычноеПриложениеДа, КлиентУправляемоеПриложениеНет, СерверДа, ВызовСервераНет, ВнешнееСоединениеНет, ПривилегированныйНет, ПовторноеИспользованиеВозвращаемыхЗначенийНеИспользовать. Вставьте COMMON целиком. Это общий код проверки данных в обычном клиенте и серверном объектном модуле; здесь нет UI API. Полные запросы читают все собственные документы/счета/проводки, а не только строку, совпавшую по маркеру.
В каждую обычную форму вставьте именно её полный supporting module: HUB в ПультНакладной85, SET_FORM в Набор85, REGISTER_LIST в Журнал85, ACCOUNTS_LIST в Список85 плана, ACCOUNT_FORM в Счет85. ПередОткрытием формы привяжите к настоящему событию с двумя параметрами Отказ,СтандартнаяОбработка. Все кнопки Нажатие привяжите к указанной процедуре с одним параметром Кнопка: у обычного элемента native Нажатие() дополняется первым Элементом. Процедуры Подготовить85 — собственные экспортные методы, не имитация платформенных событий.
Во всех формах Протокол85 разместите как readonly многострочное поле. В Набор85 колонки создайте вручную с точными свойствами Данные, равными именам полей из JSON; НомерСтроки — только просмотр. На наборе удалите стандартные команды записи/удаления/перемещения, сохраните только штатное добавление нового черновика и редактирование ячеек плюс свою кнопку Шаг85. Штатные запись/удаление запрещены формой вне двух явных этапов. В остальных списках отключите стандартные команды изменения/создания/удаления; только просмотр и свои кнопки. Не отключайте собственное поле Выбор85: оно хранит настоящую ссылку счёта.
SET_FORM.ПередЗаписью(Отказ)1 привяжите к событию формы набора. RECORDSET_MODULE.ПередЗаписью(Отказ,Замещение)2 установите в МодульНабораЗаписей регистра после fixture: это другой владелец и другая сигнатура. ACCOUNT_FORM.ПередЗаписью(Отказ)1 — событие формы счёта; ACCOUNT_MODULE.ПередЗаписью(Отказ)1 — событие объекта плана счетов. Оба полных модуля присутствуют ниже. APPLICATION целиком в модуль ОБЫЧНОГО приложения: настоящее ПриНачалеРаботыСистемы()0 открывает свой пульт. События вручную не вызываются.
После будущей ручной проверки синтаксиса, сохранения CF и обновления только своей учебной ИБ запустите толстый обычный клиент. В пульте сначала Набор85: кнопка Шаг включает фильтрA, который по documented вхождению оставляетA иA10. Следующий Шаг делает собственное несохранённое исправлениеB100→150 и сразу перечитывает данные методом формы. Сохранённая база всё время остаётся1350/650.
На этапе2 в самой форме набора добавьте ОДИН реальный несохранённый черновик B2: расход75, период/регистратор/счёт/активность/Маркер как уB. Закончите ввод строки. Native политика СообщатьОНесоответствииОтбору должна уведомить о несовпадении с фильтромA; язык/вид окна не предсказываются. Буфер теперь4строки/1425/575, база по-прежнему3строки/1350/650. Шаг сначала проверяет все значения этого собственного черновика и лишь затем вызывает Обновить на табличном поле. Если число/значения не совпали, нет автоматического удаления или восстановления.
Следующий Шаг отключает только свой фильтр. Теперь вручную измените только сумму в строкеB100→200, закончите редактирование и нажмите Шаг. Метод ЗаписатьВФорме() должен вернутьTrue; свежий независимый набор и полные запросы подтверждают1450/550. Затем измените200→100 и Шаг:1350/650, процесс завершён. Любая ошибка/False/неожиданный callback останавливает эту форму; не повторяйте запись, не продолжайте с неизвестным состоянием.
Закройте набор. Пульт→Журнал: native менеджер регистра.ПолучитьФормуСписка() принимает строго0 аргументов. В CF основная форма спискаЖурнал85; закрытая форма дополнительно проходит собственную однократную подготовку. Это не обещание нового экземпляра/отсутствия кеша. ДоOpen устанавливаются реальный регистратор и native ключ строки2. После появления данных нажмите Проверить: actual текущие данныеA10/250 и все три реальные строки поля должны совпасть с полным источником. Не подставляйте данные запроса вместо отсутствующих UI данных.
Закройте журнал. Пульт→Копия: настоящий объект счёта85.Скопировать() создаёт новый memory объект, но не пишет БД. Код/имя86 задаются явно. ПараметрОбъектКопирования содержит реальную ссылку85, ПараметрОснование — реальный документINV85. Собственный BeforeOpen-потребитель читает их и показывает паспорт копии; СтандартнаяОбработкаFalse предотвращает угадывание автоматического fill/copy. Записать один раз: полный свежий источник подтверждает два счёта85/86, прежний документ и все три прежние проводки только на85. Пример новую копию не удаляет и повторную копию не создаёт.
Закройте копию. Пульт→Счета: настоящая обычная форма списка плана с начальным позиционированием на85. ПолеВыбор85 имеет тип ПланСчетовСсылка.СчетаНакладной85 и БыстрыйВыборTrue. Вручную выберите85, нажмите Проверить: реальные данные обоих счетов и выбранная ссылка проверяются, из реальных проводок получится650. Выберите86:0, поскольку нет своих проводок на копии. Это не callback дочерней формы и не обещание, что dropdown вызывает ОбработкаВыбора2.
Ограничения: scalar readback свойств картинки/подвала/отбора не доказывает пиксели, права доступа, изоляцию транзакции или абсолютную блокировку UI. ПроверитьСтроку/ДанныеСтроки доказывают фактические полученные данные своих строк, не весь renderer. Конкурентные изменения обнаруживаются проверками, но снимки не атомарны. Здесь были только авторство и статические/native тесты; 1С/CF/ИБ/GUI/запись/сеть/печать не запускались.
Перем Источник85, СвояКопия85, Остановка85, Записано85;
Процедура Подготовить85(Источник, Копия) Экспорт
Если Источник85 <> Неопределено Или ЭтаФорма.Открыта() Или Счет85 <> Копия Тогда
Остановка85 = Истина;
ВызватьИсключение "Форма уже использована или содержит другой объект";
КонецЕсли;
БухНакладнаяФормы85.ПроверитьКопию85(Копия, Источник);
Источник85 = Источник;
СвояКопия85 = Копия;
Остановка85 = Ложь;
Записано85 = Ложь;
ЭтаФорма.ПараметрОбъектКопирования = Источник.Счет;
ЭтаФорма.ПараметрОснование = Источник.Документ;
КонецПроцедуры
Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Попытка
ПроверитьФорму85();
ИсходныйСчет = ЭтаФорма.ПараметрОбъектКопирования;
Основание = ЭтаФорма.ПараметрОснование;
Если ТипЗнч(ИсходныйСчет) <> Тип("ПланСчетовСсылка.СчетаНакладной85") Или ТипЗнч(Основание) <> Тип("ДокументСсылка.РегистраторНакладной85")
Или ИсходныйСчет <> Источник85.Счет Или Основание <> Источник85.Документ Тогда
ВызватьИсключение "Параметры указывают не на собственный счёт и документ";
КонецЕсли;
Протокол85 = "Свой потребитель параметров: копия счёта " + ИсходныйСчет.Код + " для документа " + Основание.Номер
+ ". Счёт86 ещё не записан. Нажмите Записать один раз.";
Исключение
Остановка85 = Истина;
Отказ = Истина;
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
Процедура ПроверитьФорму85()
Если Остановка85 Или Записано85 Или Источник85 = Неопределено Или Счет85 <> СвояКопия85 Или Не Счет85.ЭтоНовый()
Или ЭтаФорма.ПараметрОбъектКопирования <> Источник85.Счет Или ЭтаФорма.ПараметрОснование <> Источник85.Документ Тогда
Остановка85 = Истина;
ВызватьИсключение "Объект, параметры или состояние собственной формы изменены";
КонецЕсли;
БухНакладнаяФормы85.ПроверитьКопию85(Счет85, Источник85);
КонецПроцедуры
Процедура Записать85(Кнопка)
Если Остановка85 Или Записано85 Или Кнопка <> ЭлементыФормы.Записать85 Или Кнопка.Имя <> "Записать85" Тогда
Остановка85 = Истина;
ВызватьИсключение "Неизвестная команда или повтор записи запрещён";
КонецЕсли;
Попытка
ПроверитьФорму85();
Если Не ЭтаФорма.ЗаписатьВФорме() Тогда
ВызватьИсключение "Запись своей копии отменена: повтор не выполняется";
КонецЕсли;
После = БухНакладнаяФормы85.ПрочитатьИсточник85();
Если После.Документ <> Источник85.Документ Или После.Счет <> Источник85.Счет Или После.ТретьяСумма <> Источник85.ТретьяСумма
Или После.Счета.Количество() <> 2 Или После.Счета[1].Ссылка <> Счет85.Ссылка Или Счет85.ЭтоНовый()
Или После.Пользователь <> Источник85.Пользователь Тогда
ВызватьИсключение "Свежий полный источник не подтвердил единственную собственную новую копию";
КонецЕсли;
Записано85 = Истина;
Протокол85 = "Два собственных счёта85/86; три прежние проводки остались на85. Новая копия сохранена; повтор и удаление не выполняются.";
Исключение
Остановка85 = Истина;
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
Процедура ПередЗаписью(Отказ)
Попытка
ПроверитьФорму85();
Исключение
Остановка85 = Истина;
Отказ = Истина;
ВызватьИсключение;
КонецПопытки;
КонецПроцедурыБухНакладнаяФормы85
Общие → Общие модули → БухНакладнаяФормы85 → Модуль
Сервер и толстый обычный клиент; общий модуль только данных
Функция ПроверитьСтенд85() Экспорт
Если Метаданные.РежимСовместимости <> Метаданные.СвойстваОбъектов.РежимСовместимости.НеИспользовать Или СтрокаСоединенияИнформационнойБазы() <> "File=""C:\1c-labs\OwnAccountingInvoiceForms85_a4e6fa9e-85cd-4daf-a4c0-e89b9fe48373\IB"";" Тогда
ВызватьИсключение "Откройте только новый собственный учебный стенд 8.5.1.1343";
КонецЕсли;
Пользователи = ПользователиИнформационнойБазы.ПолучитьПользователей();
Текущий = ПользователиИнформационнойБазы.ТекущийПользователь();
Если Пользователи.Количество() <> 1 Или Текущий = Неопределено Тогда
ВызватьИсключение "Требуется единственный реальный пользователь учебной базы";
КонецЕсли;
Если Текущий.Имя <> "БухФормы85Ученик" Или Пользователи[0].УникальныйИдентификатор <> Текущий.УникальныйИдентификатор Тогда
ВызватьИсключение "Не совпал реальный пользователь учебной базы";
КонецЕсли;
Соединения = ПолучитьСоединенияИнформационнойБазы();
Если Соединения.Количество() <> 1 Тогда
ВызватьИсключение "Закройте Конфигуратор и другие соединения: требуется одно собственное соединение";
КонецЕсли;
Соединение = Соединения[0];
Если ТипЗнч(Соединение) <> Тип("СоединениеИнформационнойБазы") Тогда
ВызватьИсключение "Получено неизвестное описание соединения";
КонецЕсли;
Если Соединение.НомерСоединения <> НомерСоединенияИнформационнойБазы() Тогда
ВызватьИсключение "Единственное соединение не совпало с текущим собственным соединением";
КонецЕсли;
ПользовательСоединения = Соединение.Пользователь;
Если ТипЗнч(ПользовательСоединения) <> Тип("ПользовательИнформационнойБазы") Тогда
ВызватьИсключение "Неизвестный пользователь собственного соединения";
КонецЕсли;
Если ПользовательСоединения.УникальныйИдентификатор <> Текущий.УникальныйИдентификатор Тогда
ВызватьИсключение "Соединение принадлежит другому пользователю";
КонецЕсли;
Если Метаданные.Документы.Количество() <> 1 Или Метаданные.ПланыСчетов.Количество() <> 1
Или Метаданные.РегистрыБухгалтерии.Количество() <> 1 Или Метаданные.ОбщиеМодули.Количество() <> 1
Или Метаданные.ОбщиеФормы.Количество() <> 1 Или Метаданные.Справочники.Количество() <> 0
Или Метаданные.ПланыВидовХарактеристик.Количество() <> 0 Или Метаданные.РегистрыСведений.Количество() <> 0
Или Метаданные.РегистрыНакопления.Количество() <> 0 Или Метаданные.РегистрыРасчета.Количество() <> 0
Или Метаданные.ПодпискиНаСобытия.Количество() <> 0 Или Метаданные.РегламентныеЗадания.Количество() <> 0 Тогда
ВызватьИсключение "Состав учебной конфигурации отличается";
КонецЕсли;
РегистрМД = Метаданные.РегистрыБухгалтерии.ПроводкиНакладной85;
СчетаМД = Метаданные.ПланыСчетов.СчетаНакладной85;
ДокументМД = Метаданные.Документы.РегистраторНакладной85;
Если РегистрМД.Корреспонденция Или РегистрМД.ПланСчетов <> СчетаМД Или РегистрМД.ДлинаУточненияПериода <> 0
Или СчетаМД.МаксКоличествоСубконто <> 0 Или СчетаМД.Формы.Количество() <> 2
Или РегистрМД.Формы.Количество() <> 2 Или РегистрМД.Измерения.Количество() <> 2
Или РегистрМД.Ресурсы.Количество() <> 1 Или РегистрМД.Реквизиты.Количество() <> 0
Или ДокументМД.Проведение <> Метаданные.СвойстваОбъектов.Проведение.Запретить
Или ДокументМД.Движения.Количество() <> 1 Или Не ДокументМД.Движения.Содержит(РегистрМД) Тогда
ВызватьИсключение "Нужен собственный регистр без корреспонденции и субконто";
КонецЕсли;
Если РасширенияКонфигурации.Получить(, ИсточникРасширенийКонфигурации.БазаДанных).Количество() <> 0
Или РасширенияКонфигурации.Получить(, ИсточникРасширенийКонфигурации.СеансАктивные).Количество() <> 0
Или РасширенияКонфигурации.Получить(, ИсточникРасширенийКонфигурации.СеансОтключенные).Количество() <> 0 Тогда
ВызватьИсключение "Учебная база должна быть без расширений";
КонецЕсли;
Возврат Текущий.УникальныйИдентификатор;
КонецФункции
Функция Таблица85(Текст)
Запрос = Новый Запрос;
Запрос.Текст = Текст;
Возврат Запрос.Выполнить().Выгрузить();
КонецФункции
Функция ПрочитатьИсточник85() Экспорт
Пользователь = ПроверитьСтенд85();
Документы = Таблица85("ВЫБРАТЬ Ссылка, Номер, Дата, Проведен, ПометкаУдаления, Маркер85 ИЗ Документ.РегистраторНакладной85");
Счета = Таблица85("ВЫБРАТЬ Ссылка, Код, Наименование, Вид, Забалансовый, Предопределенный, ПометкаУдаления, Маркер85 ИЗ ПланСчетов.СчетаНакладной85 УПОРЯДОЧИТЬ ПО Код");
Строки = Таблица85("ВЫБРАТЬ Период, Регистратор, НомерСтроки, Активность, ВидДвижения, Счет, Код85, Маркер85, Сумма85 ИЗ РегистрБухгалтерии.ПроводкиНакладной85 УПОРЯДОЧИТЬ ПО НомерСтроки");
Если Документы.Количество() <> 1 Или Счета.Количество() < 1 Или Счета.Количество() > 2 Или Строки.Количество() <> 3 Тогда
ВызватьИсключение "Нужен один свой документ, один или два известных счета и три проводки";
КонецЕсли;
Док = Документы[0];
Если ТипЗнч(Док.Ссылка) <> Тип("ДокументСсылка.РегистраторНакладной85") Или Док.Ссылка.Пустая()
Или Док.Номер <> "INV85" Или Док.Дата <> Дата(2026, 10, 10, 12, 0, 0) Или Док.Проведен Или Док.ПометкаУдаления
Или Док.Маркер85 <> "a4e6fa9e-85cd-4daf-a4c0-e89b9fe48373" Тогда
ВызватьИсключение "Изменился реальный собственный документ";
КонецЕсли;
Основной = Счета[0];
Для Индекс = 0 По Счета.Количество() - 1 Цикл
Счет = Счета[Индекс];
Если ТипЗнч(Счет.Ссылка) <> Тип("ПланСчетовСсылка.СчетаНакладной85") Или Счет.Ссылка.Пустая()
Или Счет.Код <> ?(Индекс = 0, "85", "86") Или Счет.Наименование <> ?(Индекс = 0, "Учебная накладная", "Учебная копия INV85")
Или Счет.Вид <> ВидСчета.Активный Или Счет.Забалансовый Или Счет.Предопределенный Или Счет.ПометкаУдаления
Или Счет.Маркер85 <> "a4e6fa9e-85cd-4daf-a4c0-e89b9fe48373" Тогда
ВызватьИсключение "Состав или данные собственных счетов изменены";
КонецЕсли;
КонецЦикла;
ТретьяСумма = Строки[2].Сумма85;
Если ТретьяСумма <> 100 И ТретьяСумма <> 200 Тогда
ВызватьИсключение "Допустимы только два известных состояния третьей проводки";
КонецЕсли;
Снимок = Новый ФиксированнаяСтруктура("Документ,Счет,ТретьяСумма,Счета,Строки,Пользователь", Док.Ссылка, Основной.Ссылка, ТретьяСумма, Счета, Строки, Пользователь);
ПроверитьСтроки85(Строки, Снимок, ТретьяСумма, Ложь);
Если ПроверитьСтенд85() <> Пользователь Тогда
ВызватьИсключение "Реальный пользователь изменился во время чтения";
КонецЕсли;
Возврат Снимок;
КонецФункции
Функция ПроверитьСтроки85(Строки, Источник, ТретьяСумма, Черновик) Экспорт
Если Строки.Количество() <> ?(Черновик, 4, 3) Тогда
ВызватьИсключение "Не совпало полное число собственных строк";
КонецЕсли;
СуммаВсех = 0;
Остаток = 0;
Для Индекс = 0 По Строки.Количество() - 1 Цикл
Строка = Строки[Индекс];
Код = ?(Индекс = 0, "A", ?(Индекс = 1, "A10", ?(Индекс = 2, "B", "B2")));
Сумма = ?(Индекс = 0, 1000, ?(Индекс = 1, 250, ?(Индекс = 2, ТретьяСумма, 75)));
Движение = ?(Индекс = 0, ВидДвиженияБухгалтерии.Дебет, ВидДвиженияБухгалтерии.Кредит);
Если Строка.Период <> Дата(2026, 10, 10, 12, 0, 0) Или Строка.Регистратор <> Источник.Документ
Или Не Строка.Активность Или Строка.ВидДвижения <> Движение Или Строка.Счет <> Источник.Счет
Или Строка.Код85 <> Код Или Строка.Маркер85 <> "a4e6fa9e-85cd-4daf-a4c0-e89b9fe48373" Или Строка.Сумма85 <> Сумма Тогда
ВызватьИсключение "Изменено хотя бы одно из всех значений собственной проводки";
КонецЕсли;
Если Индекс < 3 И Строка.НомерСтроки <> Индекс + 1 Тогда
ВызватьИсключение "Нарушены реальные номера трёх сохранённых проводок";
КонецЕсли;
СуммаВсех = СуммаВсех + Строка.Сумма85;
Остаток = Остаток + ?(Строка.ВидДвижения = ВидДвиженияБухгалтерии.Дебет, Строка.Сумма85, -Строка.Сумма85);
КонецЦикла;
Если СуммаВсех <> 1250 + ТретьяСумма + ?(Черновик, 75, 0) Или Остаток <> 750 - ТретьяСумма - ?(Черновик, 75, 0) Тогда
ВызватьИсключение "Числа не получены из всех фактически прочитанных проводок";
КонецЕсли;
Возврат Новый ФиксированнаяСтруктура("Сумма,Остаток", СуммаВсех, Остаток);
КонецФункции
Процедура ПроверитьИсточник85(До) Экспорт
Сейчас = ПрочитатьИсточник85();
Если Сейчас.Документ <> До.Документ Или Сейчас.Счет <> До.Счет Или Сейчас.ТретьяСумма <> До.ТретьяСумма
Или Сейчас.Счета.Количество() <> До.Счета.Количество() Или Сейчас.Пользователь <> До.Пользователь Тогда
ВызватьИсключение "Сохранённые данные изменились между шагами: продолжение запрещено";
КонецЕсли;
Для Индекс = 0 По До.Счета.Количество() - 1 Цикл
Если Сейчас.Счета[Индекс].Ссылка <> До.Счета[Индекс].Ссылка Тогда
ВызватьИсключение "Заменён реальный собственный счёт";
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Функция СвойНабор85(Источник) Экспорт
ПроверитьИсточник85(Источник);
Набор = РегистрыБухгалтерии.ПроводкиНакладной85.СоздатьНаборЗаписей();
Если ТипЗнч(Набор) <> Тип("РегистрБухгалтерииНаборЗаписей.ПроводкиНакладной85") Или Набор.Количество() <> 0 Тогда
ВызватьИсключение "Фабрика не вернула новый собственный пустой набор";
КонецЕсли;
Набор.Отбор.Регистратор.Установить(Источник.Документ, Истина);
Набор.Прочитать();
ПроверитьСтроки85(Набор, Источник, Источник.ТретьяСумма, Ложь);
Возврат Набор;
КонецФункции
Процедура ПроверитьЗаписьНабора85(Набор) Экспорт
Источник = ПрочитатьИсточник85();
Если ТипЗнч(Набор) <> Тип("РегистрБухгалтерииНаборЗаписей.ПроводкиНакладной85")
Или Не Набор.Отбор.Регистратор.Использование Или Набор.Отбор.Регистратор.Значение <> Источник.Документ Тогда
ВызватьИсключение "Запрещена запись другого набора или другой области";
КонецЕсли;
ПроверитьСтроки85(Набор, Источник, ?(Источник.ТретьяСумма = 100, 200, 100), Ложь);
КонецПроцедуры
Процедура ПроверитьКопию85(Счет, Источник) Экспорт
Если ТипЗнч(Счет) <> Тип("ПланСчетовОбъект.СчетаНакладной85") Или Счет.Код <> "86"
Или Счет.Наименование <> "Учебная копия INV85" Или Счет.Вид <> ВидСчета.Активный
Или Счет.Забалансовый Или Счет.ПометкаУдаления Или Счет.ВидыСубконто.Количество() <> 0
Или Счет.Маркер85 <> "a4e6fa9e-85cd-4daf-a4c0-e89b9fe48373" Или Источник.Счета.Количество() <> 1 Тогда
ВызватьИсключение "Копия счёта или исходные данные не соответствуют своей подготовке";
КонецЕсли;
ПроверитьИсточник85(Источник);
КонецПроцедурыПультНакладной85
Общие → Общие формы → ПультНакладной85 → Модуль
Толстый клиент, обычное приложение
Перем Остановка85;
Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
Попытка
Источник = БухНакладнаяФормы85.ПрочитатьИсточник85();
Если Источник.ТретьяСумма <> 100 Тогда
ВызватьИсключение "Для нового процесса требуется сохранённый расход100";
КонецЕсли;
Остановка85 = Ложь;
Протокол85 = "Начальный источник1350/650. Сначала Набор, затем Журнал и Копия, затем Счета. Закрывайте предыдущую дочернюю форму.";
Исключение
Остановка85 = Истина;
Отказ = Истина;
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
Процедура Открыть85(Кнопка)
Если Остановка85 Или (Кнопка <> ЭлементыФормы.Набор85 И Кнопка <> ЭлементыФормы.Журнал85
И Кнопка <> ЭлементыФормы.Счета85 И Кнопка <> ЭлементыФормы.Копия85) Тогда
Остановка85 = Истина;
ВызватьИсключение "Неизвестная команда или остановленный пульт";
КонецЕсли;
Попытка
Источник = БухНакладнаяФормы85.ПрочитатьИсточник85();
Если Кнопка = ЭлементыФормы.Набор85 Тогда
Набор = БухНакладнаяФормы85.СвойНабор85(Источник);
Форма = Набор.ПолучитьФорму("Набор85", ЭтаФорма, Новый УникальныйИдентификатор);
Если Форма = Неопределено Тогда
ВызватьИсключение "Не создана форма собственного набора";
КонецЕсли;
Если Форма.ВладелецФормы <> ЭтаФорма Или Форма.Набор85 <> Набор Тогда
ВызватьИсключение "Вернулась форма другого владельца или набора";
КонецЕсли;
Форма.Подготовить85(Источник, Набор);
ИначеЕсли Кнопка = ЭлементыФормы.Журнал85 Тогда
Форма = РегистрыБухгалтерии.ПроводкиНакладной85.ПолучитьФормуСписка();
Если Форма = Неопределено Тогда
ВызватьИсключение "Не получена основная форма собственного журнала";
КонецЕсли;
Форма.Подготовить85(Источник);
ИначеЕсли Кнопка = ЭлементыФормы.Счета85 Тогда
Форма = ПланыСчетов.СчетаНакладной85.ПолучитьФормуСписка("Список85", ЭтаФорма, Новый УникальныйИдентификатор);
Если Форма = Неопределено Тогда
ВызватьИсключение "Не создан список своих счетов";
КонецЕсли;
Если Форма.ВладелецФормы <> ЭтаФорма Тогда
ВызватьИсключение "Список счетов имеет другого владельца";
КонецЕсли;
Форма.Подготовить85(Источник);
Иначе
Если Источник.Счета.Количество() <> 1 Или Источник.ТретьяСумма <> 100 Тогда
ВызватьИсключение "Копию создаём один раз только после восстановления расхода100";
КонецЕсли;
Копия = Источник.Счет.ПолучитьОбъект().Скопировать();
Копия.Код = "86";
Копия.Наименование = "Учебная копия INV85";
БухНакладнаяФормы85.ПроверитьКопию85(Копия, Источник);
Форма = Копия.ПолучитьФорму("Счет85", ЭтаФорма, Новый УникальныйИдентификатор);
Если Форма = Неопределено Тогда
ВызватьИсключение "Не создана форма собственной копии";
КонецЕсли;
Если Форма.ВладелецФормы <> ЭтаФорма Или Форма.Счет85 <> Копия Тогда
ВызватьИсключение "Не совпали владелец и настоящий объект копии";
КонецЕсли;
Форма.Подготовить85(Источник, Копия);
КонецЕсли;
Если ТипЗнч(Форма) <> Тип("Форма") Или Форма.Открыта() Тогда
ВызватьИсключение "Нельзя переиспользовать уже открытую форму";
КонецЕсли;
Форма.Открыть();
Исключение
Остановка85 = Истина;
Протокол85 = "Отказ. Новые попытки, очистка и удаление собственных данных автоматически не выполняются.";
ВызватьИсключение;
КонецПопытки;
КонецПроцедурыНабор85
Регистры бухгалтерии → ПроводкиНакладной85 → Формы → Набор85 → Модуль
Толстый клиент, обычное приложение
Перем Источник85, СвойНабор85, Этап85, Остановка85;
Процедура Подготовить85(Источник, Набор) Экспорт
Если Источник85 <> Неопределено Или ТипЗнч(Набор) <> Тип("РегистрБухгалтерииНаборЗаписей.ПроводкиНакладной85") Или Набор85 <> Набор Тогда
Остановка85 = Истина;
ВызватьИсключение "Форма уже использована или содержит другой набор";
КонецЕсли;
БухНакладнаяФормы85.ПроверитьИсточник85(Источник);
Если Источник.ТретьяСумма <> 100 Тогда
Остановка85 = Истина;
ВызватьИсключение "Первый шаг начинается только с расхода100";
КонецЕсли;
Источник85 = Источник;
СвойНабор85 = Набор;
Этап85 = 0;
Остановка85 = Ложь;
КонецПроцедуры
Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
Попытка
ПроверитьФорму85();
Поле = ЭлементыФормы.Строки85;
Поле.ИзменятьПорядокСтрок = Ложь;
Поле.ПроверкаОтображенияНовойСтроки = ВариантПроверкиОтображенияНовойСтроки.СообщатьОНесоответствииОтбору;
Поле.Колонки.Сумма85.ОтображатьИтогиВПодвале = Истина;
Поле.Колонки.НомерСтроки.ОтображатьСтандартнуюКартинку = Истина;
Поле.НастройкаОтбораСтрок.Код85.Доступность = Ложь;
ПроверитьПолитику85();
Протокол85 = "Три сохранённые строки: сумма1350, остаток650. Нажмите Отбор.";
Исключение
Остановка85 = Истина;
Отказ = Истина;
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
Процедура ПроверитьФорму85()
Если Остановка85 Или Источник85 = Неопределено Или СвойНабор85 <> Набор85
Или ТипЗнч(Набор85) <> Тип("РегистрБухгалтерииНаборЗаписей.ПроводкиНакладной85")
Или ТипЗнч(ЭлементыФормы.Строки85) <> Тип("ТабличноеПоле")
Или ЭлементыФормы.Строки85.Данные <> "Набор85" Или ЭлементыФормы.Строки85.Значение <> Набор85
Или ЭлементыФормы.Строки85.Колонки.Сумма85.Данные <> "Сумма85"
Или ЭлементыФормы.Строки85.Колонки.НомерСтроки.Данные <> "НомерСтроки" Тогда
Остановка85 = Истина;
ВызватьИсключение "Изменились собственная форма, набор или привязка колонок";
КонецЕсли;
БухНакладнаяФормы85.ПроверитьИсточник85(Источник85);
КонецПроцедуры
Процедура ПроверитьПолитику85()
Поле = ЭлементыФормы.Строки85;
Если Поле.ИзменятьПорядокСтрок Или Поле.ПроверкаОтображенияНовойСтроки <> ВариантПроверкиОтображенияНовойСтроки.СообщатьОНесоответствииОтбору
Или Не Поле.Колонки.Сумма85.ОтображатьИтогиВПодвале Или Не Поле.Колонки.НомерСтроки.ОтображатьСтандартнуюКартинку
Или Поле.НастройкаОтбораСтрок.Код85.Доступность Тогда
Остановка85 = Истина;
ВызватьИсключение "Политика своего табличного поля изменена";
КонецЕсли;
КонецПроцедуры
Процедура Шаг85(Кнопка)
Если Остановка85 Или Кнопка <> ЭлементыФормы.Шаг85 Или Кнопка.Имя <> "Шаг85"
Или (Этап85 <> 0 И Этап85 <> 1 И Этап85 <> 2 И Этап85 <> 3 И Этап85 <> 4 И Этап85 <> 5) Тогда
Остановка85 = Истина;
ВызватьИсключение "Неизвестная команда или повтор завершённого процесса";
КонецЕсли;
Попытка
ПроверитьФорму85();
ПроверитьПолитику85();
Поле = ЭлементыФормы.Строки85;
Если Этап85 = 0 Тогда
БухНакладнаяФормы85.ПроверитьСтроки85(Набор85, Источник85, 100, Ложь);
Поле.ОтборСтрок.Код85.Установить("A", Истина);
ПроверитьОтбор85();
Этап85 = 1;
Протокол85 = "Отобраны A и A10: две реальные строки, сумма1250. БД остаётся1350/650. Следующий Шаг покажет несохранённое исправление и перечитывание формы.";
ИначеЕсли Этап85 = 1 Тогда
БухНакладнаяФормы85.ПроверитьСтроки85(Набор85, Источник85, 100, Ложь);
Набор85[2].Сумма85 = 150;
БухНакладнаяФормы85.ПроверитьСтроки85(Набор85, Источник85, 150, Ложь);
ПроверитьОтбор85();
ЭтаФорма.Обновить();
БухНакладнаяФормы85.ПроверитьСтроки85(Набор85, Источник85, 100, Ложь);
Этап85 = 2;
Протокол85 = "Обновление формы перечитало БД:1350/650. Добавьте свой черновик B2:расход75, все остальные поля как уB. Нажмите Шаг после завершения ввода.";
ИначеЕсли Этап85 = 2 Тогда
БухНакладнаяФормы85.ПроверитьСтроки85(Набор85, Источник85, 100, Истина);
Черновик = Набор85[3];
Если Поле.ПроверитьСтроку(Черновик) Тогда
ВызватьИсключение "Черновик B2 неожиданно соответствует фильтруA";
КонецЕсли;
Поле.Обновить();
БухНакладнаяФормы85.ПроверитьСтроки85(Набор85, Источник85, 100, Ложь);
Этап85 = 3;
Протокол85 = "Обновление поля перечитало3строки:1350/650; несохранённый черновик75 не записан. Снимите фильтр кнопкой Шаг.";
ИначеЕсли Этап85 = 3 Тогда
БухНакладнаяФормы85.ПроверитьСтроки85(Набор85, Источник85, 100, Ложь);
Поле.ОтборСтрок.Код85.Использование = Ложь;
Если Поле.ОтборСтрок.Код85.Использование Тогда
ВызватьИсключение "Свой фильтр не отключён";
КонецЕсли;
Этап85 = 4;
Протокол85 = "Измените только расходB:100→200, затем Шаг для собственной записи.";
Иначе
НоваяСумма = ?(Этап85 = 4, 200, 100);
БухНакладнаяФормы85.ПроверитьСтроки85(Набор85, Источник85, НоваяСумма, Ложь);
Если Не ЭтаФорма.ЗаписатьВФорме() Тогда
ВызватьИсключение "Запись отменена: не продолжаем и не повторяем";
КонецЕсли;
После = БухНакладнаяФормы85.ПрочитатьИсточник85();
Если После.Документ <> Источник85.Документ Или После.Счет <> Источник85.Счет
Или После.Счета.Количество() <> Источник85.Счета.Количество() Или После.ТретьяСумма <> НоваяСумма
Или После.Пользователь <> Источник85.Пользователь Тогда
ВызватьИсключение "Полный новый источник не подтвердил собственную запись";
КонецЕсли;
НаборПроверки = БухНакладнаяФормы85.СвойНабор85(После);
Результат = БухНакладнаяФормы85.ПроверитьСтроки85(НаборПроверки, После, НоваяСумма, Ложь);
Источник85 = После;
Этап85 = Этап85 + 1;
Протокол85 = ?(Этап85 = 5, "Записано1450/550. Теперь изменитеB:200→100 и нажмитеШаг.", "Восстановлено1350/650. Процесс завершён; повтор запрещён.");
Если Результат.Остаток <> ?(НоваяСумма = 200, 550, 650) Тогда
ВызватьИсключение "Независимый свежий набор не подтвердил вычисленный остаток";
КонецЕсли;
КонецЕсли;
ПроверитьФорму85();
ПроверитьПолитику85();
Исключение
Остановка85 = Истина;
Протокол85 = "Отказ. Возможны частичные изменения только своего буфера или данных. Нет автоматического сброса и повтора.";
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
Процедура ПроверитьОтбор85()
Поле = ЭлементыФормы.Строки85;
Если Не Поле.ОтборСтрок.Код85.Использование Или Поле.ОтборСтрок.Код85.Значение <> "A" Тогда
ВызватьИсключение "Изменён собственный фильтр";
КонецЕсли;
Сумма = 0;
Число = 0;
Для Каждого Запись Из Набор85 Цикл
Подходит = Поле.ПроверитьСтроку(Запись);
Если Подходит <> (Запись.Код85 = "A" Или Запись.Код85 = "A10") Тогда
ВызватьИсключение "Реальная проверка строки не подтвердила вхождениеA";
КонецЕсли;
Если Подходит Тогда
Данные = Поле.ДанныеСтроки(Запись);
Если Данные = Неопределено Или Данные.Период <> Запись.Период Или Данные.Регистратор <> Запись.Регистратор
Или Данные.НомерСтроки <> Запись.НомерСтроки Или Данные.Активность <> Запись.Активность
Или Данные.ВидДвижения <> Запись.ВидДвижения Или Данные.Счет <> Запись.Счет
Или Данные.Код85 <> Запись.Код85 Или Данные.Маркер85 <> Запись.Маркер85 Или Данные.Сумма85 <> Запись.Сумма85 Тогда
ВызватьИсключение "Данные реальной строки поля отличаются от полного собственного набора";
КонецЕсли;
Число = Число + 1;
Сумма = Сумма + Данные.Сумма85;
КонецЕсли;
КонецЦикла;
Если Число <> 2 Или Сумма <> 1250 Тогда
ВызватьИсключение "Реальные строки поля не подтвердили2/1250";
КонецЕсли;
КонецПроцедуры
Процедура ПередЗаписью(Отказ)
Попытка
Если Остановка85 Или (Этап85 <> 4 И Этап85 <> 5) Тогда
ВызватьИсключение "Запись допустима только на двух явных шагах";
КонецЕсли;
ПроверитьФорму85();
ПроверитьПолитику85();
БухНакладнаяФормы85.ПроверитьЗаписьНабора85(Набор85);
Исключение
Остановка85 = Истина;
Отказ = Истина;
ВызватьИсключение;
КонецПопытки;
КонецПроцедурыЖурнал85
Регистры бухгалтерии → ПроводкиНакладной85 → Формы → Журнал85 → Модуль
Толстый клиент, обычное приложение
Перем Источник85, Остановка85;
Процедура Подготовить85(Источник) Экспорт
Если Источник85 <> Неопределено Или ЭтаФорма.Открыта() Тогда
Остановка85 = Истина;
ВызватьИсключение "Журнал уже открыт или ранее использован";
КонецЕсли;
БухНакладнаяФормы85.ПроверитьИсточник85(Источник);
Источник85 = Источник;
Остановка85 = Ложь;
Ключ = РегистрыБухгалтерии.ПроводкиНакладной85.СоздатьКлючЗаписи(Новый Структура("Регистратор,НомерСтроки", Источник.Документ, 2));
Если ТипЗнч(Ключ) <> Тип("РегистрБухгалтерииКлючЗаписи.ПроводкиНакладной85") Или Ключ.Регистратор <> Источник.Документ Или Ключ.НомерСтроки <> 2 Тогда
Остановка85 = Истина;
ВызватьИсключение "Не получен действительный собственный ключ строки2";
КонецЕсли;
ЭтаФорма.ПараметрОтборПоРегистратору = Источник.Документ;
ЭтаФорма.ПараметрТекущаяСтрока = Ключ;
Если ЭтаФорма.ПараметрОтборПоРегистратору <> Источник.Документ Или ЭтаФорма.ПараметрТекущаяСтрока <> Ключ Тогда
Остановка85 = Истина;
ВызватьИсключение "Начальные параметры своего журнала не установлены";
КонецЕсли;
КонецПроцедуры
Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
Попытка
Если Остановка85 Или Источник85 = Неопределено Или ТипЗнч(Список85) <> Тип("РегистрБухгалтерииСписок.ПроводкиНакладной85")
Или ЭтаФорма.ПараметрОтборПоРегистратору <> Источник85.Документ Тогда
ВызватьИсключение "Не подготовлены собственный журнал и его область";
КонецЕсли;
БухНакладнаяФормы85.ПроверитьИсточник85(Источник85);
Список85.Колонки.Установить("Регистратор,НомерСтроки,Период,Активность,ВидДвижения,Счет,Код85,Маркер85,Сумма85");
ЭлементыФормы.Строки85.СоздатьКолонки();
Поле = ЭлементыФормы.Строки85;
Если ТипЗнч(Поле) <> Тип("ТабличноеПоле") Или Поле.Данные <> "Список85" Или Поле.Значение <> Список85
Или Поле.Колонки.НомерСтроки.Данные <> "НомерСтроки" Тогда
ВызватьИсключение "Табличное поле не связано с собственным бухгалтерским списком";
КонецЕсли;
Поле.ТолькоПросмотр = Истина;
Поле.Колонки.НомерСтроки.ОтображатьСтандартнуюКартинку = Истина;
Исключение
Остановка85 = Истина;
Отказ = Истина;
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
Процедура Проверить85(Кнопка)
Если Остановка85 Или Кнопка <> ЭлементыФормы.Проверить85 Или Кнопка.Имя <> "Проверить85" Тогда
Остановка85 = Истина;
ВызватьИсключение "Неизвестная команда или остановленный журнал";
КонецЕсли;
Попытка
БухНакладнаяФормы85.ПроверитьИсточник85(Источник85);
Поле = ЭлементыФормы.Строки85;
Если Поле.Данные <> "Список85" Или Поле.Значение <> Список85 Или Не Поле.ТолькоПросмотр
Или Не Поле.Колонки.НомерСтроки.ОтображатьСтандартнуюКартинку
Или Не Список85.Отбор.Регистратор.Использование Или Список85.Отбор.Регистратор.Значение <> Источник85.Документ Тогда
ВызватьИсключение "Изменены собственные данные или область журнала";
КонецЕсли;
Ключ = Поле.ТекущаяСтрока;
Данные = Поле.ТекущиеДанные;
Если Ключ = Неопределено Или Данные = Неопределено Или Ключ.Регистратор <> Источник85.Документ Или Ключ.НомерСтроки <> 2
Или Данные.Код85 <> "A10" Или Данные.Сумма85 <> 250 Тогда
ВызватьИсключение "Журнал ещё не доставил ожидаемую действительную строку2; не подставляйте данные запроса";
КонецЕсли;
Число = 0;
Сумма = 0;
Для Каждого Строка Из Источник85.Строки Цикл
КлючСтроки = РегистрыБухгалтерии.ПроводкиНакладной85.СоздатьКлючЗаписи(Новый Структура("Регистратор,НомерСтроки", Строка.Регистратор, Строка.НомерСтроки));
Если Не Поле.ПроверитьСтроку(КлючСтроки) Тогда
ВызватьИсключение "Одна из собственных строк скрыта незнакомым условием";
КонецЕсли;
Ячейки = Поле.ДанныеСтроки(КлючСтроки);
Если Ячейки = Неопределено Или Ячейки.Регистратор <> Строка.Регистратор Или Ячейки.НомерСтроки <> Строка.НомерСтроки
Или Ячейки.Период <> Строка.Период Или Ячейки.Активность <> Строка.Активность Или Ячейки.ВидДвижения <> Строка.ВидДвижения
Или Ячейки.Счет <> Строка.Счет Или Ячейки.Код85 <> Строка.Код85 Или Ячейки.Маркер85 <> Строка.Маркер85 Или Ячейки.Сумма85 <> Строка.Сумма85 Тогда
ВызватьИсключение "Не получено полное совпадение реальных ячеек своего журнала";
КонецЕсли;
Число = Число + 1;
Сумма = Сумма + Ячейки.Сумма85;
КонецЦикла;
Если Число <> 3 Или Сумма <> 1250 + Источник85.ТретьяСумма Тогда
ВызватьИсключение "Не подтвердился полный собственный журнал";
КонецЕсли;
Протокол85 = "Получены все3реальные строки. Строка2=A10/250. Сумма=" + Формат(Сумма, "ЧДЦ=0;ЧГ=0");
Исключение
Остановка85 = Истина;
ВызватьИсключение;
КонецПопытки;
КонецПроцедурыСписокСчетов85
Планы счетов → СчетаНакладной85 → Формы → Список85 → Модуль
Толстый клиент, обычное приложение
Перем Источник85, Остановка85;
Процедура Подготовить85(Источник) Экспорт
Если Источник85 <> Неопределено Или ЭтаФорма.Открыта() Тогда
Остановка85 = Истина;
ВызватьИсключение "Список счетов уже использован";
КонецЕсли;
БухНакладнаяФормы85.ПроверитьИсточник85(Источник);
Источник85 = Источник;
Остановка85 = Ложь;
ЭтаФорма.ПараметрТекущаяСтрока = Источник.Счет;
Если ЭтаФорма.ПараметрТекущаяСтрока <> Источник.Счет Тогда
Остановка85 = Истина;
ВызватьИсключение "Собственное начальное позиционирование не задано";
КонецЕсли;
КонецПроцедуры
Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
Попытка
Если Остановка85 Или Источник85 = Неопределено Или ТипЗнч(Список85) <> Тип("ПланСчетовСписок.СчетаНакладной85") Тогда
ВызватьИсключение "Нужен собственный список счетов";
КонецЕсли;
БухНакладнаяФормы85.ПроверитьИсточник85(Источник85);
Список85.Колонки.Установить("Ссылка,Код,Наименование,Вид,Забалансовый,ПометкаУдаления,Маркер85");
ЭлементыФормы.Счета85.СоздатьКолонки();
Поле = ЭлементыФормы.Счета85;
Если ТипЗнч(Поле) <> Тип("ТабличноеПоле") Или Поле.Данные <> "Список85" Или Поле.Значение <> Список85
Или Поле.Колонки.Наименование.Данные <> "Наименование"
Или ТипЗнч(ЭлементыФормы.Выбор85) <> Тип("ПолеВвода") Или ЭлементыФормы.Выбор85.Данные <> "ВыбранныйСчет85" Тогда
ВызватьИсключение "Не совпали настоящие привязки своих элементов формы";
КонецЕсли;
Поле.ТолькоПросмотр = Истина;
Поле.Колонки.Наименование.ОтображатьСтандартнуюКартинку = Истина;
ВыбранныйСчет85 = Источник85.Счет;
ЭлементыФормы.Выбор85.БыстрыйВыбор = Истина;
Если Не Поле.Колонки.Наименование.ОтображатьСтандартнуюКартинку Или Не ЭлементыФормы.Выбор85.БыстрыйВыбор
Или ЭлементыФормы.Выбор85.Значение <> ВыбранныйСчет85 Тогда
ВызватьИсключение "Политика или реальное значение своего поля не подтверждены";
КонецЕсли;
Исключение
Остановка85 = Истина;
Отказ = Истина;
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
Процедура Проверить85(Кнопка)
Если Остановка85 Или Кнопка <> ЭлементыФормы.Проверить85 Или Кнопка.Имя <> "Проверить85" Тогда
Остановка85 = Истина;
ВызватьИсключение "Неизвестная команда или остановленный список";
КонецЕсли;
Попытка
БухНакладнаяФормы85.ПроверитьИсточник85(Источник85);
Поле = ЭлементыФормы.Счета85;
Ввод = ЭлементыФормы.Выбор85;
Если Поле.Данные <> "Список85" Или Поле.Значение <> Список85 Или Не Поле.ТолькоПросмотр
Или Не Поле.Колонки.Наименование.ОтображатьСтандартнуюКартинку Или Ввод.Данные <> "ВыбранныйСчет85"
Или Не Ввод.БыстрыйВыбор Или Ввод.Значение <> ВыбранныйСчет85
Или ТипЗнч(ВыбранныйСчет85) <> Тип("ПланСчетовСсылка.СчетаНакладной85") Тогда
ВызватьИсключение "Изменён собственный выбор или его политика";
КонецЕсли;
Найден = Ложь;
Для Каждого Счет Из Источник85.Счета Цикл
Данные = Поле.ДанныеСтроки(Счет.Ссылка);
Если Данные = Неопределено Или Данные.Ссылка <> Счет.Ссылка Или Данные.Код <> Счет.Код Или Данные.Наименование <> Счет.Наименование
Или Данные.Вид <> Счет.Вид Или Данные.Забалансовый <> Счет.Забалансовый Или Данные.ПометкаУдаления <> Счет.ПометкаУдаления
Или Данные.Маркер85 <> Счет.Маркер85 Тогда
ВызватьИсключение "Фактические данные списка счетов не совпали с собственным источником";
КонецЕсли;
Если Счет.Ссылка = ВыбранныйСчет85 Тогда
Найден = Истина;
КонецЕсли;
КонецЦикла;
Если Не Найден Тогда
ВызватьИсключение "Выбрана неизвестная ссылка: ничего по ней не изменяем";
КонецЕсли;
Итог = 0;
Для Каждого Проводка Из Источник85.Строки Цикл
Если Проводка.Счет = ВыбранныйСчет85 Тогда
Итог = Итог + ?(Проводка.ВидДвижения = ВидДвиженияБухгалтерии.Дебет, Проводка.Сумма85, -Проводка.Сумма85);
КонецЕсли;
КонецЦикла;
Если Итог <> ?(ВыбранныйСчет85 = Источник85.Счет, 750 - Источник85.ТретьяСумма, 0) Тогда
ВызватьИсключение "Сумма реальных проводок выбранного счёта не подтвердилась";
КонецЕсли;
Протокол85 = "Выбранный счёт " + ВыбранныйСчет85.Код + ": знаковая сумма проводок=" + Формат(Итог, "ЧДЦ=0;ЧГ=0");
Исключение
Остановка85 = Истина;
ВызватьИсключение;
КонецПопытки;
КонецПроцедурыСчет85
Планы счетов → СчетаНакладной85 → Формы → Счет85 → Модуль
Толстый клиент, обычное приложение
Перем Источник85, СвояКопия85, Остановка85, Записано85;
Процедура Подготовить85(Источник, Копия) Экспорт
Если Источник85 <> Неопределено Или ЭтаФорма.Открыта() Или Счет85 <> Копия Тогда
Остановка85 = Истина;
ВызватьИсключение "Форма уже использована или содержит другой объект";
КонецЕсли;
БухНакладнаяФормы85.ПроверитьКопию85(Копия, Источник);
Источник85 = Источник;
СвояКопия85 = Копия;
Остановка85 = Ложь;
Записано85 = Ложь;
ЭтаФорма.ПараметрОбъектКопирования = Источник.Счет;
ЭтаФорма.ПараметрОснование = Источник.Документ;
КонецПроцедуры
Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Попытка
ПроверитьФорму85();
ИсходныйСчет = ЭтаФорма.ПараметрОбъектКопирования;
Основание = ЭтаФорма.ПараметрОснование;
Если ТипЗнч(ИсходныйСчет) <> Тип("ПланСчетовСсылка.СчетаНакладной85") Или ТипЗнч(Основание) <> Тип("ДокументСсылка.РегистраторНакладной85")
Или ИсходныйСчет <> Источник85.Счет Или Основание <> Источник85.Документ Тогда
ВызватьИсключение "Параметры указывают не на собственный счёт и документ";
КонецЕсли;
Протокол85 = "Свой потребитель параметров: копия счёта " + ИсходныйСчет.Код + " для документа " + Основание.Номер
+ ". Счёт86 ещё не записан. Нажмите Записать один раз.";
Исключение
Остановка85 = Истина;
Отказ = Истина;
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
Процедура ПроверитьФорму85()
Если Остановка85 Или Записано85 Или Источник85 = Неопределено Или Счет85 <> СвояКопия85 Или Не Счет85.ЭтоНовый()
Или ЭтаФорма.ПараметрОбъектКопирования <> Источник85.Счет Или ЭтаФорма.ПараметрОснование <> Источник85.Документ Тогда
Остановка85 = Истина;
ВызватьИсключение "Объект, параметры или состояние собственной формы изменены";
КонецЕсли;
БухНакладнаяФормы85.ПроверитьКопию85(Счет85, Источник85);
КонецПроцедуры
Процедура Записать85(Кнопка)
Если Остановка85 Или Записано85 Или Кнопка <> ЭлементыФормы.Записать85 Или Кнопка.Имя <> "Записать85" Тогда
Остановка85 = Истина;
ВызватьИсключение "Неизвестная команда или повтор записи запрещён";
КонецЕсли;
Попытка
ПроверитьФорму85();
Если Не ЭтаФорма.ЗаписатьВФорме() Тогда
ВызватьИсключение "Запись своей копии отменена: повтор не выполняется";
КонецЕсли;
После = БухНакладнаяФормы85.ПрочитатьИсточник85();
Если После.Документ <> Источник85.Документ Или После.Счет <> Источник85.Счет Или После.ТретьяСумма <> Источник85.ТретьяСумма
Или После.Счета.Количество() <> 2 Или После.Счета[1].Ссылка <> Счет85.Ссылка Или Счет85.ЭтоНовый()
Или После.Пользователь <> Источник85.Пользователь Тогда
ВызватьИсключение "Свежий полный источник не подтвердил единственную собственную новую копию";
КонецЕсли;
Записано85 = Истина;
Протокол85 = "Два собственных счёта85/86; три прежние проводки остались на85. Новая копия сохранена; повтор и удаление не выполняются.";
Исключение
Остановка85 = Истина;
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
Процедура ПередЗаписью(Отказ)
Попытка
ПроверитьФорму85();
Исключение
Остановка85 = Истина;
Отказ = Истина;
ВызватьИсключение;
КонецПопытки;
КонецПроцедурыМодульНабораЗаписей
Регистры бухгалтерии → ПроводкиНакладной85 → Модуль набора записей
Сервер и толстый клиент; модуль своего набора записей
Процедура ПередЗаписью(Отказ, Замещение)
Попытка
Если Не Замещение Тогда
ВызватьИсключение "Учебная запись только замещает три собственные строки";
КонецЕсли;
БухНакладнаяФормы85.ПроверитьЗаписьНабора85(ЭтотОбъект);
Исключение
Отказ = Истина;
ВызватьИсключение;
КонецПопытки;
КонецПроцедурыМодульСчета
Планы счетов → СчетаНакладной85 → Модуль объекта
Сервер и толстый клиент; объектный модуль собственного плана счетов
Процедура ПередЗаписью(Отказ)
Попытка
Если Не ЭтоНовый() Тогда
ВызватьИсключение "Пример не изменяет сохранённые счета";
КонецЕсли;
Источник = БухНакладнаяФормы85.ПрочитатьИсточник85();
БухНакладнаяФормы85.ПроверитьКопию85(ЭтотОбъект, Источник);
Исключение
Отказ = Истина;
ВызватьИсключение;
КонецПопытки;
КонецПроцедурыОбычноеПриложение
Конфигурация → Открыть модуль обычного приложения
Толстый клиент, обычное приложение
Процедура ПриНачалеРаботыСистемы()
#Если ТолстыйКлиентОбычноеПриложение Тогда
БухНакладнаяФормы85.ПроверитьСтенд85();
Форма = ПолучитьОбщуюФорму("ПультНакладной85",, Новый УникальныйИдентификатор);
Если ТипЗнч(Форма) <> Тип("Форма") Или Форма.Открыта() Тогда
ВызватьИсключение "Не получена отдельная закрытая форма своего пульта";
КонецЕсли;
Форма.Открыть();
#Иначе
ВызватьИсключение "Урок требует толстый обычный клиент";
#КонецЕсли
КонецПроцедурыПодготовка метаданных
Новая собственная CF → ручная подготовка объектов и обычных форм
Копируемая ручная спецификация; не исполняемый BSL или выгрузка XML
{
"назначение": "Ручная подготовка только своей новой CF; это не выгрузка XML и не выполненная установка",
"конфигурация": {"Имя": "УчебныеФормыБухНакладной85", "ОсновнойРежимЗапуска": "ОбычноеПриложение", "РежимСовместимости": "НеИспользовать"},
"документ": {"Имя": "РегистраторНакладной85", "Проведение": "Запретить", "ДлинаНомера": 5, "ТипНомера": "Строка", "Автонумерация": false, "Реквизиты": {"Маркер85": "Строка36"}, "Движения": ["ПроводкиНакладной85"]},
"планСчетов": {"Имя": "СчетаНакладной85", "ДлинаКода": 2, "МаксКоличествоСубконто": 0, "ВидыСубконто": "не выбран", "Реквизиты": {"Маркер85": "Строка36"}, "ОсновнаяФормаСписка": "Список85", "ОсновнаяФормаОбъекта": "Счет85"},
"регистр": {"Имя": "ПроводкиНакладной85", "ПланСчетов": "СчетаНакладной85", "Корреспонденция": false, "ДлинаУточненияПериода": 0, "Измерения": {"Код85": "Строка3, балансовое", "Маркер85": "Строка36, балансовое"}, "Ресурсы": {"Сумма85": "Число15,2, балансовый"}, "Регистраторы": ["РегистраторНакладной85"], "ОсновнаяФормаСписка": "Журнал85", "ОсновнаяФормаНабораЗаписей": "Набор85"},
"формы": {
"ОбщаяФорма.ПультНакладной85": {"Вид": "обычная", "Реквизиты": {"Протокол85": "Строка неограниченная"}, "Кнопки": {"Набор85": "Открыть85", "Журнал85": "Открыть85", "Копия85": "Открыть85", "Счета85": "Открыть85"}},
"РегистрБухгалтерии.ПроводкиНакладной85.Форма.Набор85": {"Вид": "обычная", "ГлавныйРеквизит": {"Набор85": "РегистрБухгалтерииНаборЗаписей.ПроводкиНакладной85"}, "ТабличноеПоле": {"Строки85": {"Данные": "Набор85", "Колонки": ["Период", "Регистратор", "НомерСтроки", "Активность", "ВидДвижения", "Счет", "Код85", "Маркер85", "Сумма85"]}}, "Кнопки": {"Шаг85": "Шаг85"}, "Реквизиты": {"Протокол85": "Строка неограниченная"}},
"РегистрБухгалтерии.ПроводкиНакладной85.Форма.Журнал85": {"Вид": "обычная", "ГлавныйРеквизит": {"Список85": "РегистрБухгалтерииСписок.ПроводкиНакладной85"}, "ТабличноеПоле": {"Строки85": {"Данные": "Список85"}}, "Кнопки": {"Проверить85": "Проверить85"}, "Реквизиты": {"Протокол85": "Строка неограниченная"}},
"ПланСчетов.СчетаНакладной85.Форма.Список85": {"Вид": "обычная", "ГлавныйРеквизит": {"Список85": "ПланСчетовСписок.СчетаНакладной85"}, "ТабличноеПоле": {"Счета85": {"Данные": "Список85"}}, "Реквизиты": {"ВыбранныйСчет85": "ПланСчетовСсылка.СчетаНакладной85", "Протокол85": "Строка неограниченная"}, "ПолеВвода": {"Выбор85": {"Данные": "ВыбранныйСчет85"}}, "Кнопки": {"Проверить85": "Проверить85"}},
"ПланСчетов.СчетаНакладной85.Форма.Счет85": {"Вид": "обычная", "ГлавныйРеквизит": {"Счет85": "ПланСчетовОбъект.СчетаНакладной85"}, "Реквизиты": {"Протокол85": "Строка неограниченная"}, "Кнопки": {"Записать85": "Записать85"}}
},
"периодВсехПроводок": "2026-10-10T12:00:00",
"исходныеПроводки": [
{"НомерСтроки": 1, "Код85": "A", "ВидДвижения": "Дебет", "Сумма85": 1000},
{"НомерСтроки": 2, "Код85": "A10", "ВидДвижения": "Кредит", "Сумма85": 250},
{"НомерСтроки": 3, "Код85": "B", "ВидДвижения": "Кредит", "Сумма85": 100}
],
"общиеЗначенияПроводок": {"Регистратор": "реальная сохранённая ссылка на единственный документ INV85", "Счет": "реальная сохранённая ссылка на свой счёт85", "Активность": true, "Маркер85": "a4e6fa9e-85cd-4daf-a4c0-e89b9fe48373"}
}Разбор по шагам
Copy0 создаёт настоящий новый объект собственного плана счетов в памяти; GetForm получает форму именно этого экземпляра.
ДоOpen задаются actual CopyingObject/Basis refs; собственный обработчик явно использует их в паспорте, не приписывая платформе автоматическое заполнение.
Одна native WriteInForm0 BOOL с правильными Form/Object BeforeWrite1 сохраняет только новую копию; полные свежие источники подтверждают2accounts и неизменные3старые проводки.
Как проверить результат
Полные реальные источники и идентичность собственных refs проверяются перед изменениями и после записи.
Readonly коллекции/номер строки/ключи не заменяются и не присваиваются; доступные элементы политики изменяются только внутри своего экземпляра.
Partial failure/Unknown/False приводит к остановке без blind rollback/retry; scalar readback не обещает renderer/RLS/atomicity.
Все результаты являются ожиданиями будущего ручного запуска, не заявлением о выполненной1С.
Ожидаемый результат
Будущий ручной результат: собственный новый счёт86 «Учебная копия INV85», старый счёт85/документ/проводки неизменны. Повторная запись, очистка и удаление не выполняются.
На что обратить внимание
Нельзя подменять ordinary Форма/ТабличноеПоле управляемыми Form/Data aliases или создавать Extension конструктором.
Параметры открытия устанавливаются доOpen; действительный currentrow/currentdata послеOpen может ещё отсутствовать — это отказ, не разрешение выдать подготовленный результат.
Обновить формы и табличного поля набора перечитывает БД и может отбросить собственный несохранённый буфер; урок делает это только после точной проверки известного собственного состояния.
Типы и возвращаемые значения фабрик проверяются до работы; default list factory0 не гарантирует новый экземпляр или отсутствие кеша.
Правила потребителя CopyingObject/Basis заданы явно. Встроенный automatic copy/fill, уведомления, пиксели и конкурентная изоляция здесь не измерены.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.