Как массово установить основное контактное лицо для контрагентов в 1С:Бухгалтерии 3.0?

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия
← На главную

При ведении учета в 1С:Бухгалтерии 3.0 часто возникает задача приведения данных в порядок, в частности — массового назначения основного контактного лица для справочника Контрагенты. Давайте разберем, как решить эту задачу программными методами, учитывая архитектуру конфигурации.

Понимание структуры задачи

В справочнике Контрагенты существует реквизит ОсновноеКонтактноеЛицо, который ссылается на справочник КонтактныеЛица. Чтобы выполнить массовое обновление, нам необходимо пройти по списку контрагентов и для каждого из них корректно присвоить ссылку на нужное лицо. Важно помнить, что простое изменение реквизита без учета логики бизнес-процессов может привести к ошибкам, поэтому мы будем использовать методы, максимально приближенные к типовым механизмам.

Метод первый: использование запроса и циклической записи

Для решения задачи мы можем воспользоваться механизмом Запрос. Этот подход позволяет нам быстро отобрать данные и обработать их. Разберем по шагам, как это реализовать:

  1. Создаем новый запрос, который выбирает нужные контактные лица из соответствующего справочника.
  2. В цикле получаем объект владельца (контрагента).
  3. Присваиваем реквизит ОсновноеКонтактноеЛицо.
  4. Сохраняем изменения с использованием конструкции Попытка...Исключение, чтобы избежать прерывания процесса при возникновении ошибок.

Рассмотрим пример кода для такой обработки:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	КонтактныеЛица.Ссылка КАК КонтЛицо,
    |	КонтактныеЛица.ОбъектВладелец КАК ОбъектВладелец
    |ИЗ
    |	Справочник.КонтактныеЛица КАК КонтактныеЛица";

Результат = Запрос.Выполнить().Выгрузить();

Для Каждого Стр из Результат Цикл
    КонтрОбъект = Стр.ОбъектВладелец.ПолучитьОбъект();
    Если КонтрОбъект <> Неопределено Тогда
        КонтрОбъект.ОсновноеКонтактноеЛицо = Стр.КонтЛицо;
        Попытка
            КонтрОбъект.Записать();
        Исключение
            Сообщить("Не удалось записать данные для контрагента: " + КонтрОбъект);
        КонецПопытки;
    КонецЕсли;
КонецЦикла;

Метод второй: использование типовых процедур конфигурации

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


&НаСервереБезКонтекста
Процедура ЗаписатьОсновноеКонтактноеЛицо(СтруктураПараметров)
    Контрагент = СтруктураПараметров.Контрагент;
    КонтрагентОбъект = Контрагент.ПолучитьОбъект();
    УстановитьОсновноеКонтактноеЛицо = Истина;

    Попытка
        КонтрагентОбъект.Заблокировать();
    Исключение
        УстановитьОсновноеКонтактноеЛицо = Ложь;
        ЗаписьЖурналаРегистрации(НСтр("ru = 'Изменение контактных лиц контрагента'"), 
            УровеньЖурналаРегистрации.Предупреждение, 
            Метаданные.Справочники.Контрагенты, 
            Контрагент, 
            "Не удалось заблокировать справочник");
    КонецПопытки;

    Если УстановитьОсновноеКонтактноеЛицо Тогда
        КонтрагентОбъект.ОсновноеКонтактноеЛицо = СтруктураПараметров.ОсновноеКонтактноеЛицо;
        КонтрагентОбъект.Записать();
    КонецЕсли;
КонецПроцедуры

Практические советы и рекомендации

При выполнении массовых операций всегда следуйте этим правилам:

Таким образом, комбинируя возможности запросов 1С и методы объектов СправочникОбъект, вы сможете автоматизировать рутинные задачи, обеспечивая высокую точность данных в системе.

← На главную