Как сделать поле "Договор" обязательным для заполнения в документе "Реализация товаров и услуг"?

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

В процессе работы часто возникает необходимость усилить контроль за вводом данных. Одна из таких задач — сделать невозможным проведение документа "Реализация товаров и услуг" без указания договора с контрагентом. Это позволяет избежать ошибок в учете взаиморасчетов и обеспечить корректность данных. Рассмотрим несколько способов решения этой задачи, начиная от стандартных настроек программы и заканчивая методами, требующими вмешательства в конфигурацию.

Решение 1: Использование штатного механизма "Соглашения с клиентами" (рекомендуемый способ)

Современные конфигурации, такие как 1С:ERP или 1С:Управление торговлей, имеют мощный встроенный функционал для управления условиями продаж — соглашения с клиентами. Этот метод является наиболее предпочтительным, так как не требует изменения типовой конфигурации, что значительно упрощает ее дальнейшие обновления.

Разберем по шагам, как настроить обязательное указание договора с помощью соглашений.

  1. Включение функционала соглашений.

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

    НСИ и администрирование – Настройка НСИ и разделов – Продажи – Оптовые продажи

    В этом разделе нужно установить флаг "Использование соглашений с клиентами".

  2. Настройка типового соглашения.

    Соглашения бывают индивидуальными (для конкретного клиента или группы) и типовыми (действуют для всех клиентов, если не указано индивидуальное). Если требуется, чтобы договор был обязателен для всех, достаточно настроить типовое соглашение. Найдем его в разделе:

    CRM и маркетинг – Настройки и справочники – Типовые соглашения с клиентами

    Откроем нужное типовое соглашение (или создадим новое) и перейдем на вкладку "Условия продаж". Здесь нас интересует блок настроек, касающийся договоров. Необходимо установить переключатель в положение "Требуется указание договора, порядок расчетов определяется в договоре".

  3. Проверка результата.

    После сохранения этих настроек при создании нового документа "Реализация товаров и услуг" для любого клиента, подпадающего под действие этого соглашения, поле "Договор" станет обязательным для заполнения. Система подсветит его красным и не позволит провести документ, пока поле не будет заполнено.

Этот способ является самым "изящным" и правильным, так как использует предусмотренные разработчиками механизмы и не требует навыков программирования.

Решение 2: Доработка в режиме "Конфигуратор"

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

Самый простой способ: свойство реквизита "Проверка заполнения"

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

  1. Откройте конфигуратор.
  2. В дереве конфигурации найдите документ РеализацияТоваровУслуг.
  3. Разверните его и перейдите на вкладку Реквизиты.
  4. Найдите реквизит Договор и откройте его свойства (двойным кликом или через контекстное меню).
  5. В палитре свойств найдите свойство "Проверка заполнения" и установите для него значение "Выдавать ошибку".

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

Современный способ: использование расширений

Это наиболее предпочтительный метод доработки, так как он не затрагивает основную конфигурацию и не создает проблем при обновлениях. Все изменения инкапсулируются в отдельном объекте — расширении.

  1. Создание расширения.

    В конфигураторе создайте новое расширение (Конфигурация -> Расширения конфигурации -> Добавить). Задайте ему имя, например, КонтрольЗаполненияРеквизитов.

  2. Заимствование объекта.

    Добавьте в созданное расширение документ РеализацияТоваровУслуг.

  3. Создание обработчика события.

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

  4. Написание кода проверки.

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

    
    &После("ОбработкаПроверкиЗаполнения")
    Процедура Расш_ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
    
        Если Не ЗначениеЗаполнено(ЭтотОбъект.Договор) Тогда
            // Добавляем информацию о незаполненном реквизите
            // для вывода стандартного сообщения платформы.
            ОбщегоНазначения.СообщитьПользователю(
                "Не заполнен обязательный реквизит ""Договор""!",
                ЭтотОбъект.Ссылка,
                "Договор"
            );
            Отказ = Истина;
        КонецЕсли;
    
    КонецПроцедуры
    

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

Гибкий способ: подписка на событие

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

  1. Создание общего модуля.

    Если его еще нет, создайте общий модуль (например, ПроверкиПриЗаписи) с установленными флагами "Сервер", "Внешнее соединение" и "Вызов сервера". В нем будет находиться процедура-обработчик.

  2. Создание подписки на событие.

    В дереве конфигурации в ветке Общие -> Подписки на события создайте новую подписку.

  3. Настройка свойств подписки.

    • Источник: ДокументОбъект.РеализацияТоваровУслуг
    • Событие: ОбработкаПроверкиЗаполнения или ПередЗаписью
    • Обработчик: Укажите процедуру из вашего общего модуля, например, ПроверкиПриЗаписи.ПроверитьЗаполнениеДоговора
  4. Код обработчика.

    В общем модуле ПроверкиПриЗаписи разместите экспортную процедуру со следующим кодом. Рассмотрим пример для события ПередЗаписью.

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

Классический способ: код в модуле объекта документа

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


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

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

← На главную