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