При программном создании элементов справочников в типовых конфигурациях (таких как 1С:Управление торговлей 11, 1С:Комплексная автоматизация или 1С:ERP Управление предприятием) разработчики часто сталкиваются с ситуацией: код выполняется без явных синтаксических ошибок, но новый элемент не появляется в списке справочника. Разберем по шагам все возможные причины такого поведения и рассмотрим правильные варианты реализации.
В современных конфигурациях 1С сущности разделены:
Если в настройках программы включена опция раздельного ведения партнеров и контрагентов, партнер может быть создан без привязки к контрагенту. Однако если опция отключена (партнеры и контрагенты ведутся совместно), программа связывает каждую запись партнера с соответствующим контрагентом. Динамический список партнеров в форме списка может строиться на основе сложного запроса с левым или внутренним соединением к таблице контрагентов, а также иметь системные отборы (например, по статусу или сегменту). Если связанный контрагент отсутствует или не заполнены ключевые управленческие реквизиты, запись может просто не попадать в выборку формы списка.
Когда мы создаем элемент через метод Справочники.Партнеры.СоздатьЭлемент(), платформенное событие ОбработкаЗаполнения автоматически не вызывается. В результате остаются пустыми важные системные реквизиты: ГруппаДоступа, ОсновнойМенеджер, признак активности и статусы.
Рассмотрим, как правильно инициализировать значения по умолчанию перед заполнением основных реквизитов:
&НаСервере
Функция СоздатьПартнераНаСервере()
НовыйПартнер = Справочники.Партнеры.СоздатьЭлемент();
// Инициализируем типовое заполнение по умолчанию
НовыйПартнер.Заполнить(Неопределено);
// Заполняем реквизиты объекта
НовыйПартнер.Наименование = "Петров Иван Николаевич";
НовыйПартнер.НаименованиеПолное = "Петров Иван Николаевич";
НовыйПартнер.ЮрФизЛицо = Перечисления.КомпанияЧастноеЛицо.ЧастноеЛицо;
НовыйПартнер.Клиент = Истина;
НовыйПартнер.Пол = Перечисления.ПолФизическогоЛица.Мужской;
// Проверяем заполнение группы доступа (при необходимости)
Если Не ЗначениеЗаполнено(НовыйПартнер.ГруппаДоступа) Тогда
НовыйПартнер.ГруппаДоступа = Справочники.ГруппыДоступаПартнеров.ПустаяСсылка();
КонецЕсли;
Попытка
НовыйПартнер.Записать();
Возврат НовыйПартнер.Ссылка;
Исключение
ВызватьИсключение "Ошибка при записи партнера: " + ОписаниеОшибки();
КонецПопытки;
КонецФункции
Платформа 1С кэширует данные динамических списков на клиенте. Если элемент успешно записан на сервере из фонового задания или внешней обработки, открытая форма списка может не узнать об изменениях автоматически без принудительного обновления.
Для гарантированного обновления всех открытых динамических списков в системе используется процедура ОповеститьОбИзменении(). Разберем клиентский вызов:
&НаКлиенте
Процедура КомандаСоздатьКлиента(Команда)
СсылкаНаКлиента = СоздатьПартнераНаСервере();
Если ЗначениеЗаполнено(СсылкаНаКлиента) Тогда
// Оповещаем динамические списки об изменении конкретного объекта
ОповеститьОбИзменении(СсылкаНаКлиента);
// Либо оповещаем систему об изменении типа данных в целом:
// ОповеститьОбИзменении(Тип("СправочникСсылка.Партнеры"));
ПоказатьОповещениеПользователя("Успешно", , "Партнер успешно создан!");
КонецЕсли;
КонецПроцедуры
Если код выполняется непосредственно в модуле формы списка, где находится элемент Список, можно принудительно вызвать обновление таблицы:
Элементы.Список.Обновить();
Если элемент не записывается или не удается понять, на каком этапе происходит сбой, применим следующие инструменты:
ОбменДанными.Загрузка = Истина. Если с этим флагом объект записывается, значит, не было заполнено одно из обязательных для типовой логики полей.&НаСервере), проверьте настройки подключения в конфигураторе (меню Отладка — Подключение — Настройка). Убедитесь, что установлены флаги «Сервер» и «Фоновые задания». В клиент-серверном варианте служба сервера 1С:Предприятия должна быть запущена с ключом -debug или настроенным брокером отладки по HTTP.