Как программно создать документ в 1С и получить ссылку на него для дальнейшей работы?

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

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

Понимание жизненного цикла объекта в базе данных

Важно различать объект документа в оперативной памяти и его представление в базе данных. Когда вы вызываете метод СоздатьДокумент(), система формирует в памяти объект, который еще не имеет постоянного адреса (ссылки) в базе. Ссылка становится актуальной и валидной только после успешной записи объекта в базу данных. Поэтому логика «создать — заполнить — записать — получить ссылку» является единственно верной.

Решение проблемы получения ссылки

Для того чтобы получить ссылку на записанный документ, не нужно вызывать метод ПолучитьСсылку() до записи. На самом деле, после того как вы вызвали метод Записать(), свойство Ссылка у самого объекта документа автоматически заполняется системой. Рассмотрим правильный код для реализации этой задачи:


// Создаем объект документа
НовДок = Документы.ПриемНаРаботуВОрганизацию.СоздатьДокумент();

// Заполняем реквизиты данными с формы
НовДок.Организация = Организация;
НовДок.Дата = ТекущаяДата();

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

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

Почему использование «Попытки» обязательно?

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

Архитектурные советы: инкапсуляция и метод Заполнить()

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

Разберем преимущества такого подхода:

  1. Минимизация дублирования кода: Если логика заполнения реквизитов (например, значений по умолчанию) изменится в основном модуле документа, вам не придется править внешнюю обработку.
  2. Соблюдение принципов инкапсуляции: Внешняя обработка не должна знать внутреннюю структуру табличных частей документа. Она лишь передает необходимые данные.
  3. Корректность: Метод ОбработкаЗаполнения() может выполнять дополнительные вычисления и проверки, которые вы рискуете пропустить при ручном заполнении.

Пример использования метода Заполнить():


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

Заключение: культура разработки

При написании кода всегда задумывайтесь о его читаемости. Имена функций должны отражать суть выполняемого действия. Если ваша функция создает документ, называйте её так, чтобы другой разработчик сразу понял назначение (например, СоздатьДокументПриемНаРаботу()). Разделяйте логику на небольшие методы: один метод — одна ответственность. Такой подход поможет вам не только успешно пройти тестовое задание, но и построить качественную систему, которую легко поддерживать в будущем.

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

← На главную