ОбработкаПроверкиЗаполнения: свой набор перерасчёта УчебнаяПроверка регистра УчебныеНачисленияНастроек

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

Настоящее событие набора, собственное измерение и ограниченный опыт с обязательной отменой транзакции.

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

Основной блок — модуль набора; дополнительные процедуры — свой серверный общий модуль.

Подготовка

  1. Работайте только в собственной пустой учебной конфигурации. В Конфигураторе создайте ПланВидовРасчета УчебныеВидыРасчета; не добавляйте эти учебные объекты в рабочую базу.

  2. Код — строковый длиной 10, наименование длиной 100. Для справочника, плана обмена и плана видов характеристик включите автонумерацию. Для счетов и видов расчёта код назначается явно в примере.

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

  4. Добавьте реквизиты Комментарий (Строка 100), Лимит (Число 15.2 с разрешённым отрицательным знаком), ЗапретУдаления (Булево). Не делайте их автоматически обязательными: дополнительные правила описаны отдельными обработчиками.

  5. Для этой диагностики дополнительно создайте документ УчебныйРасчетНастроек с разрешённым проведением. Создайте регистр расчёта УчебныеНачисленияНастроек, периодичность Месяц, план видов расчёта УчебныеВидыРасчета, регистратор УчебныйРасчетНастроек, ресурс Результат типа Число 12.2.

  6. У регистра расчёта УчебныеНачисленияНастроек добавьте измерение КодКниги Строка 40. Создайте перерасчёт УчебнаяПроверка с измерением КодКниги, свяжите его с одноимённым основным измерением регистра.

  7. Объект перерасчёта — собственный документ УчебныйРасчетНастроек. Остальные механизмы расчёта оставьте выключенными. Источник ниже создаёт собственные вид расчёта, документ и начисление 750 только внутри отменяемой транзакции.

  8. Основной обработчик поместите в модуль набора записей перерасчёта УчебнаяПроверка регистра УчебныеНачисленияНастроек, не в модуль менеджера и не в форму документа.

  9. Две дополнительные процедуры — в свой серверный общий модуль УчебныеСобытияНабора с установленным Сервер. Вызовите его экспортную процедуру ПроверитьСвойНабор отдельной собственной командой; у неё не должно быть внешней транзакции.

  10. Для положительного опыта оставьте заполненное собственное измерение. Для отрицательного очистите только Запись.КодКниги в подготовке. Не удаляйте системные проверяемые реквизиты всего набора.

  11. Обе ветки драйвера отменяют собственную транзакцию. При сборке HTML BSL и записи базы не выполнялись.

Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
    Позиция = ПроверяемыеРеквизиты.Найти("КодКниги");
    Если Позиция <> Неопределено Тогда
        ПроверяемыеРеквизиты.Удалить(Позиция);
    КонецЕсли;
    Для Каждого Запись Из ЭтотОбъект Цикл
        Если ПустаяСтрока(СокрЛП(Запись.КодКниги)) Тогда
            Отказ = Истина;
            Сообщить("В своей строке набора не заполнено КодКниги");
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры
Свой серверный общий модуль: ограниченный источник набора
Процедура ПодготовитьИЗаписатьСвойНабор()
    ВидРасчета = ПланыВидовРасчета.УчебныеВидыРасчета.СоздатьВидРасчета();
    ВидРасчета.Код = Лев(Строка(Новый УникальныйИдентификатор), 8);
    ВидРасчета.Наименование = "Учебное начисление";
    ВидРасчета.Записать();
    Документ = Документы.УчебныйРасчетНастроек.СоздатьДокумент();
    Документ.Дата = Дата(2026, 10, 14);
    Документ.Записать();
    Набор = РегистрыРасчета.УчебныеНачисленияНастроек.СоздатьНаборЗаписей();
    Набор.Отбор.Регистратор.Установить(Документ.Ссылка);
    Запись = Набор.Добавить();
    Запись.ПериодРегистрации = Дата(2026, 10, 1);
    Запись.ВидРасчета = ВидРасчета.Ссылка;
    Запись.Активность = Истина;
    Запись.Результат = 750;
    Запись.КодКниги = "BOOK-001";
    Набор.Записать();
    Менеджер = РегистрыРасчета.УчебныеНачисленияНастроек.Перерасчеты.УчебнаяПроверка;
    Набор = Менеджер.СоздатьНаборЗаписей();
    Набор.Отбор.ОбъектПерерасчета.Установить(Документ.Ссылка);
    Запись = Набор.Добавить();
    Запись.ОбъектПерерасчета = Документ.Ссылка;
    Запись.КодКниги = "BOOK-001";
    Если Набор.ПроверитьЗаполнение() Тогда
        Набор.Записать();
    КонецЕсли;
КонецПроцедуры
Тот же модуль: отдельный драйвер, отмена транзакции в обеих ветках
Процедура ПроверитьСвойНабор() Экспорт
    Если ТранзакцияАктивна() Тогда
        ВызватьИсключение "Запустите отдельную учебную команду вне чужой транзакции";
    КонецЕсли;
    НачатьТранзакцию();
    Попытка
        ПодготовитьИЗаписатьСвойНабор();
        ОтменитьТранзакцию();
    Исключение
        ОтменитьТранзакцию();
        ВызватьИсключение;
    КонецПопытки;
    Сообщить("Учебные записи отменены, завершение транзакции не подтверждает запись");
КонецПроцедуры

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

  1. Создайте указанные собственные метаданные и назначьте событие в модуле набора.

  2. Вызовите отдельную экспортную процедуру драйвера: она создаёт и проверяет настоящий набор.

  3. Сравните заполненный и пустой варианты измерения; после опыта вся собственная транзакция отменена.

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

  1. Пустое / пробельное собственное измерение приводит к Отказ=Истина. Заполненный пример не переписывает входной отказ на Ложь.

  2. Для проверки заполнения исключён только собственный реквизит, уже проверенный кодом; остальные штатные проверки сохранены.

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

Правило применяется к реальным строкам нужного набора, а фаза события отделена от фиксации транзакции.

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

  1. ПроверитьЗаполнение вызывает ОбработкаПроверкиЗаполнения; не вызывайте эту процедуру вручную.

  2. Код не меняет границы последовательности, не перепроводит документы и не пересчитывает зарплату.

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

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

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

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

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