Как получить GUID номенклатуры и спецификаций в 1С и вывести их в отчет для интеграции

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

В процессе разработки интеграций со сторонними системами (например, Node.js, веб-сайты или SQL-базы данных) часто возникает необходимость оперировать уникальными идентификаторами объектов (GUID). В отличие от внутренней логики 1С, где мы привыкли работать со ссылками, внешние системы требуют строковое представление уникального ключа. Часто интеграция между 1С системами также требует унификации этих данных через HTTP-сервисы и JSON. Рассмотрим подробно, как решить задачу создания простой обработки, которая выбирает данные (Номенклатуру и Спецификации) и выводит их GUID, а также разберем типичные ошибки при создании интерфейса управляемых форм.

Постановка задачи

Нам необходимо создать внешнюю обработку или отчет, который:

  1. Отбирает номенклатуру из определенной группы (например, "Насосные части (запас)").
  2. Находит связанные с ней спецификации.
  3. Выводит наименования объектов и их GUID (Уникальный Идентификатор).
  4. Результат должен отображаться в таблице на форме.

Впоследствии эти данные планируется использовать для создания документов через OData интерфейс.

Этап 1: Получение GUID в запросе 1С

Первая сложность, с которой можно столкнуться — это получение строкового представления GUID непосредственно в запросе. Рассмотрим, как правильно извлечь уникальный идентификатор.

Функция языка запросов УНИКАЛЬНЫЙИДЕНТИФИКАТОР() позволяет получить значение идентификатора, но это будет не строка, а специальный тип данных 1С. Тем не менее, использование этой функции в запросе является правильным подходом для извлечения данных.

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


ВЫБРАТЬ
	СправочникНоменклатура.Ссылка КАК Номенклатура,
	СправочникНоменклатура.Наименование КАК НаименованиеНоменклатуры,
	УНИКАЛЬНЫЙИДЕНТИФИКАТОР(СправочникНоменклатура.Ссылка) КАК GUIDНоменклатуры,
	СпецификацииНоменклатуры.Ссылка КАК Спецификация,
	СпецификацииНоменклатуры.Наименование КАК НаименованиеСпецификации,
	УНИКАЛЬНЫЙИДЕНТИФИКАТОР(СпецификацииНоменклатуры.Ссылка) КАК GUIDСпецификации
ИЗ
	Справочник.Номенклатура КАК СправочникНоменклатура
		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.СпецификацииНоменклатуры КАК СпецификацииНоменклатуры
		ПО СпецификацииНоменклатуры.Владелец = СправочникНоменклатура.Ссылка
ГДЕ
	СправочникНоменклатура.Родитель.Наименование = &НаименованиеГруппы

Важное замечание: Отбор по наименованию родителя (Родитель.Наименование = "...") является ненадежным, так как название группы может измениться. В реальных задачах лучше использовать параметры и передавать ссылку на группу или использовать оператор В ИЕРАРХИИ.

Этап 2: Обработка результатов и преобразование типов

После выполнения запроса мы получаем выборку. Однако поля GUIDНоменклатуры и GUIDСпецификации имеют тип УникальныйИдентификатор. Для вывода в табличное поле на форме или для выгрузки в JSON (например, когда вы строите BackEnd на 1С для мобильного приложения), нам нужно преобразовать их в строку.

Разберем процедуру заполнения таблицы на сервере. Для универсальности рекомендуется использовать метод XMLСтрока(), так как он возвращает стандартизированный формат GUID, пригодный для обмена данными. Чтобы сделать обмен данными более гибким, можно применить модуль с универсальными процедурами HTTP-сервиса, который значительно ускоряет разработку API.


&НаСервере
Процедура СформироватьОтчетНаСервере()
	
	Запрос = Новый Запрос;
	Запрос.Текст = "... текст запроса выше ...";
	Запрос.УстановитьПараметр("НаименованиеГруппы", "Насосные части (запас)");
	
	РезультатЗапроса = Запрос.Выполнить();
	Выборка = РезультатЗапроса.Выбрать();
	
	// Очищаем таблицу значений на форме (реквизит формы)
	Объект.ТаблицаРезультатов.Очистить();
	
	Пока Выборка.Следующий() Цикл
		НоваяСтрока = Объект.ТаблицаРезультатов.Добавить();
		
		// Заполняем простые поля (Наименования)
		ЗаполнитьЗначенияСвойств(НоваяСтрока, Выборка);
		
		// Явное преобразование GUID в строку
		НоваяСтрока.GUIDНоменклатуры = XMLСтрока(Выборка.GUIDНоменклатуры);
		
		Если ЗначениеЗаполнено(Выборка.Спецификация) Тогда
			НоваяСтрока.GUIDСпецификации = XMLСтрока(Выборка.GUIDСпецификации);
		Иначе
			НоваяСтрока.GUIDСпецификации = "";
		КонецЕсли;
		
	КонецЦикла;
	
КонецПроцедуры

Использование ЗаполнитьЗначенияСвойств позволяет сократить код, если имена колонок в запросе совпадают с именами колонок в таблице значений на форме.

Этап 3: Настройка управляемой формы

Одной из самых частых проблем при переходе к управляемым формам является непонимание того, как разместить элементы управления (кнопки) на форме. В отличие от обычных форм, здесь нельзя просто "нарисовать" кнопку в любом месте.

Разберем по шагам алгоритм создания кнопки, запускающей наш код:

  1. Создание команды. Перейдите на вкладку "Команды" в редакторе формы (справа вверху). Добавьте новую команду, назовите её, например, Сформировать.
  2. Назначение действия. В свойствах команды найдите поле "Действие" и нажмите на лупу. Создастся процедура &НаКлиенте. Из неё мы будем вызывать нашу серверную процедуру СформироватьОтчетНаСервере().
  3. Размещение на форме. Это критический шаг. Просто создания команды недостаточно. Необходимо "перетащить" созданную команду из списка команд (справа) в дерево элементов формы (слева или по центру). Только после этого кнопка появится в интерфейсе пользователя.

Пример кода клиентской части:


&НаКлиенте
Процедура Сформировать(Команда)
	СформироватьОтчетНаСервере();
КонецПроцедуры

Зачем это нужно: интеграция через OData

Полученные GUID необходимы для работы с REST-интерфейсом OData, который предоставляет платформа 1С. Когда мы читаем данные из 1С во внешнюю систему, ссылки приходят в виде GUID. Однако, если мы хотим создать документ в 1С извне, нам нужно передать ссылки на существующие справочники именно в виде их уникальных идентификаторов. Подобные принципы используются и когда настраивается сложная интеграция с облачными сервисами через API.

Посмотрим на структуру JSON, которую ожидает 1С при создании документа (например, "Производство" или "СборкаЗапасов"). Ссылочные поля должны иметь суффикс _Key:


{
  "Date": "2023-10-27T00:00:00",
  "Organization_Key": "69cdc12f-b1fe-11ed-b72f-00155d59fc13",
  "Продукция": [
    {
      "LineNumber": "1",
      "Номенклатура_Key": "5b4c41fe-f9a7-11ef-b74e-00155d59fc19", 
      "Quantity": 10,
      "Спецификация_Key": "5b4c41ff-f9a7-11ef-b74e-00155d59fc19"
    }
  ]
}

Как мы видим, поля Номенклатура_Key и Спецификация_Key требуют именно тех значений, которые мы получили в нашей обработке. Без точного знания этих GUID создание документа программным способом через HTTP-запросы будет невозможно.

Заключение

Мы рассмотрели процесс создания инструмента для извлечения технических данных из 1С. Главные моменты, которые стоит запомнить:

Этот подход позволяет подготовить данные для любых интеграционных задач, будь то обмен через OData, веб-сервисы или прямые SQL-запросы.

← На главную