Как изменить табличную часть справочника в обработке «Групповое изменение реквизитов»?

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

При работе с платформой 1С:Предприятие 8.3 часто возникает необходимость массово изменить данные не только в шапке справочника, но и в его табличных частях. Если в случае с документами обработка «Групповое изменение реквизитов» обычно сразу выводит закладки с табличными частями, то со справочниками ситуация сложнее. Часто табличные части справочников (например, КонтактнаяИнформация) являются служебными или имеют сложную структуру, из-за чего они не отображаются в стандартном интерфейсе выбора реквизитов.

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

Почему табличная часть справочника может не сохраняться?

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

Проблема заключается в том, что в современных конфигурациях на базе БСП (Библиотеки стандартных подсистем) контактная информация — это не просто набор строк в таблице. Это сложный объект, данные которого хранятся в нескольких полях, включая скрытое поле ЗначенияПолей (обычно в формате XML или JSON). Если вы заполните только поле НомерТелефона, но оставите пустыми поля Вид, Тип или Представление, система при записи объекта или при открытии формы может посчитать такую строку некорректной и просто удалить её или скрыть от пользователя. Чтобы данные «закрепились» в базе, необходимо соблюдать правила заполнения, принятые в БСП.

Решение 1: Прямое заполнение табличной части через произвольный алгоритм

Если нам необходимо жестко прописать данные в табличную часть, мы можем воспользоваться режимом «Выполнить произвольный алгоритм» в обработке группового изменения. Проанализируем правильный подход к заполнению строки контактной информации. Нам нужно не просто вызвать метод Добавить(), но и инициализировать все ключевые реквизиты строки.

Рассмотрим пример кода для добавления номера телефона в информационную карту:


// 1. Очищаем старую информацию, если это необходимо по логике задачи
Объект.КонтактнаяИнформация.Очистить();

// 2. Получаем ссылку на нужный вид контактной информации
// Важно: вид КИ должен соответствовать справочнику
ВидКИТелефон = Справочники.ВидыКонтактнойИнформации.ТелефонИнформационнойКарты;

// 3. Добавляем новую строку и заполняем ее структуру
СтрокаКИ = Объект.КонтактнаяИнформация.Добавить();
СтрокаКИ.Вид = ВидКИТелефон;
СтрокаКИ.Тип = ВидКИТелефон.Тип; // Обычно это Перечисления.ТипыКонтактнойИнформации.Телефон
СтрокаКИ.НомерТелефона = "1234567890";
СтрокаКИ.Представление = "1234567890";

// 4. Записываем объект
Объект.Записать();

В этом примере мы явно указываем Вид и Тип. Без этих данных система «не понимает», что это за контактная информация, и строка остается невидимой для стандартных механизмов отображения. Также обратите внимание, что мы работаем напрямую с переменной Объект, которая в контексте данной обработки является экземпляром объекта справочника (СправочникОбъект).

Решение 2: Использование механизмов БСП (Рекомендуемый способ)

Проанализируем более продвинутый способ. В типовых конфигурациях (Розница, Управление торговлей, ERP) за работу с адресами и телефонами отвечает программный интерфейс БСП. Вместо того чтобы вручную «набивать» строки в таблицу, правильнее вызвать готовую процедуру, которая сама сформирует все необходимые XML/JSON структуры в скрытых полях.

Для этого мы воспользуемся общим модулем УправлениеКонтактнойИнформацией. Посмотрим, как будет выглядеть код в окне произвольного алгоритма:


// Определяем параметры: тип КИ и сам номер
Телефон = "79001112233";
ВидКИ = Справочники.ВидыКонтактнойИнформации.ТелефонИнформационнойКарты;

// Используем программный интерфейс для добавления КИ
// Метод сам позаботится о заполнении всех необходимых полей
УправлениеКонтактнойИнформацией.ДобавитьКонтактнуюИнформацию(Объект, Телефон, ВидКИ, ТекущаяДата(), Истина);

// Обязательно фиксируем изменения
Объект.Записать();

Преимущество этого метода в том, что он универсален. Если завтра разработчики 1С изменят формат хранения КИ (например, перейдут с XML на JSON), ваш код останется рабочим, так как вы используете стандартный метод ДобавитьКонтактнуюИнформацию, который обновляется вместе с конфигурацией.

Важные нюансы при массовом изменении

Разберем несколько критических моментов, которые помогут избежать ошибок при обработке больших массивов данных (например, 80 000 дисконтных карт, как упоминалось в обсуждении):

  1. Режим загрузки данных: Если справочник имеет сложные проверки в модуле объекта (например, проверка заполнения ИНН или уникальности номера), запись может заблокироваться. Чтобы обойти прикладные проверки, используйте свойство ОбменДанными.Загрузка.

    Пример:

    Объект.ОбменДанными.Загрузка = Истина; Объект.Записать();
  2. Безопасный режим: Обработка «Групповое изменение реквизитов» часто запускается в безопасном режиме. Это может ограничивать вызов некоторых серверных методов. Если алгоритм выдает ошибку прав доступа, попробуйте запустить обработку от имени администратора с полными правами или проверьте настройки профилей безопасности.
  3. Поиск существующих записей: Чтобы не дублировать телефоны при каждом запуске обработки, рекомендуется сначала проверять наличие записи с данным видом в табличной части. Это можно сделать простым методом НайтиСтроки().

Алгоритм действий для пользователя

Рассмотрим пошагово, как запустить процесс:

  1. Откройте обработку «Групповое изменение реквизитов» (в типовых это меню «Администрирование» — «Обслуживание» — «Корректировка данных»).
  2. Выберите нужный справочник (например, Информационные карты).
  3. Настройте отбор, чтобы не изменить лишние элементы.
  4. Нажмите кнопку «Дополнительные параметры» и убедитесь, что включена возможность изменения служебных реквизитов (если это требуется) и доступен режим выполнения кода.
  5. Перейдите по гиперссылке «Выполнить произвольный алгоритм».
  6. Вставьте подготовленный код (используя методы БСП или прямое заполнение ТЧ).
  7. Нажмите «Выполнить».

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

← На главную