Как в 1С:УТ 10.3 найти или создать договор нужного вида и заменить его в документах?

Программист 1С v8.3 (Обычные формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

В процессе работы с конфигурацией «Управление торговлей 10.3» может возникнуть задача массово скорректировать данные в документах. Например, если для учета комиссионных товаров необходимо изменить вид договора у контрагента в документах ПоступлениеТоваровУслуг и РеализацияТоваровУслуг.

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

Шаг 1. Поиск существующего договора по виду и владельцу

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

Простой запрос, который ищет договоры только по виду, будет неполным. Ключевым моментом является отбор по владельцу (контрагенту), чтобы найти договор именно для нужного партнера. Также важно учитывать организацию, если в базе ведется многофирменный учет.

Правильный запрос для поиска будет выглядеть так:


ВЫБРАТЬ
    ДоговорыКонтрагентов.Ссылка
ИЗ
    Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов
ГДЕ
    ДоговорыКонтрагентов.Владелец = &Контрагент
    И ДоговорыКонтрагентов.ВидДоговора = &ВидДоговора
    И ДоговорыКонтрагентов.Организация = &Организация
    И НЕ ДоговорыКонтрагентов.ПометкаУдаления

Проанализируем параметры этого запроса:

  1. &Контрагент — сюда мы передаем ссылку на контрагента из документа, для которого ищем договор. Это поле Владелец в справочнике договоров.
  2. &ВидДоговора — здесь указывается нужный вид договора. Это значение из перечисления, например, Перечисления.ВидыДоговоровКонтрагентов.СКомитентом.
  3. &Организация — ссылка на организацию, от лица которой оформляется документ.
  4. НЕ ДоговорыКонтрагентов.ПометкаУдаления — стандартное и рекомендуемое условие, чтобы исключить из выборки неактивные, помеченные на удаление договоры.

Если этот запрос вернет одну или несколько строк, значит, подходящий договор уже существует, и мы можем использовать его ссылку для подстановки в документ.

Шаг 2. Программное создание нового договора

Если запрос из первого шага не вернул никаких результатов, это означает, что у контрагента нет активного договора нужного вида. В этом случае его необходимо создать программно.

Рассмотрим алгоритм создания нового элемента справочника ДоговорыКонтрагентов:

  1. Создаем новый объект. Используем метод СоздатьЭлемент().
  2. Заполняем ключевые реквизиты. Обязательно нужно указать Владелец, Организация, ВидДоговора и Наименование. Наименование можно сформировать автоматически, например, "Основной договор комиссии от [дата]".
  3. Заполняем прочие важные реквизиты. В зависимости от учетной политики, важно корректно заполнить ВалютаВзаиморасчетов, ТипЦен и ВедениеВзаиморасчетов (часто устанавливается значение "По договору в целом").
  4. Записываем объект. Используем метод Записать(), чтобы сохранить новый договор в базе данных.
  5. Получаем ссылку. После записи мы можем получить ссылку на новый элемент и использовать ее в дальнейшем.

Посмотрим на пример кода, который реализует этот алгоритм:


Функция НайтиИлиСоздатьДоговор(Контрагент, Организация, НужныйВидДоговора)

    // Шаг 1: Ищем существующий договор
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ ПЕРВЫЕ 1
        |    ДоговорыКонтрагентов.Ссылка
        |ИЗ
        |    Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов
        |ГДЕ
        |    ДоговорыКонтрагентов.Владелец = &Контрагент
        |    И ДоговорыКонтрагентов.ВидДоговора = &ВидДоговора
        |    И ДоговорыКонтрагентов.Организация = &Организация
        |    И НЕ ДоговорыКонтрагентов.ПометкаУдаления";
    
    Запрос.УстановитьПараметр("Контрагент", Контрагент);
    Запрос.УстановитьПараметр("Организация", Организация);
    Запрос.УстановитьПараметр("ВидДоговора", НужныйВидДоговора);
    
    Результат = Запрос.Выполнить().Выбрать();
    
    Если Результат.Следующий() Тогда
        // Договор найден, возвращаем его
        Возврат Результат.Ссылка;
    Иначе
        // Шаг 2: Договор не найден, создаем новый
        НовыйДоговор = Справочники.ДоговорыКонтрагентов.СоздатьЭлемент();
        НовыйДоговор.Владелец = Контрагент;
        НовыйДоговор.Организация = Организация;
        НовыйДоговор.ВидДоговора = НужныйВидДоговора;
        НовыйДоговор.Наименование = "Основной договор (" + Строка(НужныйВидДоговора) + ")";
        НовыйДоговор.ВалютаВзаиморасчетов = Константы.ВалютаРегламентированногоУчета.Получить();
        // Заполняем другие важные реквизиты по умолчанию...
        
        Попытка
            НовыйДоговор.Записать();
            Возврат НовыйДоговор.Ссылка;
        Исключение
            Сообщить("Не удалось создать новый договор для контрагента: " + Контрагент);
            Возврат Справочники.ДоговорыКонтрагентов.ПустаяСсылка();
        КонецПопытки;
    КонецЕсли;

КонецФункции

Шаг 3. Комплексный алгоритм обработки документов

Теперь объединим все в единый алгоритм для пакетного изменения документов.

  1. Выбираем документы для обработки. Сначала нужно получить список документов, которые мы будем изменять. Это можно сделать запросом, отобрав, например, все поступления за период, у которых вид договора не "С комитентом".
  2. Организуем цикл по выборке. Будем перебирать найденные документы.
  3. Внутри цикла получаем объект документа. Для внесения изменений нам понадобится объект документа, который мы получаем методом ПолучитьОбъект().
  4. Определяем нужный договор. Вызываем нашу функцию НайтиИлиСоздатьДоговор(), передав в нее контрагента и организацию из документа.
  5. Проверяем и изменяем. Если найденный/созданный договор не совпадает с тем, что уже указан в документе, подставляем новую ссылку в реквизит ДоговорКонтрагента.
  6. Перепроводим документ. После внесения изменений документ необходимо записать в режиме проведения, чтобы он сформировал корректные движения по регистрам. Для этого используем метод Записать(РежимЗаписиДокумента.Проведение).

Весь процесс лучше обернуть в конструкцию Попытка-Исключение, чтобы отлавливать возможные ошибки при проведении документов.

КРИТИЧЕСКИ ВАЖНО: Последствия смены вида договора

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

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

← На главную