При работе с платформой 1С:Предприятие 8.3 часто возникает необходимость массово изменить данные не только в шапке справочника, но и в его табличных частях. Если в случае с документами обработка «Групповое изменение реквизитов» обычно сразу выводит закладки с табличными частями, то со справочниками ситуация сложнее. Часто табличные части справочников (например, КонтактнаяИнформация) являются служебными или имеют сложную структуру, из-за чего они не отображаются в стандартном интерфейсе выбора реквизитов.
В данной статье мы разберем, как обойти это ограничение, используя встроенную возможность выполнения произвольного алгоритма, и выясним, почему обычное добавление строки в таблицу может не давать результата.
Рассмотрим типичную ситуацию: программист пытается добавить строку в табличную часть КонтактнаяИнформация справочника ИнформационныеКарты. Он пишет простой код, который добавляет новую строку и заполняет номер телефона. Однако после выполнения обработки данные в справочнике не появляются. Выясним причину этого поведения.
Проблема заключается в том, что в современных конфигурациях на базе БСП (Библиотеки стандартных подсистем) контактная информация — это не просто набор строк в таблице. Это сложный объект, данные которого хранятся в нескольких полях, включая скрытое поле ЗначенияПолей (обычно в формате XML или JSON). Если вы заполните только поле НомерТелефона, но оставите пустыми поля Вид, Тип или Представление, система при записи объекта или при открытии формы может посчитать такую строку некорректной и просто удалить её или скрыть от пользователя. Чтобы данные «закрепились» в базе, необходимо соблюдать правила заполнения, принятые в БСП.
Если нам необходимо жестко прописать данные в табличную часть, мы можем воспользоваться режимом «Выполнить произвольный алгоритм» в обработке группового изменения. Проанализируем правильный подход к заполнению строки контактной информации. Нам нужно не просто вызвать метод Добавить(), но и инициализировать все ключевые реквизиты строки.
Рассмотрим пример кода для добавления номера телефона в информационную карту:
// 1. Очищаем старую информацию, если это необходимо по логике задачи
Объект.КонтактнаяИнформация.Очистить();
// 2. Получаем ссылку на нужный вид контактной информации
// Важно: вид КИ должен соответствовать справочнику
ВидКИТелефон = Справочники.ВидыКонтактнойИнформации.ТелефонИнформационнойКарты;
// 3. Добавляем новую строку и заполняем ее структуру
СтрокаКИ = Объект.КонтактнаяИнформация.Добавить();
СтрокаКИ.Вид = ВидКИТелефон;
СтрокаКИ.Тип = ВидКИТелефон.Тип; // Обычно это Перечисления.ТипыКонтактнойИнформации.Телефон
СтрокаКИ.НомерТелефона = "1234567890";
СтрокаКИ.Представление = "1234567890";
// 4. Записываем объект
Объект.Записать();
В этом примере мы явно указываем Вид и Тип. Без этих данных система «не понимает», что это за контактная информация, и строка остается невидимой для стандартных механизмов отображения. Также обратите внимание, что мы работаем напрямую с переменной Объект, которая в контексте данной обработки является экземпляром объекта справочника (СправочникОбъект).
Проанализируем более продвинутый способ. В типовых конфигурациях (Розница, Управление торговлей, ERP) за работу с адресами и телефонами отвечает программный интерфейс БСП. Вместо того чтобы вручную «набивать» строки в таблицу, правильнее вызвать готовую процедуру, которая сама сформирует все необходимые XML/JSON структуры в скрытых полях.
Для этого мы воспользуемся общим модулем УправлениеКонтактнойИнформацией. Посмотрим, как будет выглядеть код в окне произвольного алгоритма:
// Определяем параметры: тип КИ и сам номер
Телефон = "79001112233";
ВидКИ = Справочники.ВидыКонтактнойИнформации.ТелефонИнформационнойКарты;
// Используем программный интерфейс для добавления КИ
// Метод сам позаботится о заполнении всех необходимых полей
УправлениеКонтактнойИнформацией.ДобавитьКонтактнуюИнформацию(Объект, Телефон, ВидКИ, ТекущаяДата(), Истина);
// Обязательно фиксируем изменения
Объект.Записать();
Преимущество этого метода в том, что он универсален. Если завтра разработчики 1С изменят формат хранения КИ (например, перейдут с XML на JSON), ваш код останется рабочим, так как вы используете стандартный метод ДобавитьКонтактнуюИнформацию, который обновляется вместе с конфигурацией.
Разберем несколько критических моментов, которые помогут избежать ошибок при обработке больших массивов данных (например, 80 000 дисконтных карт, как упоминалось в обсуждении):
ОбменДанными.Загрузка.
Пример:
Объект.ОбменДанными.Загрузка = Истина;
Объект.Записать();
НайтиСтроки().Рассмотрим пошагово, как запустить процесс:
Информационные карты).Подведем итог: изменение табличных частей справочников в 1С через групповую обработку вполне реально. Главное — помнить, что современные справочники — это не просто таблицы, а структурированные данные, требующие корректного заполнения всех связанных полей. Использование методов БСП является наиболее надежным и "чистым" способом решения подобных задач.