Расширение формы списка записей регистра бухгалтерии.ПараметрТекущаяСтрока

Свойства · CurrentLineParameter

Тип: РегистрБухгалтерииКлючЗаписи.<Имя регистра бухгалтерии>. Осуществляет позиционирование на строку содержащегося в форме списка, отображающую устанавливаемое значение. Позиционирование происходит при открытии или повторном открытии формы. Если форма используется для выбора или подбора, данная установка имеет более высокий приоритет, чем свойство формы НачальноеЗначениеВыбора.

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

Расширение формы списка записей регистра бухгалтерии.ПараметрТекущаяСтрока (Accounting register record list form extension.CurrentLineParameter)

Расширение формы списка записей регистра бухгалтерии (Accounting register record list form extension)

ПараметрТекущаяСтрока (CurrentLineParameter)

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

Использование:
Чтение и запись.
Описание:
Тип: РегистрБухгалтерииКлючЗаписи.<Имя регистра бухгалтерии>.
Осуществляет позиционирование на строку содержащегося в форме списка, отображающую устанавливаемое значение. Позиционирование происходит при открытии или повторном открытии формы. Если форма используется для выбора или подбора, данная установка имеет более высокий приоритет, чем свойство формы НачальноеЗначениеВыбора.
Доступность:

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

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

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

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

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

Свой журнал бухгалтерии: регистратор, ключ строки и полные реальные ячейки

Часть единого собственного учебного стенда: полностью подготовленные обычные формы, настоящие native источники и проверяемые числовые результаты.

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

Платформа8.5.1.1343; толстый обычный клиент собственной новой File CF; основной модуль своей обычной формы. Реальная1С/CF/ИБ/UI здесь не запускались.

Подготовка

  1. Задача уроков — разобраться в различии между сохранёнными бухгалтерскими строками, редактируемым набором и журналом просмотра. Приход1000, расходы250 и100 дают сумму всех строк1350 и знаковую сумму650. Исправление последнего расхода100→200 уменьшит знаковую сумму до550. Возврат200→100 снова даст650. Это сумма собственных проводок, а не утверждение о полном бухгалтерском балансе предприятия.

  2. Вручную создайте НОВУЮ пустую файловую базу C:\1c-labs\OwnAccountingInvoiceForms85_a4e6fa9e-85cd-4daf-a4c0-e89b9fe48373\IB. Если такой каталог уже существует, не очищайте и не переиспользуйте его. Имя конфигурации УчебныеФормыБухНакладной85, платформа Windows8.5.1.1343, РежимСовместимостиНеИспользовать. В Конфигураторе выберите Сервис → Параметры → Общие → Редактирование конфигурации для режима запуска = «Управляемое приложение и обычное приложение». Это настройка редактора, не свойство метаданных. Отдельно установите ОсновнойРежимЗапускаОбычноеПриложение. UUID в пути — маркер лаборатории, не UUID базы.

  3. Создайте свою роль БухФормы85Администратор со всеми правами только этой учебной CF, включая администрирование для ПолучитьПользователей и право АктивныеПользователи для ПолучитьСоединенияИнформационнойБазы. Единственный пользователь БухФормы85Ученик с этой ролью. Перед учебным запуском закройте Конфигуратор и остальные соединения: код требует ровно одно соединение, сверяет его реальный номер с НомерСоединенияИнформационнойБазы и UUID пользователя соединения с UUID текущего единственного пользователя. Это проверка состояния в момент чтения, не блокировка новых подключений и не гарантия изоляции. Правка placeholders не требуется. Не используйте рабочие УТ/КА/УНФ/БП и не устанавливайте расширения.

  4. Создайте объекты и пять ОБЫЧНЫХ форм по видимому JSON-блоку «Подготовка метаданных». У плана счетов нет субконто; регистр не поддерживает корреспонденцию. У строк Код85 и Маркер85 — строки переменной длины с пределами3 и36, без заполнения пробелами. Все измерения и ресурс балансовые. Документ не проводится, но включён в регистраторы регистра. У форм регистра основными реквизитами должны быть настоящий набор/список; у форм плана — настоящий список/объект. Это условие появления соответствующих native расширений, а не создание нового Extension.

  5. Сначала подготовьте исходные данные, пока модули урока и его запреты записи ещё НЕ установлены. В своей учебной ИБ стандартными командами вручную сохраните один документ: номер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. Не задавайте вымышленные ссылки: при заполнении движений выбирайте эти настоящие сохранённые объекты.

  6. В стандартной форме набора регистра вручную сохраните ровно три строки из 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 НомерСтроки программно не задаётся. Других документов, счетов или строк быть не должно. Если реальная подготовка не совпала, остановитесь, не подделывайте результат.

  7. После подготовки установите общий модуль БухНакладнаяФормы85: ГлобальныйНет, КлиентОбычноеПриложениеДа, КлиентУправляемоеПриложениеНет, СерверДа, ВызовСервераНет, ВнешнееСоединениеНет, ПривилегированныйНет, ПовторноеИспользованиеВозвращаемыхЗначенийНеИспользовать. Вставьте COMMON целиком. Это общий код проверки данных в обычном клиенте и серверном объектном модуле; здесь нет UI API. Полные запросы читают все собственные документы/счета/проводки, а не только строку, совпавшую по маркеру.

  8. В каждую обычную форму вставьте именно её полный supporting module: HUB в ПультНакладной85, SET_FORM в Набор85, REGISTER_LIST в Журнал85, ACCOUNTS_LIST в Список85 плана, ACCOUNT_FORM в Счет85. ПередОткрытием формы привяжите к настоящему событию с двумя параметрами Отказ,СтандартнаяОбработка. Все кнопки Нажатие привяжите к указанной процедуре с одним параметром Кнопка: у обычного элемента native Нажатие() дополняется первым Элементом. Процедуры Подготовить85 — собственные экспортные методы, не имитация платформенных событий.

  9. Во всех формах Протокол85 разместите как readonly многострочное поле. В Набор85 колонки создайте вручную с точными свойствами Данные, равными именам полей из JSON; НомерСтроки — только просмотр. На наборе удалите стандартные команды записи/удаления/перемещения, сохраните только штатное добавление нового черновика и редактирование ячеек плюс свою кнопку Шаг85. Штатные запись/удаление запрещены формой вне двух явных этапов. В остальных списках отключите стандартные команды изменения/создания/удаления; только просмотр и свои кнопки. Не отключайте собственное поле Выбор85: оно хранит настоящую ссылку счёта.

  10. SET_FORM.ПередЗаписью(Отказ)1 привяжите к событию формы набора. RECORDSET_MODULE.ПередЗаписью(Отказ,Замещение)2 установите в МодульНабораЗаписей регистра после fixture: это другой владелец и другая сигнатура. ACCOUNT_FORM.ПередЗаписью(Отказ)1 — событие формы счёта; ACCOUNT_MODULE.ПередЗаписью(Отказ)1 — событие объекта плана счетов. Оба полных модуля присутствуют ниже. APPLICATION целиком в модуль ОБЫЧНОГО приложения: настоящее ПриНачалеРаботыСистемы()0 открывает свой пульт. События вручную не вызываются.

  11. После будущей ручной проверки синтаксиса, сохранения CF и обновления только своей учебной ИБ запустите толстый обычный клиент. В пульте сначала Набор85: кнопка Шаг включает фильтрA, который по documented вхождению оставляетA иA10. Следующий Шаг делает собственное несохранённое исправлениеB100→150 и сразу перечитывает данные методом формы. Сохранённая база всё время остаётся1350/650.

  12. На этапе2 в самой форме набора добавьте ОДИН реальный несохранённый черновик B2: расход75, период/регистратор/счёт/активность/Маркер как уB. Закончите ввод строки. Native политика СообщатьОНесоответствииОтбору должна уведомить о несовпадении с фильтромA; язык/вид окна не предсказываются. Буфер теперь4строки/1425/575, база по-прежнему3строки/1350/650. Шаг сначала проверяет все значения этого собственного черновика и лишь затем вызывает Обновить на табличном поле. Если число/значения не совпали, нет автоматического удаления или восстановления.

  13. Следующий Шаг отключает только свой фильтр. Теперь вручную измените только сумму в строкеB100→200, закончите редактирование и нажмите Шаг. Метод ЗаписатьВФорме() должен вернутьTrue; свежий независимый набор и полные запросы подтверждают1450/550. Затем измените200→100 и Шаг:1350/650, процесс завершён. Любая ошибка/False/неожиданный callback останавливает эту форму; не повторяйте запись, не продолжайте с неизвестным состоянием.

  14. Закройте набор. Пульт→Журнал: native менеджер регистра.ПолучитьФормуСписка() принимает строго0 аргументов. В CF основная форма спискаЖурнал85; закрытая форма дополнительно проходит собственную однократную подготовку. Это не обещание нового экземпляра/отсутствия кеша. ДоOpen устанавливаются реальный регистратор и native ключ строки2. После появления данных нажмите Проверить: actual текущие данныеA10/250 и все три реальные строки поля должны совпасть с полным источником. Не подставляйте данные запроса вместо отсутствующих UI данных.

  15. Закройте журнал. Пульт→Копия: настоящий объект счёта85.Скопировать() создаёт новый memory объект, но не пишет БД. Код/имя86 задаются явно. ПараметрОбъектКопирования содержит реальную ссылку85, ПараметрОснование — реальный документINV85. Собственный BeforeOpen-потребитель читает их и показывает паспорт копии; СтандартнаяОбработкаFalse предотвращает угадывание автоматического fill/copy. Записать один раз: полный свежий источник подтверждает два счёта85/86, прежний документ и все три прежние проводки только на85. Пример новую копию не удаляет и повторную копию не создаёт.

  16. Закройте копию. Пульт→Счета: настоящая обычная форма списка плана с начальным позиционированием на85. ПолеВыбор85 имеет тип ПланСчетовСсылка.СчетаНакладной85 и БыстрыйВыборTrue. Вручную выберите85, нажмите Проверить: реальные данные обоих счетов и выбранная ссылка проверяются, из реальных проводок получится650. Выберите86:0, поскольку нет своих проводок на копии. Это не callback дочерней формы и не обещание, что dropdown вызывает ОбработкаВыбора2.

  17. Ограничения: scalar readback свойств картинки/подвала/отбора не доказывает пиксели, права доступа, изоляцию транзакции или абсолютную блокировку UI. ПроверитьСтроку/ДанныеСтроки доказывают фактические полученные данные своих строк, не весь renderer. Конкурентные изменения обнаруживаются проверками, но снимки не атомарны. Здесь были только авторство и статические/native тесты; 1С/CF/ИБ/GUI/запись/сеть/печать не запускались.

Перем Источник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() Экспорт
    Если Метаданные.РежимСовместимости <> Метаданные.СвойстваОбъектов.РежимСовместимости.НеИспользовать Или СтрокаСоединенияИнформационнойБазы() <> "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"}
}

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

  1. Фабрика менеджера принимает0аргументов и возвращает настоящую подготовленную основную обычную форму списка.

  2. ДоOpen задаются действительная ссылка регистратора и настоящий readonly key строки2, полученный CreateRecordKey из документированных полей.

  3. После доставки текущие данные и все реальные ячейки3строк сверяются с полным источником; неизвестная/недоставленная строка вызывает отказ.

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

  1. Полные реальные источники и идентичность собственных refs проверяются перед изменениями и после записи.

  2. Readonly коллекции/номер строки/ключи не заменяются и не присваиваются; доступные элементы политики изменяются только внутри своего экземпляра.

  3. Partial failure/Unknown/False приводит к остановке без blind rollback/retry; scalar readback не обещает renderer/RLS/atomicity.

  4. Все результаты являются ожиданиями будущего ручного запуска, не заявлением о выполненной1С.

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

Будущий ручной результат: current row2=A10/250, полный собственный журнал3строки/1350 после завершения набора.

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

  1. Нельзя подменять ordinary Форма/ТабличноеПоле управляемыми Form/Data aliases или создавать Extension конструктором.

  2. Параметры открытия устанавливаются доOpen; действительный currentrow/currentdata послеOpen может ещё отсутствовать — это отказ, не разрешение выдать подготовленный результат.

  3. Обновить формы и табличного поля набора перечитывает БД и может отбросить собственный несохранённый буфер; урок делает это только после точной проверки известного собственного состояния.

  4. Типы и возвращаемые значения фабрик проверяются до работы; default list factory0 не гарантирует новый экземпляр или отсутствие кеша.

  5. Правила потребителя CopyingObject/Basis заданы явно. Встроенный automatic copy/fill, уведомления, пиксели и конкурентная изоляция здесь не измерены.

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

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

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

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

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