Список регистра расчета: свой фильтр, порядок и настоящий ключ строки

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

Один собственный учебный процесс: два вида расчета, два регистратора и три строки. Полная база1250 проверяется до UI, наборA меняется500→600 только после отдельного согласия, затем независимое чтение подтверждает1350 и неизменные500 уБ.

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

Только собственная новая файловая CF Windows8.5.1.1343, толстый обычный клиент. Ручная подготовка и одна явная будущая запись собственногоA; здесь нет запуска1С, созданияCF, записиБД или сетевых обращений.

Подготовка

  1. Все действия ниже выполните самостоятельно только в новой пустой учебной файловой базе Windows8.5.1.1343 по пути C:\1c-labs\OwnCalculationInvoiceViews21_25ecfba2-7f32-40c5-a5b3-bb5e777e4afb\IB. Имя конфигурации УчебныеНачисления85, ОсновнойРежимЗапуска=ОбычноеПриложение, совместимость НеИспользовать. Здесь 1С, база, макеты, запросы и запись не запускались. Не используйте копию рабочей конфигурации.

  2. В Конфигураторе Сервис → Параметры → Общие → Редактирование конфигурации для режима запуска выберите Оба; это настройка редактора, а не выдуманное свойство SupportedRunModes. Создайте одну полную собственную роль с Администрирование и одного пользователя Начисления85Ученик. ПолучитьПользователей требует административных прав. Другие пользователи и сеансы стенда не нужны.

  3. Создайте ПланыВидовРасчета → Начисления85: строковый код длиной10, наименование50, ИспользованиеПериодаДействия=Нет, ЗависимостьОтВидовРасчета=НеИспользовать, БыстрыйВыбор=Да, СпособВыбора=ОбоимиСпособами. Базовых видов расчета, дополнительных реквизитов, табличных частей и истории данных в уроке нет. Список видов расчета должен быть обычным, не управляемым.

  4. Создайте документ Регистратор85 с номером строка10, ручной нумерацией, проведением Разрешить, без табличных частей. Единственный дополнительный реквизит Метка85 типа Строка(40). Позже в движениях документа отметьте только собственный регистр Начисления85. ДокументыA/B в этом уроке сохраняются без проведения; проведение не используется для формирования этих трех строк.

  5. Создайте РегистрРасчета Начисления85: ПВР Начисления85, периодичность Месяц, ПериодДействия=Нет, БазовыйПериод=Нет, график не назначен, перерасчетов нет. Единственное измерение Сотрудник85 типа Строка(20); ресурс Сумма85 типа Число(12,2), реквизит Метка85 типа Строка(40). Документ Регистратор85 — единственный регистратор. В других регистрах никаких данных нет.

  6. Сначала подготовьте данные через стандартный интерфейс собственной базы, пока модули урока и его приложение еще пустые. В ПВР вручную создайте WORK85/Работа85 и BONUS85/Премия85 без пометки удаления. Создайте документыA85 иB85 от10.10.2026 00:00:00, без проведения и пометки удаления. Их Метка85=25ecfba2-7f32-40c5-a5b3-bb5e777e4afb/A и 25ecfba2-7f32-40c5-a5b3-bb5e777e4afb/B соответственно. Эти действия требуют отдельного вашего согласия на создание именно собственных учебных данных; здесь они не выполнялись.

  7. В стандартных формах наборов только своего регистра вручную запишитеA: строка1 Работа85/500, строка2 Премия85/250; B: строка1 Работа85/500. У всех Активность=Да, Сторно=Нет, ПериодРегистрации=01.10.2026 00:00:00, Сотрудник85=Иван85. Метки строк=25ecfba2-7f32-40c5-a5b3-bb5e777e4afb/A1, /A2, /B1. НомерСтроки задает платформа с1 внутри регистратора, не присваивайте readonly поле кодом. В базе должны быть ровно3 строки. До установки защитных модулей самостоятельно проверьтеA750, B500 и общий1250.

  8. Создайте обычную общую форму ПанельНачислений85. Реквизиты Вид85 типа ПланВидовРасчетаСсылка.Начисления85 и Состояние85 типа Строка. ПолеВвода Вид85 связано Данные=Вид85; событие ПриИзменении → ВидПриИзменении85. Кнопки ОткрытьСписок85, ВыбратьВид85, ОткрытьНабор85 назначаются одноименным процедурам Нажатие. ПриОткрытии и ОбработкаВыбора назначаются одноименным событиям формы. Состояние85 — поле просмотра.

  9. В собственном регистре мастером создайте обычные ФормаСписка85 и ФормаНабора85. Главный реквизит формы списка Список85 типа РегистрРасчетаСписок.Начисления85; главный реквизит формы набора Набор85 типа РегистрРасчетаНаборЗаписей.Начисления85. Это настоящие списки и наборы, предоставляемые фабриками регистра, не Новый расширение. В обеих формах ТабличноеПоле Записи85 с Данные=Список85/Набор85 и ТолькоПросмотр=Да; связанные колонки Регистратор, НомерСтроки, ВидРасчета, Сумма85, Сотрудник85, Метка85, Активность, ПериодРегистрации, Сторно. Имя связанной колонки ВидРасчета сохраните точно.

  10. В форме списка реквизит Состояние85 — Строка. ПередОткрытием → одноименная процедура2, ПриОткрытии → одноименная процедура0. Для Записи85 событие ПриАктивизацииСтроки → ПриАктивизацииСтроки85 с первым настоящим Элемент. Список обновляется из базы, фильтр и порядок перечитываются. Числа из полного запроса не считаются доказательством числа видимых строк; выбранная строка поля проверяется отдельно по native ключу и ДанныеСтроки.

  11. В форме набора реквизиты Согласие85 Булево, Результат85 Число(2,0), Состояние85 Строка. Согласие85 — свой флажок, исходно Нет. Кнопки Записать85 и Отмена85 назначаются одноименным обработчикам Нажатие. ПередОткрытием2, ПриОткрытии0, ПередЗаписью1, ПослеЗаписи0 назначаются одноименным событиям именно этой формы. MAIN формы набора изменяет500→600 только в ее памяти; запись выполняется только после флажка согласия и собственной кнопки.

  12. В ПВР мастером создайте обычную ФормаСписка85 с главным реквизитом Список85 типа ПланВидовРасчетаСписок.Начисления85. ТабличноеПоле Виды85 связано с Список85, ТолькоПросмотр=Да, колонки Код и Наименование. ПередОткрытием2 и ПриОткрытии0 — события формы; событие Выбор поля → ВыборВида85 с четырьмя формалами: базовые3 и первым Элемент из ordinary event104. Дважды щелкайте только колонку Наименование. Native ТекущаяСтрока здесь возвращает собственную ссылкуПВР; пользовательский выбор передается владельцу через ОповеститьОВыборе, не прямым вызовом ОбработкаВыбора.

  13. После подготовки трех строк вставьте все полные модули ниже. Общий модуль УчебныеНачисления85: Глобальный=Нет, КлиентОбычноеПриложение=Да, КлиентУправляемоеПриложение=Нет, Сервер=Да, ВызовСервера=Нет, ВнешнееСоединение=Нет, Привилегированный=Нет, повторное использование возвращаемых значений НеИспользовать. Общий модуль только читает и проверяет данные; клиентские методы форм в нем отсутствуют. В модуль набора записей именно своего регистра вставьте SET_MODULE целиком; его native события имеют5 формалов и в иных compiled контекстах отказывают.

  14. Вставьте HUB/LIST/SET_FORM/PVR_FORM в соответствующие четыре модуля форм и APPLICATION в модуль обычного приложения. Для собственной CF разрешите штатное использование модальности; запускайте только толстый обычный клиент. Подготовить85 — собственный экспортный initializer, не native событие. Native handlers вручную не вызывайте. Обновите только свой стенд и войдите одним своим пользователем.

  15. Сначала изучите быстрый выбор вида расчета: Работа дает1000, Премия250. Отдельная форма ПВР позиционируется настоящей ссылкой до открытия. Откройте список регистра: собственныйA и выбранный вид ограничивают записи; программа сверяет параметры, сам список и данные фактической выбранной строки. Политика стандартной картинки перечитывается, но пиксели и внешний вид здесь не проверялись.

  16. Откройте свой наборA. В памяти он станет850, база пока остается1250. Отмена проверяет исходную базу и пытается закрыть только свой буфер без ЗаписатьВФорме. Если платформа спросит о сохранении, откажитесь от сохранения; при отмененном закрытии модальный вызов панели еще не продолжается. Штатный диалог измененной формы и GUI здесь не проверялись. При следующем открытии исходные1250 снова проверяются. Для записи отдельно отметьте согласие и нажмите Записать. Ожидаются общий1350, A850, B500 и Работа1100. Ложь, ошибка или неизвестный исход переводят форму вСТОП, без автоматического повторения записи. Если база уже изменилась, повторение с исходного состояния запрещено; самостоятельно изучите результат в своем стенде.

Перем Остановка85, Готово85, Этап85, Снимок85, ВыбранныйВид85;

Процедура Подготовить85(Состояние, Этап, Вид) Экспорт
    Если Остановка85 <> Неопределено Или Готово85 <> Неопределено Тогда
        Остановка85 = Истина;
        ВызватьИсключение "Повторная подготовка формы списка запрещена";
    КонецЕсли;
    Остановка85 = Ложь;
    Попытка
        Снимок85 = УчебныеНачисления85.ПрочитатьСтенд85(Этап);
        Если Состояние.А <> Снимок85.А Или Состояние.Б <> Снимок85.Б
            Или (Вид <> Снимок85.Работа И Вид <> Снимок85.Премия)
            Или ЭтаФорма.ПараметрОтборПоРегистратору <> Снимок85.А Тогда
            ВызватьИсключение "Начальный отбор должен принадлежать своему документуA";
        КонецЕсли;
        Этап85 = Этап;
        ВыбранныйВид85 = Вид;
        Готово85 = Истина;
    Исключение
        Остановка85 = Истина;
        ВызватьИсключение;
    КонецПопытки;
КонецПроцедуры

Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
    Отказ = Истина;
    Если Остановка85 Или Готово85 <> Истина Или ВладелецФормы = Неопределено Тогда
        ВызватьИсключение "Нужна подготовленная собственная подчиненная форма списка";
    КонецЕсли;
    УчебныеНачисления85.ПрочитатьСтенд85(Этап85);
    Отказ = Ложь;
КонецПроцедуры

Процедура ПриОткрытии()
    Попытка
        Если Остановка85 Или Готово85 <> Истина
            Или ТипЗнч(Список85) <> Тип("РегистрРасчетаСписок.Начисления85") Тогда
            ВызватьИсключение "Основной реквизит должен быть настоящим списком своего регистра";
        КонецЕсли;
        Колонки = Список85.Колонки;
        Если Колонки.Найти("Сумма85") = Неопределено Или Колонки.Найти("ВидРасчета") = Неопределено Тогда
            ВызватьИсключение "В списке должны быть настоящие поля своего регистра";
        КонецЕсли;
        Список85.Отбор.Регистратор.Установить(Снимок85.А, Истина);
        Список85.Отбор.ВидРасчета.Установить(ВыбранныйВид85, Истина);
        Список85.Порядок.Установить("НомерСтроки Возр");
        Список85.Обновить();
        Если Не Список85.Отбор.Регистратор.Использование Или Список85.Отбор.Регистратор.Значение <> Снимок85.А
            Или Не Список85.Отбор.ВидРасчета.Использование Или Список85.Отбор.ВидРасчета.Значение <> ВыбранныйВид85
            Или Список85.Порядок.Количество() <> 1 Или Список85.Порядок.Получить(0).Данные <> "НомерСтроки" Тогда
            ВызватьИсключение "Не перечитаны отбор и порядок собственного списка";
        КонецЕсли;
        Поле = ЭлементыФормы.Записи85;
        Если ТипЗнч(Поле) <> Тип("ТабличноеПоле") Или Поле.Данные <> "Список85" Или Не Поле.ТолькоПросмотр Тогда
            ВызватьИсключение "Табличное поле должно показывать собственный список только для просмотра";
        КонецЕсли;
        Колонка = Поле.Колонки.ВидРасчета;
        Колонка.ОтображатьСтандартнуюКартинку = Истина;
        Если Не Поле.Колонки.ВидРасчета.ОтображатьСтандартнуюКартинку Тогда
            ВызватьИсключение "Не прочитана политика штатной картинки связанной колонки";
        КонецЕсли;
        Итоги = УчебныеНачисления85.ПрочитатьСтенд85(Этап85);
        Состояние85 = "СуммаA для выбранного вида=" + Строка(УчебныеНачисления85.Итоги85(Итоги, Итоги.А, ВыбранныйВид85)) + ". Выберите показанную строку для отдельной проверки данных поля.";
    Исключение
        Остановка85 = Истина;
        ВызватьИсключение;
    КонецПопытки;
КонецПроцедуры

Процедура ПриАктивизацииСтроки85(Элемент)
    Попытка
        Если Остановка85 Или Готово85 <> Истина Или Элемент <> ЭлементыФормы.Записи85 Тогда
            ВызватьИсключение "Строка должна быть активизирована в своем списке";
        КонецЕсли;
        Ключ = Элемент.ТекущаяСтрока;
        Если Ключ = Неопределено Тогда
            Возврат;
        КонецЕсли;
        Если ТипЗнч(Ключ) <> Тип("РегистрРасчетаКлючЗаписи.Начисления85") Или Ключ.Регистратор <> Снимок85.А Тогда
            ВызватьИсключение "Текущая строка должна возвращать настоящий ключ собственногоA";
        КонецЕсли;
        Данные = Элемент.ДанныеСтроки(Ключ);
        Снятые = УчебныеНачисления85.СнятьСтроку85(Данные);
        Если Снятые.Регистратор <> Ключ.Регистратор Или Снятые.НомерСтроки <> Ключ.НомерСтроки
            Или Снятые.ВидРасчета <> ВыбранныйВид85 Тогда
            ВызватьИсключение "Данные фактической строки не соответствуют ее ключу и отбору";
        КонецЕсли;
        Состояние = УчебныеНачисления85.ПрочитатьСтенд85(Этап85);
        Найдена = Ложь;
        Для Каждого Строка Из Состояние.Строки Цикл
            Если Строка.Регистратор = Ключ.Регистратор И Строка.НомерСтроки = Ключ.НомерСтроки Тогда
                Если Найдена Или Строка.Регистратор <> Снятые.Регистратор Или Строка.НомерСтроки <> Снятые.НомерСтроки
                    Или Строка.Активность <> Снятые.Активность Или Строка.ПериодРегистрации <> Снятые.ПериодРегистрации
                    Или Строка.ВидРасчета <> Снятые.ВидРасчета Или Строка.Сторно <> Снятые.Сторно
                    Или Строка.Сотрудник85 <> Снятые.Сотрудник85 Или Строка.Сумма85 <> Снятые.Сумма85
                    Или Строка.Метка85 <> Снятые.Метка85 Тогда
                    ВызватьИсключение "Поля фактической строки отличаются от полного свежего источника";
                КонецЕсли;
                Найдена = Истина;
            КонецЕсли;
        КонецЦикла;
        Если Не Найдена Тогда
            ВызватьИсключение "Строка поля отсутствует в полном собственном источнике";
        КонецЕсли;
        Состояние85 = "Прочитаны настоящие ключ и данные выбранной строки; сумма=" + Строка(Снятые.Сумма85);
    Исключение
        Остановка85 = Истина;
        ВызватьИсключение;
    КонецПопытки;
КонецПроцедуры
Общий модуль: полный собственный источник, строки и границы записи

Своя CF → ОбщиеМодули → УчебныеНачисления85, целиком

Сервер и толстый обычный клиент; только чтение и проверка. Полные flags приведены в подготовке.

Процедура ПроверитьСтенд85() Экспорт
    Если СтрокаСоединенияИнформационнойБазы() <> "File=""C:\1c-labs\OwnCalculationInvoiceViews21_25ecfba2-7f32-40c5-a5b3-bb5e777e4afb\IB"";" Или Метаданные.РежимСовместимости <> Метаданные.СвойстваОбъектов.РежимСовместимости.НеИспользовать Тогда
        ВызватьИсключение "Нужна только своя учебная файловая база 8.5.1.1343";
    КонецЕсли;
    Если Метаданные.Документы.Количество() <> 1 Или Метаданные.Документы.Найти("Регистратор85") = Неопределено
        Или Метаданные.ПланыВидовРасчета.Количество() <> 1 Или Метаданные.ПланыВидовРасчета.Найти("Начисления85") = Неопределено
        Или Метаданные.РегистрыРасчета.Количество() <> 1 Или Метаданные.РегистрыРасчета.Найти("Начисления85") = Неопределено
        Или Метаданные.Справочники.Количество() <> 0 Или Метаданные.РегистрыСведений.Количество() <> 0
        Или Метаданные.РегистрыНакопления.Количество() <> 0 Или Метаданные.РегистрыБухгалтерии.Количество() <> 0
        Или Метаданные.ОбщиеМодули.Количество() <> 1 Или Метаданные.Роли.Количество() <> 1 Тогда
        ВызватьИсключение "В учебной конфигурации нужны только собственные документ, ПВР, регистр и общий модуль";
    КонецЕсли;
    Регистр = Метаданные.РегистрыРасчета.Начисления85;
    План = Метаданные.ПланыВидовРасчета.Начисления85;
    Если Регистр.ПериодДействия Или Регистр.БазовыйПериод
        Или Регистр.ПланВидовРасчета <> План Или Регистр.Перерасчеты.Количество() <> 0
        Или План.ИспользованиеПериодаДействия
        Или План.ЗависимостьОтВидовРасчета <> Метаданные.СвойстваОбъектов.ИспользованиеБазыПланаВидовРасчета.НеИспользовать Тогда
        ВызватьИсключение "В уроке нет периодов действия, базы и перерасчетов";
    КонецЕсли;
    Если Регистр.Измерения.Количество() <> 1 Или Регистр.Измерения.Найти("Сотрудник85") = Неопределено
        Или Регистр.Ресурсы.Количество() <> 1 Или Регистр.Ресурсы.Найти("Сумма85") = Неопределено
        Или Регистр.Реквизиты.Количество() <> 1 Или Регистр.Реквизиты.Найти("Метка85") = Неопределено
        Или Метаданные.Документы.Регистратор85.Движения.Количество() <> 1
        Или Не Метаданные.Документы.Регистратор85.Движения.Содержит(Регистр) Тогда
        ВызватьИсключение "Изменились поля своего регистра или состав движений документа";
    КонецЕсли;
    Пользователи = ПользователиИнформационнойБазы.ПолучитьПользователей();
    Текущий = ПользователиИнформационнойБазы.ТекущийПользователь();
    Если Текущий = Неопределено Или Пользователи.Количество() <> 1 Тогда
        ВызватьИсключение "В стенде должен быть один учебный пользователь";
    КонецЕсли;
    Если Текущий.Имя <> "Начисления85Ученик" Или Текущий.УникальныйИдентификатор <> Пользователи[0].УникальныйИдентификатор Тогда
        ВызватьИсключение "Это другой учебный пользователь";
    КонецЕсли;
КонецПроцедуры

Функция ПрочитатьСтенд85(Этап) Экспорт
    ПроверитьСтенд85();
    Если Этап <> 0 И Этап <> 1 Тогда
        ВызватьИсключение "Неизвестный этап проверки базы";
    КонецЕсли;
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ Ссылка, Номер, Дата, Проведен, ПометкаУдаления, Метка85 ИЗ Документ.Регистратор85";
    Документы = Запрос.Выполнить().Выгрузить();
    Если Документы.Количество() <> 2 Тогда
        ВызватьИсключение "Нужны ровно два собственных подготовленных документа";
    КонецЕсли;
    А = Неопределено;
    Б = Неопределено;
    Для Каждого Документ Из Документы Цикл
        Если ТипЗнч(Документ.Ссылка) <> Тип("ДокументСсылка.Регистратор85")
            Или ТипЗнч(Документ.Номер) <> Тип("Строка") Или ТипЗнч(Документ.Дата) <> Тип("Дата")
            Или ТипЗнч(Документ.Проведен) <> Тип("Булево") Или Документ.Проведен
            Или ТипЗнч(Документ.ПометкаУдаления) <> Тип("Булево") Или Документ.ПометкаУдаления
            Или Документ.Дата <> Дата(2026, 10, 10) Тогда
            ВызватьИсключение "Изменился документ собственного стенда";
        КонецЕсли;
        Если Документ.Номер = "A85" И Документ.Метка85 = "25ecfba2-7f32-40c5-a5b3-bb5e777e4afb/A" И А = Неопределено Тогда
            А = Документ.Ссылка;
        ИначеЕсли Документ.Номер = "B85" И Документ.Метка85 = "25ecfba2-7f32-40c5-a5b3-bb5e777e4afb/B" И Б = Неопределено Тогда
            Б = Документ.Ссылка;
        Иначе
            ВызватьИсключение "Документ не принадлежит этому учебному сценарию";
        КонецЕсли;
    КонецЦикла;
    Если А = Неопределено Или Б = Неопределено Или А = Б Тогда
        ВызватьИсключение "Не найдена собственная пара документов";
    КонецЕсли;
    Запрос.Текст = "ВЫБРАТЬ Ссылка, Код, Наименование, ПометкаУдаления ИЗ ПланВидовРасчета.Начисления85";
    Виды = Запрос.Выполнить().Выгрузить();
    Если Виды.Количество() <> 2 Тогда
        ВызватьИсключение "Подготовьте ровно два собственных вида расчета";
    КонецЕсли;
    Работа = Неопределено;
    Премия = Неопределено;
    Для Каждого Вид Из Виды Цикл
        Если ТипЗнч(Вид.Ссылка) <> Тип("ПланВидовРасчетаСсылка.Начисления85") Или Вид.ПометкаУдаления Тогда
            ВызватьИсключение "Изменился собственный вид расчета";
        КонецЕсли;
        Если Вид.Код = "WORK85" И Вид.Наименование = "Работа85" И Работа = Неопределено Тогда
            Работа = Вид.Ссылка;
        ИначеЕсли Вид.Код = "BONUS85" И Вид.Наименование = "Премия85" И Премия = Неопределено Тогда
            Премия = Вид.Ссылка;
        Иначе
            ВызватьИсключение "Это другой вид расчета";
        КонецЕсли;
    КонецЦикла;
    Если Работа = Неопределено Или Премия = Неопределено Или Работа = Премия Тогда
        ВызватьИсключение "Не найдена собственная пара видов расчета";
    КонецЕсли;
    Запрос.Текст = "ВЫБРАТЬ Регистратор, НомерСтроки, Активность, ПериодРегистрации, ВидРасчета, Сторно, Сотрудник85, Сумма85, Метка85 ИЗ РегистрРасчета.Начисления85";
    Строки = Запрос.Выполнить().Выгрузить();
    Если Строки.Количество() <> 3 Тогда
        ВызватьИсключение "В регистре должны находиться ровно три свои строки";
    КонецЕсли;
    Снимок = Новый Массив;
    Для Каждого Строка Из Строки Цикл
        Снимок.Добавить(СнятьСтроку85(Строка));
    КонецЦикла;
    Состояние = Новый ФиксированнаяСтруктура("А,Б,Работа,Премия,Строки", А, Б, Работа, Премия, Новый ФиксированныйМассив(Снимок));
    ПроверитьСтроки85(Состояние.Строки, Состояние, Этап, Ложь);
    Возврат Состояние;
КонецФункции

Функция СнятьСтроку85(Строка) Экспорт
    Если ТипЗнч(Строка.Регистратор) <> Тип("ДокументСсылка.Регистратор85")
        Или ТипЗнч(Строка.НомерСтроки) <> Тип("Число") Или ТипЗнч(Строка.Активность) <> Тип("Булево")
        Или ТипЗнч(Строка.ПериодРегистрации) <> Тип("Дата")
        Или ТипЗнч(Строка.ВидРасчета) <> Тип("ПланВидовРасчетаСсылка.Начисления85")
        Или ТипЗнч(Строка.Сторно) <> Тип("Булево") Или ТипЗнч(Строка.Сотрудник85) <> Тип("Строка")
        Или ТипЗнч(Строка.Сумма85) <> Тип("Число") Или ТипЗнч(Строка.Метка85) <> Тип("Строка") Тогда
        ВызватьИсключение "Нарушены типы полей своей строки";
    КонецЕсли;
    Возврат Новый ФиксированнаяСтруктура("Регистратор,НомерСтроки,Активность,ПериодРегистрации,ВидРасчета,Сторно,Сотрудник85,Сумма85,Метка85", Строка.Регистратор, Строка.НомерСтроки, Строка.Активность, Строка.ПериодРегистрации, Строка.ВидРасчета, Строка.Сторно, Строка.Сотрудник85, Строка.Сумма85, Строка.Метка85);
КонецФункции

Процедура ПроверитьСтроки85(Строки, Состояние, Этап, ТолькоА) Экспорт
    Если ТипЗнч(Строки) <> Тип("ФиксированныйМассив") Или Строки.Количество() <> ?(ТолькоА, 2, 3) Тогда
        ВызватьИсключение "Изменилось полное число своих строк";
    КонецЕсли;
    ВиденыА1 = Ложь;
    ВиденыА2 = Ложь;
    ВиденыБ1 = Ложь;
    Для Каждого Строка Из Строки Цикл
        Если ТипЗнч(Строка) <> Тип("ФиксированнаяСтруктура") Или Строка.Количество() <> 9
            Или Не Строка.Активность Или Строка.Сторно
            Или Строка.ПериодРегистрации <> Дата(2026, 10, 1) Или Строка.Сотрудник85 <> "Иван85" Тогда
            ВызватьИсключение "Изменились общие поля своей строки";
        КонецЕсли;
        Строка = СнятьСтроку85(Строка);
        Если Строка.Регистратор = Состояние.А И Строка.НомерСтроки = 1 И Не ВиденыА1
            И Строка.ВидРасчета = Состояние.Работа И Строка.Сумма85 = ?(Этап = 0, 500, 600)
            И Строка.Метка85 = "25ecfba2-7f32-40c5-a5b3-bb5e777e4afb/A1" Тогда
            ВиденыА1 = Истина;
        ИначеЕсли Строка.Регистратор = Состояние.А И Строка.НомерСтроки = 2 И Не ВиденыА2
            И Строка.ВидРасчета = Состояние.Премия И Строка.Сумма85 = 250
            И Строка.Метка85 = "25ecfba2-7f32-40c5-a5b3-bb5e777e4afb/A2" Тогда
            ВиденыА2 = Истина;
        ИначеЕсли Не ТолькоА И Строка.Регистратор = Состояние.Б И Строка.НомерСтроки = 1 И Не ВиденыБ1
            И Строка.ВидРасчета = Состояние.Работа И Строка.Сумма85 = 500
            И Строка.Метка85 = "25ecfba2-7f32-40c5-a5b3-bb5e777e4afb/B1" Тогда
            ВиденыБ1 = Истина;
        Иначе
            ВызватьИсключение "Не совпали ключ, вид расчета, сумма или собственная метка";
        КонецЕсли;
    КонецЦикла;
    Если Не ВиденыА1 Или Не ВиденыА2 Или (Не ТолькоА И Не ВиденыБ1) Тогда
        ВызватьИсключение "Не прочитаны все собственные строки";
    КонецЕсли;
КонецПроцедуры

Процедура ПроверитьНабор85(Набор, Состояние, Этап) Экспорт
    Если ТипЗнч(Набор) <> Тип("РегистрРасчетаНаборЗаписей.Начисления85") Или Набор.Количество() <> 2
        Или Не Набор.Отбор.Регистратор.Использование Или Набор.Отбор.Регистратор.Значение <> Состояние.А Тогда
        ВызватьИсключение "Набор должен принадлежать только собственному документу A";
    КонецЕсли;
    Строки = Новый Массив;
    Для Каждого Строка Из Набор Цикл
        Строки.Добавить(СнятьСтроку85(Строка));
    КонецЦикла;
    ПроверитьСтроки85(Новый ФиксированныйМассив(Строки), Состояние, Этап, Истина);
КонецПроцедуры

Функция Итоги85(Состояние, Регистратор = Неопределено, Вид = Неопределено) Экспорт
    Сумма = 0;
    Для Каждого Строка Из Состояние.Строки Цикл
        Если (Регистратор = Неопределено Или Строка.Регистратор = Регистратор)
            И (Вид = Неопределено Или Строка.ВидРасчета = Вид) Тогда
            Сумма = Сумма + Строка.Сумма85;
        КонецЕсли;
    КонецЦикла;
    Возврат Сумма;
КонецФункции

Процедура ПроверитьРазрешение85(Набор, Этап) Экспорт
    ПроверитьСтенд85();
    Разрешение = Неопределено;
    Если Не Набор.ДополнительныеСвойства.Свойство("СвояЗапись85", Разрешение)
        Или ТипЗнч(Разрешение) <> Тип("Структура") Или Разрешение.Количество() <> 3 Тогда
        ВызватьИсключение "Нет отдельного согласия на собственную учебную запись";
    КонецЕсли;
    Если Разрешение.Метка <> "25ecfba2-7f32-40c5-a5b3-bb5e777e4afb" Или Разрешение.Этап <> Этап
        Или ТипЗнч(Разрешение.Состояние) <> Тип("ФиксированнаяСтруктура") Тогда
        ВызватьИсключение "Разрешение уже использовано либо принадлежит другой операции";
    КонецЕсли;
    Свежий = ПрочитатьСтенд85(?(Этап = "готово", 0, 1));
    Если Разрешение.Состояние.Количество() <> 5 Или Разрешение.Состояние.А <> Свежий.А
        Или Разрешение.Состояние.Б <> Свежий.Б Или Разрешение.Состояние.Работа <> Свежий.Работа
        Или Разрешение.Состояние.Премия <> Свежий.Премия Тогда
        ВызватьИсключение "Разрешение не совпадает с фактическими собственными ссылками базы";
    КонецЕсли;
    ПроверитьСтроки85(Разрешение.Состояние.Строки, Свежий, 0, Ложь);
    ПроверитьНабор85(Набор, Свежий, 1);
КонецПроцедуры
Модуль набора: настоящие события записи с пятью параметрами

Своя CF → РегистрыРасчета → Начисления85 → МодульНабораЗаписей, целиком

Native сервер/толстый клиент; тело только с compiled символом ТолстыйКлиентОбычноеПриложение собственной файловой CF. Иные контексты отказывают до клиентского процесса.

Процедура ПередЗаписью(Отказ, Замещение, ТолькоЗапись, ЗаписьФактическогоПериодаДействия, ЗаписьПерерасчетов)
    Отказ = Истина;
#Если ТолстыйКлиентОбычноеПриложение Тогда
    Если Не Замещение Тогда
        ВызватьИсключение "Дописывание строк в этом учебном процессе запрещено";
    КонецЕсли;
    УчебныеНачисления85.ПроверитьРазрешение85(ЭтотОбъект, "готово");
    Разрешение = ЭтотОбъект.ДополнительныеСвойства.СвояЗапись85;
    Разрешение.Этап = "начато";
    Отказ = Ложь;
#Иначе
    Отказ = Истина;
#КонецЕсли
КонецПроцедуры

Процедура ПриЗаписи(Отказ, Замещение, ТолькоЗапись, ЗаписьФактическогоПериодаДействия, ЗаписьПерерасчетов)
    Отказ = Истина;
#Если ТолстыйКлиентОбычноеПриложение Тогда
    УчебныеНачисления85.ПроверитьРазрешение85(ЭтотОбъект, "начато");
    Разрешение = ЭтотОбъект.ДополнительныеСвойства.СвояЗапись85;
    Разрешение.Этап = "записано";
    Отказ = Ложь;
#Иначе
    Отказ = Истина;
#КонецЕсли
КонецПроцедуры
Модуль обычного приложения: открыть только свою панель

Своя CF → Модуль обычного приложения, целиком

Только толстый обычный клиент этой учебной файловой CF.

Процедура ПриНачалеРаботыСистемы()
#Если ТолстыйКлиентОбычноеПриложение Тогда
    УчебныеНачисления85.ПроверитьСтенд85();
    Форма = ПолучитьОбщуюФорму("ПанельНачислений85");
    Если Форма.ВладелецФормы <> Неопределено Тогда
        ВызватьИсключение "Откройте самостоятельную учебную панель";
    КонецЕсли;
    Форма.Открыть();
#Иначе
    ВызватьИсключение "Нужен толстый обычный клиент собственной файловой базы";
#КонецЕсли
КонецПроцедуры
Панель начислений: быстрый выбор своего вида и открытие набораA

Своя CF → Общие → ОбщиеФормы → ПанельНачислений85 → Модуль целиком

Только толстый обычный клиент; этот модуль полностью дополняет текущий MAIN.

Перем Остановка85, Этап85, СвойСнимок85, ФормаВидов85, ФормаСписка85;

Процедура ПриОткрытии()
    Если Остановка85 <> Неопределено Или Этап85 <> Неопределено Тогда
        Остановка85 = Истина;
        ВызватьИсключение "Повторное открытие не снимает остановку";
    КонецЕсли;
    Остановка85 = Ложь;
    Попытка
#Если ТолстыйКлиентОбычноеПриложение Тогда
        СвойСнимок85 = УчебныеНачисления85.ПрочитатьСтенд85(0);
        Если ВладелецФормы <> Неопределено Тогда
            ВызватьИсключение "Откройте самостоятельную собственную общую форму";
        КонецЕсли;
        Типы = ПланыВидовРасчета.ТипВсеСсылки();
        Если Типы.Типы().Количество() <> 1 Или Не Типы.СодержитТип(Тип("ПланВидовРасчетаСсылка.Начисления85")) Тогда
            ВызватьИсключение "Типы ссылок должны принадлежать только своему ПВР";
        КонецЕсли;
        Вид85 = СвойСнимок85.Работа;
        Поле = ЭлементыФормы.Вид85;
        Если ТипЗнч(Поле) <> Тип("ПолеВвода") Или Поле.Данные <> "Вид85" Тогда
            ВызватьИсключение "Поле ввода должно быть связано со своей ссылкой на вид расчета";
        КонецЕсли;
        Поле.БыстрыйВыбор = Истина;
        Если Не Поле.БыстрыйВыбор Или Поле.Значение <> СвойСнимок85.Работа Тогда
            ВызватьИсключение "Не прочитан собственный вид расчета в быстром выборе";
        КонецЕсли;
        Этап85 = 0;
        Состояние85 = "База1250; документA750; Работа1000. Записи пока не изменялись.";
#Иначе
        ВызватьИсключение "Нужен толстый обычный клиент";
#КонецЕсли
    Исключение
        Остановка85 = Истина;
        ВызватьИсключение;
    КонецПопытки;
КонецПроцедуры

Процедура ОткрытьСписок85(Элемент)
    Попытка
        Если Остановка85 Или Элемент <> ЭлементыФормы.ОткрытьСписок85 Тогда
            ВызватьИсключение "Нужна своя команда неостановленной формы";
        КонецЕсли;
        УчебныеНачисления85.ПрочитатьСтенд85(Этап85);
        ФормаСписка85 = РегистрыРасчета.Начисления85.ПолучитьФормуСписка("ФормаСписка85", ЭтаФорма, Новый УникальныйИдентификатор);
        Если ФормаСписка85 = Неопределено Или ФормаСписка85.ВладелецФормы <> ЭтаФорма Тогда
            ВызватьИсключение "Не получена своя форма списка с настоящим владельцем";
        КонецЕсли;
        ФормаСписка85.ПараметрОтборПоРегистратору = СвойСнимок85.А;
        ФормаСписка85.Подготовить85(СвойСнимок85, Этап85, Вид85);
        ФормаСписка85.Открыть();
    Исключение
        Остановка85 = Истина;
        ВызватьИсключение;
    КонецПопытки;
КонецПроцедуры

Процедура ВыбратьВид85(Элемент)
    Попытка
        Если Остановка85 Или Элемент <> ЭлементыФормы.ВыбратьВид85 Тогда
            ВызватьИсключение "Нужна своя команда выбора";
        КонецЕсли;
        УчебныеНачисления85.ПрочитатьСтенд85(Этап85);
        ФормаВидов85 = ПланыВидовРасчета.Начисления85.ПолучитьФормуСписка("ФормаСписка85", ЭтаФорма, Новый УникальныйИдентификатор);
        Если ФормаВидов85 = Неопределено Или ФормаВидов85.ВладелецФормы <> ЭтаФорма Тогда
            ВызватьИсключение "Не получена собственная форма видов расчета";
        КонецЕсли;
        ФормаВидов85.ПараметрТекущаяСтрока = Вид85;
        ФормаВидов85.Подготовить85(СвойСнимок85, Этап85);
        ФормаВидов85.Открыть();
    Исключение
        Остановка85 = Истина;
        ВызватьИсключение;
    КонецПопытки;
КонецПроцедуры

Процедура ВидПриИзменении85(Элемент)
    Попытка
        Если Остановка85 Или Элемент <> ЭлементыФормы.Вид85
            Или (Вид85 <> СвойСнимок85.Работа И Вид85 <> СвойСнимок85.Премия) Тогда
            ВызватьИсключение "Изменение должно прийти от своего ввода с подготовленной ссылкой";
        КонецЕсли;
        Состояние = УчебныеНачисления85.ПрочитатьСтенд85(Этап85);
        Состояние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 Тогда
            ВызватьИсключение "Изменение своегоA разрешено только один раз в исходном состоянии";
        КонецЕсли;
        Состояние = УчебныеНачисления85.ПрочитатьСтенд85(0);
        Набор = РегистрыРасчета.Начисления85.СоздатьНаборЗаписей();
        Если Набор.Количество() <> 0 Тогда
            ВызватьИсключение "Фабрика должна вернуть новый пустой набор";
        КонецЕсли;
        Набор.Отбор.Регистратор.Установить(Состояние.А, Истина);
        Набор.Прочитать();
        УчебныеНачисления85.ПроверитьНабор85(Набор, Состояние, 0);
        ФормаНабора = Набор.ПолучитьФорму("ФормаНабора85", ЭтаФорма, Новый УникальныйИдентификатор);
        Если ФормаНабора = Неопределено Или ФормаНабора.ВладелецФормы <> ЭтаФорма Тогда
            ВызватьИсключение "Не получена форма этого собственного набора";
        КонецЕсли;
        ФормаНабора.Подготовить85(Состояние);
        ФормаНабора.ОткрытьМодально();
        Итог = УчебныеНачисления85.ПрочитатьСтенд85(ФормаНабора.Результат85);
        Этап85 = ФормаНабора.Результат85;
        Состояние85 = "Всего=" + Строка(УчебныеНачисления85.Итоги85(Итог)) + "; A=" + Строка(УчебныеНачисления85.Итоги85(Итог, Итог.А)) + "; Б=" + Строка(УчебныеНачисления85.Итоги85(Итог, Итог.Б));
    Исключение
        Остановка85 = Истина;
        Состояние85 = "СТОП: исход записи неизвестен; повторная запись автоматически не выполняется.";
        ВызватьИсключение;
    КонецПопытки;
КонецПроцедуры
НаборA: изменение в памяти, отдельное согласие и проверка записи

Своя CF → РегистрыРасчета → Начисления85 → Формы → ФормаНабора85 → Модуль целиком

Только толстый обычный клиент; этот модуль полностью дополняет текущий MAIN.

Перем Остановка85, Этап85, Снимок85;

Процедура Подготовить85(Состояние) Экспорт
    Если Остановка85 <> Неопределено Или Этап85 <> Неопределено Тогда
        Остановка85 = Истина;
        ВызватьИсключение "Повторная подготовка не снимает остановку";
    КонецЕсли;
    Остановка85 = Ложь;
    Попытка
        Снимок85 = УчебныеНачисления85.ПрочитатьСтенд85(0);
        Если Состояние.А <> Снимок85.А Или Состояние.Б <> Снимок85.Б Тогда
            ВызватьИсключение "Это другие собственные документы";
        КонецЕсли;
        УчебныеНачисления85.ПроверитьНабор85(Набор85, Снимок85, 0);
        Согласие85 = Ложь;
        Результат85 = 0;
        Этап85 = 0;
    Исключение
        Остановка85 = Истина;
        ВызватьИсключение;
    КонецПопытки;
КонецПроцедуры

Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
    Отказ = Истина;
    Если Остановка85 Или Этап85 <> 0 Или ВладелецФормы = Неопределено Тогда
        ВызватьИсключение "Нужна новая подготовленная собственная форма набора";
    КонецЕсли;
    УчебныеНачисления85.ПроверитьНабор85(Набор85, Снимок85, 0);
    Отказ = Ложь;
КонецПроцедуры

Процедура ПриОткрытии()
    Попытка
        Если Остановка85 Или Этап85 <> 0 Тогда
            ВызватьИсключение "Форма уже остановлена или подготовлена повторно";
        КонецЕсли;
        Поле = ЭлементыФормы.Записи85;
        Если ТипЗнч(Поле) <> Тип("ТабличноеПоле") Или Поле.Данные <> "Набор85" Или Не Поле.ТолькоПросмотр Тогда
            ВызватьИсключение "Табличное поле должно показывать только собственный подготовленный набор";
        КонецЕсли;
        Колонка = Поле.Колонки.ВидРасчета;
        Колонка.ОтображатьСтандартнуюКартинку = Истина;
        Если Не Поле.Колонки.ВидРасчета.ОтображатьСтандартнуюКартинку Тогда
            ВызватьИсключение "Не перечитана штатная политика колонки набора";
        КонецЕсли;
        УчебныеНачисления85.ПроверитьНабор85(Набор85, Снимок85, 0);
        Для Каждого Запись Из Набор85 Цикл
            Если Запись.НомерСтроки = 1 И Запись.ВидРасчета = Снимок85.Работа Тогда
                Запись.Сумма85 = 600;
            КонецЕсли;
        КонецЦикла;
        УчебныеНачисления85.ПроверитьНабор85(Набор85, Снимок85, 1);
        УчебныеНачисления85.ПрочитатьСтенд85(0);
        Этап85 = 1;
        Состояние85 = "В памятиA850, в базеA750 и всего1250. Для единственной записи отметьте согласие и нажмите Записать; Отмена не записывает.";
    Исключение
        Остановка85 = Истина;
        ВызватьИсключение;
    КонецПопытки;
КонецПроцедуры

Процедура Записать85(Элемент)
    Попытка
        Если Остановка85 Или Этап85 <> 1 Или Элемент <> ЭлементыФормы.Записать85
            Или ТипЗнч(Согласие85) <> Тип("Булево") Или Не Согласие85 Тогда
            ВызватьИсключение "Нужно отдельное явное согласие на запись только своегоA";
        КонецЕсли;
        УчебныеНачисления85.ПрочитатьСтенд85(0);
        УчебныеНачисления85.ПроверитьНабор85(Набор85, Снимок85, 1);
        Разрешение = Новый Структура("Метка,Этап,Состояние", "25ecfba2-7f32-40c5-a5b3-bb5e777e4afb", "готово", Снимок85);
        Набор85.ДополнительныеСвойства.Вставить("СвояЗапись85", Разрешение);
        Записано = ЭтаФорма.ЗаписатьВФорме();
        Если ТипЗнч(Записано) <> Тип("Булево") Или Не Записано Или Этап85 <> 2 Или Результат85 <> 1 Тогда
            ВызватьИсключение "Запись отказана либо ее окончательный результат не подтвержден";
        КонецЕсли;
        Итоги = УчебныеНачисления85.ПрочитатьСтенд85(1);
        Если УчебныеНачисления85.Итоги85(Итоги) <> 1350 Или УчебныеНачисления85.Итоги85(Итоги, Итоги.Б) <> 500 Тогда
            ВызватьИсключение "Не подтверждены полный итог1350 и неизменный документБ500";
        КонецЕсли;
        Состояние85 = "Подтверждено: A850, Б500, всего1350. Повторная запись запрещена.";
    Исключение
        Остановка85 = Истина;
        Результат85 = -1;
        Состояние85 = "СТОП: неизвестный исход; запись или обработчики могли завершиться частично. Автоматического повтора нет.";
        ВызватьИсключение;
    КонецПопытки;
КонецПроцедуры

Процедура ПередЗаписью(Отказ)
    Отказ = Истина;
    Попытка
        Если Остановка85 Или Этап85 <> 1 Или Не Согласие85 Тогда
            ВызватьИсключение "Стандартная запись без своего согласия и разрешения запрещена";
        КонецЕсли;
        УчебныеНачисления85.ПроверитьРазрешение85(Набор85, "готово");
        Отказ = Ложь;
    Исключение
        Остановка85 = Истина;
        Результат85 = -1;
        ВызватьИсключение;
    КонецПопытки;
КонецПроцедуры

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

Процедура Отмена85(Элемент)
    Попытка
        Если Остановка85 Или Этап85 <> 1 Или Элемент <> ЭлементыФормы.Отмена85 Тогда
            ВызватьИсключение "Отмена разрешена только до собственной записи";
        КонецЕсли;
        УчебныеНачисления85.ПрочитатьСтенд85(0);
        Результат85 = 0;
        ЭтаФорма.Закрыть();
    Исключение
        Остановка85 = Истина;
        Результат85 = -1;
        ВызватьИсключение;
    КонецПопытки;
КонецПроцедуры
Список видов расчета: настоящая начальная ссылка и пользовательский выбор

Своя CF → ПланыВидовРасчета → Начисления85 → Формы → ФормаСписка85 → Модуль целиком

Только толстый обычный клиент; этот модуль полностью дополняет текущий MAIN.

Перем Остановка85, Готово85, Снимок85, Этап85;

Процедура Подготовить85(Состояние, Этап) Экспорт
    Если Остановка85 <> Неопределено Или Готово85 <> Неопределено Тогда
        Остановка85 = Истина;
        ВызватьИсключение "Повторная подготовка формы видов расчета запрещена";
    КонецЕсли;
    Остановка85 = Ложь;
    Попытка
        Снимок85 = УчебныеНачисления85.ПрочитатьСтенд85(Этап);
        Если Состояние.Работа <> Снимок85.Работа Или Состояние.Премия <> Снимок85.Премия
            Или (ЭтаФорма.ПараметрТекущаяСтрока <> Снимок85.Работа И ЭтаФорма.ПараметрТекущаяСтрока <> Снимок85.Премия) Тогда
            ВызватьИсключение "Начальная строка должна быть своим настоящим видом расчета";
        КонецЕсли;
        Этап85 = Этап;
        Готово85 = Истина;
    Исключение
        Остановка85 = Истина;
        ВызватьИсключение;
    КонецПопытки;
КонецПроцедуры

Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
    Отказ = Истина;
    Если Остановка85 Или Готово85 <> Истина Или ВладелецФормы = Неопределено Тогда
        ВызватьИсключение "Нужна подготовленная форма со своим владельцем";
    КонецЕсли;
    УчебныеНачисления85.ПрочитатьСтенд85(Этап85);
    Отказ = Ложь;
КонецПроцедуры

Процедура ПриОткрытии()
    Попытка
        Если Остановка85 Или Готово85 <> Истина
            Или ТипЗнч(Список85) <> Тип("ПланВидовРасчетаСписок.Начисления85") Тогда
            ВызватьИсключение "Основным реквизитом должен быть настоящий список своегоПВР";
        КонецЕсли;
        Поле = ЭлементыФормы.Виды85;
        Если ТипЗнч(Поле) <> Тип("ТабличноеПоле") Или Поле.Данные <> "Список85" Или Не Поле.ТолькоПросмотр Тогда
            ВызватьИсключение "Список видов расчета должен показываться только в своем поле";
        КонецЕсли;
        Колонка = Поле.Колонки.Наименование;
        Колонка.ОтображатьСтандартнуюКартинку = Истина;
        Если Не Поле.Колонки.Наименование.ОтображатьСтандартнуюКартинку Тогда
            ВызватьИсключение "Не прочитана политика штатной картинки вида расчета";
        КонецЕсли;
        РежимВыбора = Истина;
        ЗакрыватьПриВыборе = Истина;
        УчебныеНачисления85.ПрочитатьСтенд85(Этап85);
    Исключение
        Остановка85 = Истина;
        ВызватьИсключение;
    КонецПопытки;
КонецПроцедуры

Процедура ВыборВида85(Элемент, ВыбраннаяСтрока, Колонка, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь;
    Попытка
        Если Остановка85 Или Готово85 <> Истина Или Элемент <> ЭлементыФормы.Виды85
            Или Колонка <> Элемент.Колонки.Наименование
            Или ТипЗнч(ВыбраннаяСтрока) <> Тип("ПланВидовРасчетаСсылка.Начисления85")
            Или ВыбраннаяСтрока <> Элемент.ТекущаяСтрока
            Или (ВыбраннаяСтрока <> Снимок85.Работа И ВыбраннаяСтрока <> Снимок85.Премия) Тогда
            ВызватьИсключение "Выбирайте один собственный вид расчета в его настоящей колонке";
        КонецЕсли;
        УчебныеНачисления85.ПрочитатьСтенд85(Этап85);
        ЭтаФорма.ОповеститьОВыборе(ВыбраннаяСтрока);
    Исключение
        Остановка85 = Истина;
        ВызватьИсключение;
    КонецПопытки;
КонецПроцедуры

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

  1. Полный запрос без ГДЕ проверяет все2документа,2вида и3записи, девять полей каждой строки и ключ Регистратор+НомерСтроки. Только фактические ссылки используются для фильтра и записи.

  2. Формы получаются фабриками собственного ПВР, менеджера регистра и настоящего набора. У списка нет самодельного конструктора; расширения приобретаются главными реквизитами и реальными связанными полями.

  3. Работа и Премия выбираются своим вводом или настоящим выбором в подчиненной форме. Ввод и выбор не имитируются прямыми вызовами native обработчиков.

  4. НаборA изменяется сначала в памяти. Отдельное согласие создает однократное разрешение именно этому набору; формы и native модуль набора проверяют источник и каждый этап до записи и после нее.

  5. Возвращенное ЗаписатьВФорме Булево и настоящее ПослеЗаписи без параметров дополняются повторным полным чтением базы. B500 и остальные поля не должны меняться. Неизвестный исход не считается отменой или успехом.

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

  1. Самостоятельно в своем стенде проверьте1250/A750/B500/Работа1000; после разрешенной записи1350/A850/B500/Работа1100. Это ожидаемый результат, не выполненный здесь runtime-тест.

  2. Отдельно проверьте Отмена до записи: новый полный запрос должен снова дать1250. Не вызывайте native callbacks из отладчика и не считайте отсутствие исключения доказательством UI отображения.

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

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

Новичок различает список базы, набор в памяти, строку поля и настоящий результат записи. Итог изменяется только на100 в собственномA; B остается500, а исходные и итоговые данные читаются независимо.

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

  1. ПараметрТекущаяСтрока списка регистра расчета исключен: native2282 объявляет ключ регистра накопления, хотя специализированное поле возвращает ключ регистра расчета. Контракт не угадывается.

  2. ПолучитьДополнение не используется: требуется конкуренция периодов действия старых регистраций, а здесь периоды действия отключены. Legacy менеджер перерасчетов и не имеющие смысла Итог/Свернуть списков зависимостей также не добавлены для количества.

  3. Колонки, Отбор и Порядок списка readonly как контейнеры; используются их собственные методы, а не присваивание контейнеру. ЭлементПорядка.Направление readonly, сортировка задается Порядок.Установить.

  4. Сумма полного запроса не является доказательством количества видимых строк. Native ключ и ДанныеСтроки выбранной строки проверяются отдельно; визуальное отображение и доставка событий здесь не запускались.

  5. ПередЗаписью формы имеет1параметр; ПередЗаписью и ПриЗаписи самого набора имеют5. ПослеЗаписи формы вызывается после окончания транзакции, ПриЗаписи набора до окончания. Статические проверки не подтверждают работу компилятора или фактический runtime.

  6. Отмена до записи и ошибка после возможной записи различаются. Процесс не обещает атомарности нескольких пользовательских действий, автоматического отката после ПослеЗаписи либо безопасного повтора при неизвестном результате.

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

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

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

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

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