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

Учебные задачи

Часть единого собственного учебного стенда: полностью подготовленные обычные формы, настоящие 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С» и не аффилирован с ней.