При переходе на работу с конфигурацией 1С:Документооборот 3.0 (ДО 3.0) многие разработчики сталкиваются с серьезным изменением архитектуры — для интеграции и автоматического создания документов есть готовый модуль интеграции с 1С:Документооборот 3.0. В отличие от версии 2.1 или классических учетных решений (БП, УТ), в ДО 3.0 привычные нам входящие, исходящие и внутренние документы больше не являются отдельными объектами метаданных типа Документ. Теперь все они объединены в одном справочнике. В этой статье мы подробно разберем, как правильно создать документ программно, учитывая специфику "Видов документов".
Для начала проанализируем ситуацию: почему старый код, создающий объект через Документы.НужныйТип.СоздатьДокумент(), здесь не работает? В «1С:Документооборот 3.0» основной единицей учета является справочник ДокументыПредприятия. Все настройки — дополнительные реквизиты, правила нумерации, права доступа и шаблоны — привязаны к конкретному элементу справочника ВидыДокументов.
Когда пользователь создает "Заявку на отпуск" или "Договор аренды" в интерфейсе, он фактически создает новый элемент справочника ДокументыПредприятия и указывает для него соответствующий ВидДокумента. Наша задача — повторить этот процесс программно.
Рассмотрим самый простой путь: создание объекта "с нуля" с ручным заполнением основных реквизитов. Этот метод подходит, если вам нужно максимально контролировать каждый шаг заполнения. Посмотрим на пример кода:
&НаСервере
Функция СоздатьДокументПрограммно(ЗаголовокДокумента, ВидДокСсылка, ПроектСсылка)
// В ДО 3.0 используем справочник, а не документ
ДокументОбъект = Справочники.ДокументыПредприятия.СоздатьЭлемент();
// Заполняем базовые реквизиты
ДокументОбъект.Заголовок = ЗаголовокДокумента;
ДокументОбъект.ДатаСоздания = ТекущаяДатаСеанса();
// Установка вида документа — КРИТИЧЕСКИ важный шаг
ДокументОбъект.ВидДокумента = ВидДокСсылка;
// Если нужно привязать к папке (для внутренних документов)
ДокументОбъект.Папка = Справочники.ПапкиВнутреннихДокументов.НайтиПоНаименованию("Общая папка");
// Пример заполнения реквизита из проекта
ДокументОбъект.Проект = ПроектСсылка;
// Перед записью желательно вызвать типовые процедуры инициализации
ДокументОбъект.Записать();
Возврат ДокументОбъект.Ссылка;
КонецФункции
Важный нюанс: при таком подходе система не применит настройки из шаблонов автоматически. Если для данного вида документа настроены автоматические связи, рабочие группы или присоединенные файлы, их придется прописывать вручную или вызывать дополнительные методы API ДО 3.0.
Проанализируем более профессиональный подход. В 1С:ДО 3.0 широко используются шаблоны документов. Если вы хотите, чтобы программно созданный документ был идентичен тому, который пользователь создает "руками", лучше использовать механизм заполнения по шаблону.
Выясним, как это сделать. Нам потребуется обратиться к функциям общего модуля РаботаСДокументами. Рассмотрим алгоритм:
ДокументыПредприятия.ШаблоныДокументов.
// Пример использования шаблона
НовыйДокумент = Справочники.ДокументыПредприятия.СоздатьЭлемент();
Шаблон = Справочники.ШаблоныДокументов.НайтиПоНаименованию("Шаблон согласования проекта");
Если Не Шаблон.Пустая() Тогда
// Используем штатный механизм ДО 3.0 для заполнения по шаблону
ДанныеШаблона = РаботаСШаблонамиДокументов.ПолучитьДанныеШаблона(Шаблон);
РаботаСДокументами.ЗаполнитьПоШаблону(НовыйДокумент, Шаблон, ДанныеШаблона);
КонецЕсли;
// После заполнения по шаблону можно дозаполнить специфические данные
НовыйДокумент.Заголовок = "Согласование по проекту: " + ОбъектПроект.Наименование;
НовыйДокумент.Записать();
Посмотрим на ситуацию, когда у вида документа есть "Дополнительные реквизиты", созданные в пользовательском режиме. Поскольку это не обычные реквизиты объекта, мы не можем обратиться к ним через точку (например, Документ.МоеПоле). Они хранятся в табличной части ДополнительныеРеквизиты.
Чтобы программно заполнить такое поле, выполним следующие шаги:
ДополнительныеРеквизитыИСведения.
// Поиск доп. реквизита по имени
СвойствоСсылка = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Срочность (Общие)");
Если Не СвойствоСсылка.Пустая() Тогда
НоваяСтрока = ДокументОбъект.ДополнительныеРеквизиты.Добавить();
НоваяСтрока.Свойство = СвойствоСсылка;
НоваяСтрока.Значение = Перечисления.ВариантыВажности.Высокая;
КонецЕсли;
Часто задача звучит иначе: нужно не просто "молча" создать документ в базе, а открыть пользователю готовую форму, чтобы он мог проверить данные и нажать кнопку "Записать" самостоятельно. В этом случае правильнее всего использовать параметры формы при открытии.
Разберем, как передать данные в форму нового элемента справочника ДокументыПредприятия:
&НаКлиенте
Процедура СоздатьДокументНаОснованииПроекта(Команда)
ПараметрыЗаполнения = Новый Структура;
ПараметрыЗаполнения.Вставить("ВидДокумента", СсылкаНаВидДокумента);
ПараметрыЗаполнения.Вставить("Проект", Объект.Ссылка);
ПараметрыЗаполнения.Вставить("Заголовок", "Согласование проекта " + Объект.Код);
ПараметрыФормы = Новый Структура("ЗначенияЗаполнения", ПараметрыЗаполнения);
ОткрытьФорму("Справочник.ДокументыПредприятия.ФормаОбъекта", ПараметрыФормы);
КонецПроцедуры
При таком подходе в модуле объекта сработает стандартный обработчик ОбработкаЗаполнения, который корректно инициализирует документ, подтянет все настройки вида документа и применит логику прав доступа.
Проанализировав возможности ДО 3.0, можно сделать вывод: создание документа по его виду требует понимания того, что мы работаем со справочником ДокументыПредприятия.
Основные правила для разработчика:
ВидДокумента первым делом.ШаблоныДокументов.ДополнительныеРеквизиты.ЗначенияЗаполнения.Применяя эти методы, вы обеспечите стабильную работу системы и корректное заполнение всех связанных данных в "1С:Документооборот 3.0".