Как реализовать заполнение документа на основании последнего проведенного документа по контрагенту в 1С?

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

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

Разбор ошибки типизации параметра запроса

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

Важно помнить: Запрос не найдет соответствий, если сравнивать ссылку с текстовым представлением. Чтобы исправить ошибку, необходимо передавать ссылку на объект:


// Неправильно: Запрос.УстановитьПараметр("Контрагент", Объект.Наименование);
// Правильно:
Запрос.УстановитьПараметр("Контрагент", Объект.Ссылка);

Использование Объект.Ссылка гарантирует, что система корректно сопоставит уникальный идентификатор контрагента с данными в базе.

Учет статуса проведения документа

Задача требует брать данные именно из проведенного документа. Если в запросе не указать условие проведения, система может вернуть «черновик» или отмененный документ. Добавим обязательное условие ГДЕ ПриобретениеТоваровИУслуг.Проведен = ИСТИНА.

Давайте посмотрим, как должен выглядеть исправленный код запроса:


Запрос.Текст = 
    "ВЫБРАТЬ ПЕРВЫЕ 1
    |    Док.Ссылка КАК Ссылка
    |ИЗ
    |    Документ.ПриобретениеТоваровИУслуг КАК Док
    |ГДЕ
    |    Док.Контрагент = &Контрагент
    |    И Док.Проведен = ИСТИНА
    |УПОРЯДОЧИТЬ ПО
    |    Док.Дата УБЫВ";

Методология определения «последнего» документа

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

  1. Дата документа против момента записи: Использование Дата УБЫВ — самый простой путь, но он имеет изъян. Пользователь может ввести документ задним числом. Если критична именно последовательность создания, лучше ориентироваться на поле МоментВремени, которое фиксирует реальный порядок записи объектов в базу данных.
  2. Статус проведения: Как уже было отмечено, непроведенные документы не должны участвовать в цепочке заполнения, так как они могут содержать некорректные или временные данные.
  3. Проверка на пустой результат: Всегда проверяйте, вернул ли запрос данные. Если выборка пуста (например, по новому контрагенту еще нет истории), программа должна корректно завершить работу без ошибок, либо выдать сообщение пользователю.

Рекомендации по реализации

Рассмотрим по шагам, как лучше организовать процесс переноса данных:

Шаг 1: Выполните запрос и проверьте наличие записей с помощью метода Выборка.Следующий().

Шаг 2: Не копируйте документ целиком через Скопировать() бездумно. Часто бывает полезно использовать метод ЗаполнитьЗначенияСвойств(), чтобы перенести только основные реквизиты (например, Договор, Склад, Валюта), не перенося при этом комментарии или старые табличные части, которые могут быть неактуальны.

Шаг 3: Если необходимо перенести табличную часть, делайте это программно, перебирая строки исходного документа. Это позволит вам, например, сразу пересчитать цены или исключить товары, которых нет в наличии на складе.

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

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

← На главную