Как настроить автоматическое заполнение наименования договора в 1С:Документооборот 2.1

Программист 1С:Документооборот IT и автоматизация бизнеса
← На главную

Автоматизация формирования заголовков документов — это одна из ключевых задач при внедрении систем электронного документооборота. В 1С:Документооборот 2.1 (и выше) правильно сформированное наименование позволяет пользователям быстро ориентироваться в списках документов без открытия карточек. В данной статье мы подробно разберем, как реализовать автоматическое заполнение наименования договора по заданному шаблону, объединяя различные реквизиты, такие как тип договора, номер, дата и контрагент.

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

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

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

  1. Откроем справочник Виды документов (раздел "Настройки и администрирование").
  2. Найдем в списке нужный вид документа, например, "Договор аренды" или создадим новый.
  3. На вкладке Настройки убедимся, что установлена галочка Является договором. Это критически важно, так как открывает доступ к специфическим "договорным" реквизитам, таким как срок действия и контрагент.
  4. Перейдем на вкладку Шаблон наименования. В современных версиях 2.1 это поле находится на закладке "Настройки" или "Реквизиты".
  5. Нажмем на кнопку выбора (троеточие) в поле Шаблон наименования. Перед нами откроется конструктор, где можно выбрать реквизиты документа.

В конструкторе мы можем составить формулу вида: [ВидДокумента] № [РегистрационныйНомер] от [ДатаРегистрации] ([Контрагенты]). Система сама будет подставлять значения этих полей в заголовок при записи документа. Если нам нужно добавить поле "Тип договора" (например: Договор, Доп. соглашение, Приложение), мы можем добавить его как Дополнительный реквизит для этого вида документа и также включить в шаблон наименования.

Метод 2. Программная реализация в модуле объекта

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

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

Проанализируем пример кода, который решает поставленную задачу:


Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
    
    // 1. Проверяем, что работаем именно с договором
    // Рекомендуется проверять признак "ЯвляетсяДоговором" у Вида документа
    Если ЗначениеЗаполнено(ЭтотОбъект.ВидДокумента) И ЭтотОбъект.ВидДокумента.ЯвляетсяДоговором Тогда
        
        // 2. Подготавливаем строковые представления реквизитов
        // Важно использовать функцию Строка() для защиты от ошибок типов
        
        ТекТипДоговора = Строка(ЭтотОбъект.ТипДоговора); // Если это Перечисление
        ТекНомер = ?(ЗначениеЗаполнено(ЭтотОбъект.РегистрационныйНомер), ЭтотОбъект.РегистрационныйНомер, "Б/Н");
        
        // Форматируем дату, чтобы убрать время
        ТекДата = "";
        Если ЗначениеЗаполнено(ЭтотОбъект.ДатаРегистрации) Тогда
            ТекДата = " от " + Формат(ЭтотОбъект.ДатаРегистрации, "ДФ=dd.MM.yyyy");
        КонецЕсли;
        
        ТекКонтрагент = "";
        Если ЗначениеЗаполнено(ЭтотОбъект.Контрагент) Тогда
            ТекКонтрагент = " " + Строка(ЭтотОбъект.Контрагент);
        КонецЕсли;

        ТекПредмет = ?(ЗначениеЗаполнено(ЭтотОбъект.ПредметДоговора), " " + ЭтотОбъект.ПредметДоговора, "");

        // 3. Формируем итоговое наименование
        ЭтотОбъект.Наименование = ТекТипДоговора + " № " + ТекНомер + ТекДата + ТекКонтрагент + ТекПредмет;
        
    КонецЕсли;

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

Разбор ошибки «Преобразование значения к типу Число не может быть выполнено»

Рассмотрим причину возникновения частой ошибки, с которой столкнулся автор вопроса. В языке 1С оператор + перегружен. Если первым операндом в выражении идет число, система пытается прибавить к нему все остальные части математически. Если же в выражении встречается объект (например, ссылка на Перечисление или Справочник), система может повести себя непредсказуемо, пытаясь привести типы.

Выясним причину на примере кода автора: Объект.Наименование = "Договор " + Объект.НомерДоговора + .... Если НомерДоговора имеет тип Число, а ТипДоговора — тип Перечисление, система выдаст ошибку. Чтобы этого избежать, всегда используйте явное приведение к строке с помощью функции Строка() или пустую строку в начале выражения:

Неправильно:
Наименование = ЧисловойНомер + "текст"; // Ошибка, если ЧисловойНомер — число.

Правильно:
Наименование = Строка(ЧисловойНомер) + " текст";
или
Наименование = "" + ЧисловойНомер + " текст";

Работа с реквизитами и формами

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

  1. Где искать названия полей: Чтобы узнать имя реквизита (например, ТипДоговора), откройте Конфигуратор, найдите справочник ВнутренниеДокументы и посмотрите список его реквизитов. Не путайте "Имя" (используется в коде) и "Синоним" (то, что видит пользователь).
  2. Проверка заполненности: Всегда используйте функцию ЗначениеЗаполнено(). Если вы попытаетесь обратиться к пустому реквизиту или контрагенту, в наименовании может появиться некрасивая надпись "Объект не найден" или просто пустота.
  3. Контрагенты в ДО: Помните, что в "1С:Документооборот" договор может быть многосторонним. В этом случае реквизит Контрагент может находиться в табличной части Стороны. Проанализируем настройки вашего вида документа: если используется стандартный реквизит, обращаемся через ЭтотОбъект.Контрагент, если табличная часть — придется обходить её циклом.

Рекомендации по улучшению кода

Вместо использования функции НайтиПоНаименованию("Договор"), которая является "плохим тоном" (так как пользователь может переименовать вид документа), лучше использовать поиск по метаданным или проверять логические признаки. В 1С:Документооборот у каждого вида внутреннего документа есть реквизит ЯвляетсяДоговором. Проанализируем, почему это надежнее: даже если вы создадите новый вид документа "Государственный контракт", признак "Является договором" позволит вашему коду сработать корректно без внесения изменений.

Также, если вы добавили свое Перечисление.ТипДоговора, обращение к нему в коде для сравнения будет выглядеть так:


Если ЭтотОбъект.ТипДоговора = Перечисления.ТипДоговора.ДополнительноеСоглашение Тогда
    // Особая логика формирования для доп. соглашений
КонецЕсли;

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

← На главную