Как запретить проведение документов с просроченным договором в 1С:Бухгалтерия 8?

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия Бухгалтерский учет IT и автоматизация бизнеса
← На главную

В конфигурации «1С:Бухгалтерия предприятия 3.0» в карточке справочника Договоры предусмотрено поле Срок действия. Однако по умолчанию система не блокирует проведение первичных документов (реализаций, поступлений, счетов и т. д.), если дата документа превышает указанный в договоре срок окончания. Разберем, как реализовать подобную проверку штатно и с помощью механизмов доработки.

Штатные возможности типовой конфигурации

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

В карточке договора контрагента предусмотрен реквизит Договор закрыт. При установке этого флага договор автоматически исключается из списков выбора в документах. Для контроля истекших сроков можно использовать стандартные отчеты по справочнику Договоры с настройкой фильтрации по полю Срок действия.

Разработка проверки через подписку на событие

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

При проверке срока действия договора необходимо учесть важную деталь: пустая дата в 1С инициализируется как Дата(1,1,1,0,0,0). Чтобы документы по бессрочным договорам или договорам без указанного срока продолжали проводиться, обязательно добавляем условие проверки заполненности реквизита.

Посмотрим на пример процедуры обработки в общем модуле:


Процедура ПроверитьСрокДействияДоговораПередЗаписью(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт

    // Пропускаем загрузку данных, чтобы не ломать обмены и ЭДО
    Если Источник.ОбменДанными.Загрузка Тогда
        Возврат;
    КонецЕсли;

    // Проверяем наличие реквизита ДоговорКонтрагента в метаданных документа
    Если Источник.Метаданные().Реквизиты.Найти("ДоговорКонтрагента") = Неопределено Тогда
        Возврат;
    КонецЕсли;

    Договор = Источник.ДоговорКонтрагента;

    // Если договор не выбран или срок действия не заполнен — пропускаем
    Если Не ЗначениеЗаполнено(Договор) Или Не ЗначениеЗаполнено(Договор.СрокДействия) Тогда
        Возврат;
    КонецЕсли;

    // Сравниваем дату документа с датой окончания договора
    Если НачалоДня(Источник.Дата) > Договор.СрокДействия Тогда
        Отказ = Истина;
        ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
            СтрШаблон("Срок действия договора '%1' истек (%2). Проведение документа невозможно!", 
                Договор, Формат(Договор.СрокДействия, "ДФ=dd.MM.yyyy"))
        );
    КонецЕсли;

КонецПроцедуры

Использование расширений конфигурации

Проанализируем применение расширений 1С для решения этой задачи. Использование расширений позволяет сохранить типовую конфигурацию на полной поддержке и упрощает последующие обновления.

  1. Создаем новое расширение конфигурации в режиме Конфигуратор.
  2. Добавляем подписку на событие ПередЗаписью для требуемых типов документов (например, ДокументОбъект.РеализацияТоваровУслуг, ДокументОбъект.ПоступлениеТоваровУслуг и др.).
  3. Если проверка требуется только в момент интерактивной работы пользователя, подтягиваем формы документов в расширение и на события ПриИзменении полей ДоговорКонтрагента и Дата подключаем серверную процедуру проверки.

Важные технические нюансы при реализации

Выясним основные риски и особенности работы с датами и объектами платформы 1С:

← На главную