Работа со ссылками
Для взаимодействия со ссылками на объекты базы данных 1С реализовано два класса:
- ПеречислениеСсылка (для взаимодействия с перечислениями 1С);
- ОбъектСсылка (для взаимодействия с объектами коллекций 1С).
Ссылки используются для:
- непосредственно для передачи значений ссылочного типа между клиентским модулем и 1С в обоих направлениях;
- для доступа к контекстным данным объекта, на который указывает ссылка;
- для воссоздания контекста объекта с целью его модификации (только для ссылок на объекты).
"ОбъектСсылка" может ссылаться на:
- объект справочника (СправочникСсылка);
- объект документа (ДокументСсылка);
- объект плана видов характеристик (ПланВидовХарактеристикСсылка);
- объект плана счетов (ПланСчетовСсылка);
- объект плана видов расчета (ПланВидовРасчетаСсылка);
- объект бизнес-процесса (БизнесПроцессСсылка);
- объект задачи (ЗадачаСсылка).
Получение ссылок
Предопределенные значения
Ссылки на предопределенные значения хранятся в метаданных конфигурации на стороне клиентского модуля и могут быть получены без обращения к серверу. Для получения предопределенного значения достаточно обратиться к модулю менеджера соответствующей коллекции и указать имя предопределенного значения:
ндс18 = клиент.Перечисления.СтавкиНДС.НДС18
видТовар = клиент.Справочники.ВидыНоменклатуры.Товары
Получение из серверных методов
Ссылка на объект или перечисление может быть получена из серверного метода, возвращающего ссылку или структуру данных, содержащую ссылку:
телевизорСсылка = клиент.Справочники.Номенклатура.НайтиПоНаименованию("Телевизор")
заказСсылка = клиент.Документы.ЗаказКлиента.НайтиПоНомеру("000000001", datetime.date(2019, 1, 1))
контрагентСсылка = клиент.Справочники.Контрагенты.НайтиПоКоду("000000002")
документы = клиент.КритерииОтбора.ДокументыКонтрагента.Найти(контрагентСсылка)
for текДокСсылка in документы:
print(текДокСсылка)
Генерация ссылок
Ссылка на объект или перечисление может быть создана на стороне клиента. Создать ссылку можно:
- вызвав статический метод "СоздатьСсылку()" базового класса "Ссылка";
- вызвав метод "ПолучитьСсылку()" или "ПустаяСсылка()" модуля менеджера требуемой коллекции.
# Создаем пустую ссылку
пустаяСсылка = клиент.Справочники.Номенклатура.ПустаяСсылка()
# Создаем ссылку с указанием конкретного уникального идентификатора
известнаяСсылка = клиент.Справочники.Номенклатура.ПолучитьСсылку(uuid.UUID('{5a32b6ab-4661-11e9-912a-38d547755ef7}'))
# Генерируем ссылку с новым уникальным идентификатором
новаяСсылка = клиент.Справочники.Номенклатура.ПолучитьСсылку(uuid.uuid4())
# Создаем пустую ссылку
пустаяСсылка = Ссылка.СоздатьСсылку(клиент, "Справочник.Номенклатура")
# Создаем ссылку с указанием конкретного уникального идентификатора
известнаяСсылка = Ссылка.СоздатьСсылку(клиент, "Справочник.Номенклатура", uuid.UUID('{5a32b6ab-4661-11e9-912a-38d547755ef7}'))
# Генерируем ссылку с новым уникальным идентификатором
новаяСсылка = Ссылка.СоздатьСсылку(клиент, "Справочник.Номенклатура", uuid.uuid4())
# Создаем пустую ссылку
пустаяСсылка = Ссылка.СоздатьСсылку(клиент, "Перечисление.СтавкиНДС")
# Создаем ссылку с указанием конкретного уникального идентификатора
известнаяСсылка = Ссылка.СоздатьСсылку(клиент, "Перечисление.СтавкиНДС", "НДС18")
Получение контекстных данных
Через ссылку на объект коллекции можно получить значения внутренних реквизитов и табличных частей объекта. Контекстные данные объектов доступны только на чтение.
# Обращаемся к данным в объектном стиле
телевизорСсылка = клиент.Справочники.Номенклатура.НайтиПоНаименованию("Телевизор")
артикул = телевизорСсылка.Артикул
производитель = телевизорСсылка.Производитель
иннПроизводителя = телевизорСсылка.Производитель.ИНН
for стр in телевизорСсылка.ДополнительныеРеквизиты:
print("{0}: {1}".format(стр.Свойство, стр.Значение))
# Удаляем контекстные данные ссылки для экономии ресурсов, если они больше не нужны
клиент.Контекст().ОчиститьДанныеОбъекта(телевизорСсылка)
# Обращаемся к данным через оператор "[]"
заказСсылка = клиент["Документы"]["ЗаказКлиента"].ПолучитьСсылку(uuid.UUID('{5a32b6ab-4661-11e9-912a-38d547755ef7}'))
датаЗаказа = заказСсылка["Дата"]
контрагент = заказСсылка["Контрагент"]
иннКонтрагента = заказСсылка["Контрагент"]["ИНН"]
for стр in заказСсылка["Товары"]:
print("{0}: {1}".format(стр["Номенклатура"], стр["Количество"]))
# Удаляем контекстные данные ссылки для экономии ресурсов, если они больше не нужны
клиент.Контекст().ОчиститьДанныеОбъекта(заказСсылка)
ВАЖНО!
При обращении к любому атрибуту объекта через ссылку с сервера загружается полный набор данных объекта (данные всех реквизитов и табличных частей). Контекстные данные объекта ссылки хранятся на стороне клиента до окончания обработки скрипта.
Получение контекста объекта и редактирование данных
Через ссылку на объект может быть создан контекст объекта. Контекст объекта позволяет модифицировать данные объекта с последующей записью данных на стороне сервера.
товарСсылка = клиент.Справочники.Номенклатура.НайтиПоНаименованию("Демо товар")
товарОбъект = товарСсылка.ПолучитьОбъект()
товарОбъект.Артикул = "Т-000123"
товарОбъект.Записать()
print(товарСсылка.Артикул)
заказСсылка = клиент.Документы.ЗаказКлиента.НайтиПоНомеру("000000001", datetime.date(2019, 1, 1))
заказОбъект = заказСсылка.ПолучитьОбъект()
заказОбъект.Товары.Очистить()
стр = заказОбъект.Товары.Добавить()
стр.Номенклатура = клиент.Справочники.Номенклатура.НайтиПоНаименованию("Телевизор")
стр.Количество = 2
заказОбъект.Записать(РежимЗаписиДокумента.Проведение)
После записи контекста объекта происходит полная загрузка всех его контекстных данных. Более подробная информация о работе с контекстом объектов находится в разделе "Работа с объектами".