Как настроить обязательные связи документов в зависимости от тематики в 1С:Документообороте 3.0

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

В системе 1С:Документооборот 3.0 механизмы работы с документами стали значительно гибче благодаря внедрению тематик. Однако администраторы и разработчики часто сталкиваются с ограничением: стандартные настройки связей задаются для вида документа в целом, и в них невозможно указать обязательность связи только для конкретной тематики. Например, если для документа «Счет на оплату» с тематикой «Перевозки» необходимо обязательно указывать «Заказ на перевозку», а для тематики «Оплата электричества» эта связь не требуется, типовыми флажками в справочнике «Настройки связей» этого не добиться.

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

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

Начиная с версии 3.0, в программе появился мощный инструмент — «Правила проверки документов». Это наиболее правильный и современный способ валидации данных, который позволяет блокировать запись документа или выводить предупреждение при несоблюдении условий. Разберем по шагам, как настроить такую проверку.

Для создания правила перейдем в раздел Настройки — Правила проверки. Создадим новое правило и выберем тип «Скрипт». Это позволит нам написать произвольный код на языке 1С, который будет выполняться в момент сохранения документа. В скрипте мы проверим два условия: текущую тематику и наличие связи определенного типа.

Рассмотрим пример кода для такого скрипта:


// Проверяем, что тематика документа — "Перевозки"
Если Объект.Тематика.Наименование = "Перевозки" Тогда
    
    // Тип связи, который мы ищем (например, "Основание")
    ТипСвязи = Справочники.ТипыСвязей.НайтиПоНаименованию("Заказ на перевозку");
    
    // Используем менеджер связей для поиска существующих записей
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ ПЕРВЫЕ 1
        |	СвязиДокументов.Ссылка
        |ИЗ
        |	РегистрСведений.СвязиДокументов КАК СвязиДокументов
        |ГДЕ
        |	СвязиДокументов.Источник = &Источник
        |	И СвязиДокументов.ТипСвязи = &ТипСвязи";
    
    Запрос.УстановитьПараметр("Источник", Объект.Ссылка);
    Запрос.УстановитьПараметр("ТипСвязи", ТипСвязи);
    
    РезультатЗапроса = Запрос.Выполнить();
    
    Если РезультатЗапроса.Пустой() Тогда
        // Если связь не найдена, выводим сообщение об ошибке
        ИнформационноеСообщение = "Для тематики 'Перевозки' необходимо обязательно указать связь с документом 'Заказ на перевозку'.";
        Отказ = Истина;
    КонецЕсли;
    
КонецЕсли;

Этот метод хорош тем, что он срабатывает непосредственно при попытке пользователя нажать кнопку «Записать» или «Записать и закрыть». Таким образом, документ просто не попадет в систему без необходимых данных.

Способ 2. Проверка через условия запуска процесса

Если ваша задача — не запретить сохранение документа, а гарантировать наличие связи перед тем, как документ уйдет на согласование или обработку, выясним, как использовать условия запуска. Этот метод считается «классическим» для 1С:Документооборота.

Проанализируем порядок действий администратора:

  1. Перейдем в настройки вида документа.
  2. Откроем вкладку «Настройки обработки».
  3. В колонке «Условия запуска» создадим новое условие.
  4. В самом условии выберем способ настройки «Скрипт» (или конструктор, если тематика доступна в полях).

В скрипте проверки можно использовать типовую функцию для получения связанных объектов:


// Пример получения связи через программный интерфейс
Результат = СвязиОбъектов.ПолучитьСвязанныйОбъект(Параметры.Объект, Параметры.ТипСвязи);

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

Возврат Истина;

Важно помнить, что СвязиОбъектов.ПолучитьСвязанныйОбъект — это удобный метод, который избавляет от необходимости писать прямые запросы к регистрам сведений.

Способ 3. Механизм бизнес-событий (Enterprise-разработка)

Посмотрим на ситуацию со стороны событийной модели. В версии 3.0 можно подписаться на событие «Изменение документа» или «Создание документа» прямо в пользовательском режиме (режим «Предприятие»), не прибегая к расширениям конфигурации.

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

Способ 4. Обязательные дополнительные реквизиты

Рассмотрим альтернативный подход, который вообще не требует написания сложного кода для проверки связей. В 1С:ДО 3.0 для каждой тематики можно настроить свой уникальный набор дополнительных реквизитов.

Мы можем создать дополнительный реквизит с типом «Документ» (например, «Основание для перевозки») и в настройках тематики пометить его как «Обязательный». Система автоматически заблокирует запись документа, если это поле не будет заполнено. Это «Low-code» решение, которое легко поддерживать. Единственный минус — этот документ не будет отображаться в стандартном журнале связей, если не настроить дополнительный скрипт синхронизации, но для целей контроля заполнения данных это работает идеально.

Способ 5. Разделение видов документов

Иногда стоит проанализировать структуру данных еще на этапе проектирования. Если логика работы с «Перевозками» и «Оплатой электричества» настолько разная, что требует разных связей, разных прав доступа и разных маршрутов согласования, возможно, стоит отказаться от тематик в пользу разных видов документов.

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

Итоги и рекомендации

Мы рассмотрели несколько способов реализации обязательности связей по тематикам. Выбор конкретного метода зависит от ваших требований к жесткости проверки:

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

← На главную