Работа со ссылками

Для взаимодействия со ссылками на объекты базы данных 1С реализовано два класса:

  • ПеречислениеСсылка (для взаимодействия с перечислениями 1С);
  • ОбъектСсылка (для взаимодействия с объектами коллекций 1С).

Ссылки используются для:

  • непосредственно для передачи значений ссылочного типа между клиентским модулем и 1С в обоих направлениях;
  • для доступа к контекстным данным объекта, на который указывает ссылка;
  • для воссоздания контекста объекта с целью его модификации (только для ссылок на объекты).

"ОбъектСсылка" может ссылаться на:

  • объект справочника (СправочникСсылка);
  • объект документа (ДокументСсылка);
  • объект плана видов характеристик (ПланВидовХарактеристикСсылка);
  • объект плана счетов (ПланСчетовСсылка);
  • объект плана видов расчета (ПланВидовРасчетаСсылка);
  • объект бизнес-процесса (БизнесПроцессСсылка);
  • объект задачи (ЗадачаСсылка).

Получение ссылок

Предопределенные значения

Ссылки на предопределенные значения хранятся в метаданных конфигурации на стороне клиентского модуля и могут быть получены без обращения к серверу. Для получения предопределенного значения достаточно обратиться к модулю менеджера соответствующей коллекции и указать имя предопределенного значения:

ндс18 = клиент.Перечисления.СтавкиНДС.НДС18
видТовар = клиент.Справочники.ВидыНоменклатуры.Товары

Получение из серверных методов

Ссылка на объект или перечисление может быть получена из серверного метода, возвращающего ссылку или структуру данных, содержащую ссылку:

телевизорСсылка = клиент.Справочники.Номенклатура.НайтиПоНаименованию("Телевизор")
заказСсылка = клиент.Документы.ЗаказКлиента.НайтиПоНомеру("000000001", datetime.date(2019, 1, 1))
контрагентСсылка = клиент.Справочники.Контрагенты.НайтиПоКоду("000000002")
документы = клиент.КритерииОтбора.ДокументыКонтрагента.Найти(контрагентСсылка)

for текДокСсылка in документы:
	print(текДокСсылка)

Генерация ссылок

Ссылка на объект или перечисление может быть создана на стороне клиента. Создать ссылку можно:

  • вызвав статический метод "СоздатьСсылку()" базового класса "Ссылка";
  • вызвав метод "ПолучитьСсылку()" или "ПустаяСсылка()" модуля менеджера требуемой коллекции.
# Создаем пустую ссылку
пустаяСсылка = клиент.Справочники.Номенклатура.ПустаяСсылка()

# Создаем ссылку с указанием конкретного уникального идентификатора 
известнаяСсылка = клиент.Справочники.Номенклатура.ПолучитьСсылку(uuid.UUID('{5a32b6ab-4661-11e9-912a-38d547755ef7}'))

# Генерируем ссылку с новым уникальным идентификатором 
dynamic новаяСсылка = клиент.Справочники.Номенклатура.ПолучитьСсылку(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

заказОбъект.Записать(РежимЗаписиДокумента.Проведение)

После записи контекста объекта происходит полная загрузка всех его контекстных данных. Более подробная информация о работе с контекстом объектов находится в разделе "Работа с объектами".