При ведении учета в 1С:Бухгалтерии 3.0 часто возникает задача приведения данных в порядок, в частности — массового назначения основного контактного лица для справочника Контрагенты. Давайте разберем, как решить эту задачу программными методами, учитывая архитектуру конфигурации.
В справочнике Контрагенты существует реквизит ОсновноеКонтактноеЛицо, который ссылается на справочник КонтактныеЛица. Чтобы выполнить массовое обновление, нам необходимо пройти по списку контрагентов и для каждого из них корректно присвоить ссылку на нужное лицо. Важно помнить, что простое изменение реквизита без учета логики бизнес-процессов может привести к ошибкам, поэтому мы будем использовать методы, максимально приближенные к типовым механизмам.
Для решения задачи мы можем воспользоваться механизмом Запрос. Этот подход позволяет нам быстро отобрать данные и обработать их. Разберем по шагам, как это реализовать:
ОсновноеКонтактноеЛицо.Попытка...Исключение, чтобы избежать прерывания процесса при возникновении ошибок.Рассмотрим пример кода для такой обработки:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| КонтактныеЛица.Ссылка КАК КонтЛицо,
| КонтактныеЛица.ОбъектВладелец КАК ОбъектВладелец
|ИЗ
| Справочник.КонтактныеЛица КАК КонтактныеЛица";
Результат = Запрос.Выполнить().Выгрузить();
Для Каждого Стр из Результат Цикл
КонтрОбъект = Стр.ОбъектВладелец.ПолучитьОбъект();
Если КонтрОбъект <> Неопределено Тогда
КонтрОбъект.ОсновноеКонтактноеЛицо = Стр.КонтЛицо;
Попытка
КонтрОбъект.Записать();
Исключение
Сообщить("Не удалось записать данные для контрагента: " + КонтрОбъект);
КонецПопытки;
КонецЕсли;
КонецЦикла;
В типовых конфигурациях 1С часто существуют готовые процедуры для выполнения подобных действий. Использование таких процедур предпочтительнее, так как они уже включают в себя проверки на блокировки и запись событий в журнал регистрации. Рассмотрим, как это реализовано внутри самой системы:
&НаСервереБезКонтекста
Процедура ЗаписатьОсновноеКонтактноеЛицо(СтруктураПараметров)
Контрагент = СтруктураПараметров.Контрагент;
КонтрагентОбъект = Контрагент.ПолучитьОбъект();
УстановитьОсновноеКонтактноеЛицо = Истина;
Попытка
КонтрагентОбъект.Заблокировать();
Исключение
УстановитьОсновноеКонтактноеЛицо = Ложь;
ЗаписьЖурналаРегистрации(НСтр("ru = 'Изменение контактных лиц контрагента'"),
УровеньЖурналаРегистрации.Предупреждение,
Метаданные.Справочники.Контрагенты,
Контрагент,
"Не удалось заблокировать справочник");
КонецПопытки;
Если УстановитьОсновноеКонтактноеЛицо Тогда
КонтрагентОбъект.ОсновноеКонтактноеЛицо = СтруктураПараметров.ОсновноеКонтактноеЛицо;
КонтрагентОбъект.Записать();
КонецЕсли;
КонецПроцедуры
При выполнении массовых операций всегда следуйте этим правилам:
Владелец).ОсновноеКонтактноеЛицо сейчас не заполнено.Заблокировать() оправдано, но помните, что это может замедлить процесс. В интерактивных обработках старайтесь минимизировать время нахождения объекта в заблокированном состоянии.Таким образом, комбинируя возможности запросов 1С и методы объектов СправочникОбъект, вы сможете автоматизировать рутинные задачи, обеспечивая высокую точность данных в системе.